diff options
-rw-r--r-- | lib/dpif-netlink.c | 1 | ||||
-rw-r--r-- | lib/dpif.c | 1 | ||||
-rw-r--r-- | lib/dpif.h | 7 | ||||
-rw-r--r-- | lib/netdev-offload-dpdk.c | 1 | ||||
-rw-r--r-- | lib/netdev-offload-tc.c | 1 | ||||
-rw-r--r-- | ofproto/ofproto-dpif-upcall.c | 3 |
6 files changed, 11 insertions, 3 deletions
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index d865c0bdb..5b5c96d72 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -1590,6 +1590,7 @@ dpif_netlink_flow_to_dpif_flow(struct dpif_flow *dpif_flow, dpif_netlink_flow_get_stats(datapath_flow, &dpif_flow->stats); dpif_flow->attrs.offloaded = false; dpif_flow->attrs.dp_layer = "ovs"; + dpif_flow->attrs.dp_extra_info = NULL; } /* The design is such that all threads are working together on the first dump diff --git a/lib/dpif.c b/lib/dpif.c index 9d9c716c1..6cbcdfb2e 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -966,6 +966,7 @@ dpif_probe_feature(struct dpif *dpif, const char *name, && ovs_u128_equals(*ufid, flow.ufid)))) { enable_feature = true; } + free(flow.attrs.dp_extra_info); error = dpif_flow_del(dpif, key->data, key->size, ufid, NON_PMD_CORE_ID, NULL); diff --git a/lib/dpif.h b/lib/dpif.h index 59d82dce3..286a0e2d5 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -741,11 +741,12 @@ struct dpif_execute { * 'buffer' must point to an initialized buffer, with a recommended size of * DPIF_FLOW_BUFSIZE bytes. * - * On success, 'flow' will be populated with the mask, actions and stats for - * the datapath flow corresponding to 'key'. The mask and actions may point + * On success, 'flow' will be populated with the mask, actions, stats and attrs + * for the datapath flow corresponding to 'key'. The mask and actions may point * within '*buffer', or may point at RCU-protected data. Therefore, callers * that wish to hold these over quiescent periods must make a copy of these - * fields before quiescing. + * fields before quiescing. 'attrs.dp_extra_info' is a dynamically allocated + * string that should be freed if provided by the datapath. * * Callers should always provide 'key' to improve dpif logging in the event of * errors or unexpected behaviour. diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 1ae8230fa..f8c46bbaa 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1272,6 +1272,7 @@ netdev_offload_dpdk_flow_get(struct netdev *netdev, } memcpy(stats, &rte_flow_data->stats, sizeof *stats); out: + attrs->dp_extra_info = NULL; return ret; } diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index 4988dadc3..723ec376d 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -873,6 +873,7 @@ parse_tc_flower_to_match(struct tc_flower *flower, attrs->offloaded = (flower->offloaded_state == TC_OFFLOADED_STATE_IN_HW) || (flower->offloaded_state == TC_OFFLOADED_STATE_UNDEFINED); attrs->dp_layer = "tc"; + attrs->dp_extra_info = NULL; return 0; } diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 409286ab1..3aef9a6c3 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -2646,6 +2646,9 @@ revalidate(struct revalidator *revalidator) bool already_dumped; int error; + /* We don't need an extra information. */ + free(f->attrs.dp_extra_info); + if (ukey_acquire(udpif, f, &ukey, &error)) { if (error == EBUSY) { /* Another thread is processing this flow, so don't bother |