X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdpif-linux.c;h=0442f77364bbb793d38dfb86f99fab5951e8918b;hb=99ab7312c17cd4ab603eb6194c50b9f1ef3ca1c9;hp=1b97410e7a5cc4319acd73d5c0f95e42dbc55d6d;hpb=7aaeab4df24b7e9460705b1dad1010eef0354c50;p=sliver-openvswitch.git diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 1b97410e7..0442f7736 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -46,7 +46,6 @@ #include "netlink.h" #include "odp-util.h" #include "ofpbuf.h" -#include "openvswitch/datapath-compat.h" #include "packets.h" #include "poll-loop.h" #include "random.h" @@ -73,8 +72,10 @@ struct dpif_linux_dp { /* Attributes. */ const char *name; /* OVS_DP_ATTR_NAME. */ - const uint32_t *upcall_pid; /* OVS_DP_UPCALL_PID. */ + const uint32_t *upcall_pid; /* OVS_DP_ATTR_UPCALL_PID. */ struct ovs_dp_stats stats; /* OVS_DP_ATTR_STATS. */ + struct ovs_dp_megaflow_stats megaflow_stats; + /* OVS_DP_ATTR_MEGAFLOW_STATS.*/ }; static void dpif_linux_dp_init(struct dpif_linux_dp *); @@ -248,7 +249,7 @@ open_dpif(const struct dpif_linux_dp *dp, struct dpif **dpifp) dpif = xzalloc(sizeof *dpif); dpif->port_notifier = NULL; - ovs_mutex_init(&dpif->upcall_lock, PTHREAD_MUTEX_DEFAULT); + ovs_mutex_init(&dpif->upcall_lock); dpif->epoll_fd = -1; dpif_init(&dpif->dpif, &dpif_linux_class, dp->name, @@ -412,6 +413,8 @@ dpif_linux_get_stats(const struct dpif *dpif_, struct dpif_dp_stats *stats) stats->n_missed = dp.stats.n_missed; stats->n_lost = dp.stats.n_lost; stats->n_flows = dp.stats.n_flows; + stats->n_masks = dp.megaflow_stats.n_masks; + stats->n_mask_hit = dp.megaflow_stats.n_mask_hit; ofpbuf_delete(buf); } return error; @@ -655,10 +658,10 @@ dpif_linux_port_query_by_name(const struct dpif *dpif, const char *devname, return dpif_linux_port_query__(dpif, 0, devname, dpif_port); } -static odp_port_t +static uint32_t dpif_linux_get_max_ports(const struct dpif *dpif OVS_UNUSED) { - return u32_to_odp(MAX_PORTS); + return MAX_PORTS; } static uint32_t @@ -707,7 +710,7 @@ dpif_linux_port_dump_start(const struct dpif *dpif_, void **statep) *statep = state = xmalloc(sizeof *state); dpif_linux_vport_init(&request); - request.cmd = OVS_DP_CMD_GET; + request.cmd = OVS_VPORT_CMD_GET; request.dp_ifindex = dpif->dp_ifindex; buf = ofpbuf_new(1024); @@ -964,7 +967,7 @@ dpif_linux_flow_dump_start(const struct dpif *dpif_, void **statep) *statep = state = xmalloc(sizeof *state); dpif_linux_flow_init(&request); - request.cmd = OVS_DP_CMD_GET; + request.cmd = OVS_FLOW_CMD_GET; request.dp_ifindex = dpif->dp_ifindex; buf = ofpbuf_new(1024); @@ -1566,8 +1569,7 @@ dpif_linux_init(void) } if (!error) { error = nl_lookup_genl_mcgroup(OVS_VPORT_FAMILY, OVS_VPORT_MCGROUP, - &ovs_vport_mcgroup, - OVS_VPORT_MCGROUP_FALLBACK_ID); + &ovs_vport_mcgroup); } ovsthread_once_done(&once); @@ -1772,6 +1774,9 @@ dpif_linux_dp_from_ofpbuf(struct dpif_linux_dp *dp, const struct ofpbuf *buf) [OVS_DP_ATTR_NAME] = { .type = NL_A_STRING, .max_len = IFNAMSIZ }, [OVS_DP_ATTR_STATS] = { NL_POLICY_FOR(struct ovs_dp_stats), .optional = true }, + [OVS_DP_ATTR_MEGAFLOW_STATS] = { + NL_POLICY_FOR(struct ovs_dp_megaflow_stats), + .optional = true }, }; struct nlattr *a[ARRAY_SIZE(ovs_datapath_policy)]; @@ -1803,6 +1808,13 @@ dpif_linux_dp_from_ofpbuf(struct dpif_linux_dp *dp, const struct ofpbuf *buf) sizeof dp->stats); } + if (a[OVS_DP_ATTR_MEGAFLOW_STATS]) { + /* Can't use structure assignment because Netlink doesn't ensure + * sufficient alignment for 64-bit members. */ + memcpy(&dp->megaflow_stats, nl_attr_get(a[OVS_DP_ATTR_MEGAFLOW_STATS]), + sizeof dp->megaflow_stats); + } + return 0; } @@ -1835,6 +1847,8 @@ static void dpif_linux_dp_init(struct dpif_linux_dp *dp) { memset(dp, 0, sizeof *dp); + dp->megaflow_stats.n_masks = UINT32_MAX; + dp->megaflow_stats.n_mask_hit = UINT64_MAX; } static void @@ -1873,11 +1887,11 @@ dpif_linux_dp_transact(const struct dpif_linux_dp *request, ofpbuf_delete(request_buf); if (reply) { + dpif_linux_dp_init(reply); if (!error) { error = dpif_linux_dp_from_ofpbuf(reply, *bufp); } if (error) { - dpif_linux_dp_init(reply); ofpbuf_delete(*bufp); *bufp = NULL; }