projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ofp-util: Correct comment above ofputil_append_port_stat()
[openvswitch]
/
lib
/
dpif-linux.c
diff --git
a/lib/dpif-linux.c
b/lib/dpif-linux.c
index 62f69174406812db7e40810b555052825dab1102..3a4a4e6d2fdcb88a4efe00d7d1505ea2b4f14720 100644
(file)
--- a/
lib/dpif-linux.c
+++ b/
lib/dpif-linux.c
@@
-424,11
+424,13
@@
dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
netdev_linux_ethtool_set_flag(netdev, ETH_FLAG_LRO, "LRO", false);
}
netdev_linux_ethtool_set_flag(netdev, ETH_FLAG_LRO, "LRO", false);
}
- /* Loop until we find a port that isn't used. */
+ /* Unless a specific port was requested, loop until we find a port
+ * that isn't used. */
do {
uint32_t upcall_pid;
do {
uint32_t upcall_pid;
- request.port_no = ++dpif->alloc_port_no;
+ request.port_no = *port_nop != UINT16_MAX ? *port_nop
+ : ++dpif->alloc_port_no;
upcall_pid = dpif_linux_port_get_pid(dpif_, request.port_no);
request.upcall_pid = &upcall_pid;
error = dpif_linux_vport_transact(&request, &reply, &buf);
upcall_pid = dpif_linux_port_get_pid(dpif_, request.port_no);
request.upcall_pid = &upcall_pid;
error = dpif_linux_vport_transact(&request, &reply, &buf);
@@
-441,10
+443,13
@@
dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
/* Older datapath has lower limit. */
max_ports = dpif->alloc_port_no;
dpif->alloc_port_no = 0;
/* Older datapath has lower limit. */
max_ports = dpif->alloc_port_no;
dpif->alloc_port_no = 0;
+ } else if (error == EBUSY && *port_nop != UINT16_MAX) {
+ VLOG_INFO("%s: requested port %"PRIu16" is in use",
+ dpif_name(dpif_), *port_nop);
}
ofpbuf_delete(buf);
}
ofpbuf_delete(buf);
- } while ((i++ < max_ports)
+ } while ((
*port_nop == UINT16_MAX) && (
i++ < max_ports)
&& (error == EBUSY || error == EFBIG));
return error;
&& (error == EBUSY || error == EFBIG));
return error;
@@
-590,8
+595,8
@@
dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
return error;
}
return error;
}
- dpif_port->name =
(char *) vport.name
;
- dpif_port->type =
(char *) netdev_vport_get_netdev_type(&vport
);
+ dpif_port->name =
CONST_CAST(char *, vport.name)
;
+ dpif_port->type =
CONST_CAST(char *, netdev_vport_get_netdev_type(&vport)
);
dpif_port->port_no = vport.port_no;
return 0;
}
dpif_port->port_no = vport.port_no;
return 0;
}
@@
-663,7
+668,7
@@
dpif_linux_flow_get(const struct dpif *dpif_,
dpif_linux_flow_get_stats(&reply, stats);
}
if (actionsp) {
dpif_linux_flow_get_stats(&reply, stats);
}
if (actionsp) {
- buf->data =
(void *) reply.actions
;
+ buf->data =
CONST_CAST(struct nlattr *, reply.actions)
;
buf->size = reply.actions_len;
*actionsp = buf;
} else {
buf->size = reply.actions_len;
*actionsp = buf;
} else {
@@
-968,24
+973,38
@@
dpif_linux_operate__(struct dpif *dpif_, struct dpif_op **ops, size_t n_ops)
switch (op->type) {
case DPIF_OP_FLOW_PUT:
put = &op->u.flow_put;
switch (op->type) {
case DPIF_OP_FLOW_PUT:
put = &op->u.flow_put;
- if (!op->error && put->stats) {
- struct dpif_linux_flow reply;
-
- op->error = dpif_linux_flow_from_ofpbuf(&reply, txn->reply);
+ if (put->stats) {
if (!op->error) {
if (!op->error) {
- dpif_linux_flow_get_stats(&reply, put->stats);
+ struct dpif_linux_flow reply;
+
+ op->error = dpif_linux_flow_from_ofpbuf(&reply,
+ txn->reply);
+ if (!op->error) {
+ dpif_linux_flow_get_stats(&reply, put->stats);
+ }
+ }
+
+ if (op->error) {
+ memset(put->stats, 0, sizeof *put->stats);
}
}
break;
case DPIF_OP_FLOW_DEL:
del = &op->u.flow_del;
}
}
break;
case DPIF_OP_FLOW_DEL:
del = &op->u.flow_del;
- if (!op->error && del->stats) {
- struct dpif_linux_flow reply;
-
- op->error = dpif_linux_flow_from_ofpbuf(&reply, txn->reply);
+ if (del->stats) {
if (!op->error) {
if (!op->error) {
- dpif_linux_flow_get_stats(&reply, del->stats);
+ struct dpif_linux_flow reply;
+
+ op->error = dpif_linux_flow_from_ofpbuf(&reply,
+ txn->reply);
+ if (!op->error) {
+ dpif_linux_flow_get_stats(&reply, del->stats);
+ }
+ }
+
+ if (op->error) {
+ memset(del->stats, 0, sizeof *del->stats);
}
}
break;
}
}
break;
@@
-1150,9
+1169,11
@@
parse_odp_packet(struct ofpbuf *buf, struct dpif_upcall *upcall,
memset(upcall, 0, sizeof *upcall);
upcall->type = type;
upcall->packet = buf;
memset(upcall, 0, sizeof *upcall);
upcall->type = type;
upcall->packet = buf;
- upcall->packet->data = (void *) nl_attr_get(a[OVS_PACKET_ATTR_PACKET]);
+ upcall->packet->data = CONST_CAST(struct nlattr *,
+ nl_attr_get(a[OVS_PACKET_ATTR_PACKET]));
upcall->packet->size = nl_attr_get_size(a[OVS_PACKET_ATTR_PACKET]);
upcall->packet->size = nl_attr_get_size(a[OVS_PACKET_ATTR_PACKET]);
- upcall->key = (void *) nl_attr_get(a[OVS_PACKET_ATTR_KEY]);
+ upcall->key = CONST_CAST(struct nlattr *,
+ nl_attr_get(a[OVS_PACKET_ATTR_KEY]));
upcall->key_len = nl_attr_get_size(a[OVS_PACKET_ATTR_KEY]);
upcall->userdata = (a[OVS_PACKET_ATTR_USERDATA]
? nl_attr_get_u64(a[OVS_PACKET_ATTR_USERDATA])
upcall->key_len = nl_attr_get_size(a[OVS_PACKET_ATTR_KEY]);
upcall->userdata = (a[OVS_PACKET_ATTR_USERDATA]
? nl_attr_get_u64(a[OVS_PACKET_ATTR_USERDATA])
@@
-1378,7
+1399,7
@@
dpif_linux_vport_send(int dp_ifindex, uint32_t port_no,
uint64_t action;
ofpbuf_use_const(&packet, data, size);
uint64_t action;
ofpbuf_use_const(&packet, data, size);
- flow_extract(&packet, 0,
htonll(0)
, 0, &flow);
+ flow_extract(&packet, 0,
NULL
, 0, &flow);
ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
odp_flow_key_from_flow(&key, &flow);
ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
odp_flow_key_from_flow(&key, &flow);
@@
-1981,7
+2002,7
@@
report_loss(struct dpif *dpif_, struct dpif_channel *ch)
}
ds_chomp(&s, ',');
}
ds_chomp(&s, ',');
- VLOG_
ERR
("%s: lost packet on channel %td%s",
- dpif_name(dpif_), ch - dpif->channels, ds_cstr(&s));
+ VLOG_
WARN
("%s: lost packet on channel %td%s",
+
dpif_name(dpif_), ch - dpif->channels, ds_cstr(&s));
ds_destroy(&s);
}
ds_destroy(&s);
}