X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdpif-linux.c;h=f7f529266821786d104c550987a150c9fdc269c8;hb=90b4feffb9a9031775b949090db6c1c3f963779a;hp=f64e55b0d33732a2c7293036ed4f282b54f8f3b1;hpb=877c9270fb28ae61b0de4b3dba74ef33adc4d7be;p=sliver-openvswitch.git diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index f64e55b0d..f7f529266 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -25,8 +25,6 @@ #include #include #include -#include -#include #include #include #include @@ -73,6 +71,7 @@ struct dpif_linux_dp { /* Attributes. */ const char *name; /* OVS_DP_ATTR_NAME. */ const uint32_t *upcall_pid; /* OVS_DP_ATTR_UPCALL_PID. */ + uint32_t user_features; /* OVS_DP_ATTR_USER_FEATURES */ struct ovs_dp_stats stats; /* OVS_DP_ATTR_STATS. */ struct ovs_dp_megaflow_stats megaflow_stats; /* OVS_DP_ATTR_MEGAFLOW_STATS.*/ @@ -231,9 +230,11 @@ dpif_linux_open(const struct dpif_class *class OVS_UNUSED, const char *name, upcall_pid = 0; dp_request.upcall_pid = &upcall_pid; } else { - dp_request.cmd = OVS_DP_CMD_GET; + /* Use OVS_DP_CMD_SET to report user features */ + dp_request.cmd = OVS_DP_CMD_SET; } dp_request.name = name; + dp_request.user_features |= OVS_DP_F_UNALIGNED; error = dpif_linux_dp_transact(&dp_request, &dp, &buf); if (error) { return error; @@ -670,12 +671,6 @@ dpif_linux_port_query_by_name(const struct dpif *dpif, const char *devname, return dpif_linux_port_query__(dpif, 0, devname, dpif_port); } -static uint32_t -dpif_linux_get_max_ports(const struct dpif *dpif OVS_UNUSED) -{ - return MAX_PORTS; -} - static uint32_t dpif_linux_port_get_pid(const struct dpif *dpif_, odp_port_t port_no) { @@ -1017,7 +1012,7 @@ dpif_linux_flow_dump_start(const struct dpif *dpif_, void **statep) } static int -dpif_linux_flow_dump_next(const struct dpif *dpif_ OVS_UNUSED, void *state_, +dpif_linux_flow_dump_next(const struct dpif *dpif_, void *state_, const struct nlattr **key, size_t *key_len, const struct nlattr **mask, size_t *mask_len, const struct nlattr **actions, size_t *actions_len, @@ -1087,10 +1082,11 @@ dpif_linux_encode_execute(int dp_ifindex, const struct dpif_execute *d_exec, struct ofpbuf *buf) { struct ovs_header *k_exec; + size_t key_ofs; ofpbuf_prealloc_tailroom(buf, (64 + d_exec->packet->size - + d_exec->key_len + + ODP_KEY_METADATA_SIZE + d_exec->actions_len)); nl_msg_put_genlmsghdr(buf, 0, ovs_packet_family, NLM_F_REQUEST, @@ -1101,7 +1097,11 @@ dpif_linux_encode_execute(int dp_ifindex, const struct dpif_execute *d_exec, nl_msg_put_unspec(buf, OVS_PACKET_ATTR_PACKET, d_exec->packet->data, d_exec->packet->size); - nl_msg_put_unspec(buf, OVS_PACKET_ATTR_KEY, d_exec->key, d_exec->key_len); + + key_ofs = nl_msg_start_nested(buf, OVS_PACKET_ATTR_KEY); + odp_key_from_pkt_metadata(buf, &d_exec->md); + nl_msg_end_nested(buf, key_ofs); + nl_msg_put_unspec(buf, OVS_PACKET_ATTR_ACTIONS, d_exec->actions, d_exec->actions_len); } @@ -1122,7 +1122,7 @@ dpif_linux_execute__(int dp_ifindex, const struct dpif_execute *execute) } static int -dpif_linux_execute(struct dpif *dpif_, const struct dpif_execute *execute) +dpif_linux_execute(struct dpif *dpif_, struct dpif_execute *execute) { const struct dpif_linux *dpif = dpif_linux_cast(dpif_); @@ -1612,7 +1612,6 @@ const struct dpif_class dpif_linux_class = { dpif_linux_port_del, dpif_linux_port_query_by_number, dpif_linux_port_query_by_name, - dpif_linux_get_max_ports, dpif_linux_port_get_pid, dpif_linux_port_dump_start, dpif_linux_port_dump_next, @@ -1931,6 +1930,10 @@ dpif_linux_dp_to_ofpbuf(const struct dpif_linux_dp *dp, struct ofpbuf *buf) nl_msg_put_u32(buf, OVS_DP_ATTR_UPCALL_PID, *dp->upcall_pid); } + if (dp->user_features) { + nl_msg_put_u32(buf, OVS_DP_ATTR_USER_FEATURES, dp->user_features); + } + /* Skip OVS_DP_ATTR_STATS since we never have a reason to serialize it. */ }