summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dpif-netdev.c114
1 files changed, 68 insertions, 46 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index b3535d293..03f460c7d 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2711,6 +2711,71 @@ queue_netdev_flow_del(struct dp_netdev_pmd_thread *pmd,
}
static void
+log_netdev_flow_change(const struct dp_netdev_flow *flow,
+ const struct match *match,
+ const struct dp_netdev_actions *old_actions,
+ const struct nlattr *actions,
+ size_t actions_len)
+{
+ struct ds ds = DS_EMPTY_INITIALIZER;
+ struct ofpbuf key_buf, mask_buf;
+ struct odp_flow_key_parms odp_parms = {
+ .flow = &match->flow,
+ .mask = &match->wc.masks,
+ .support = dp_netdev_support,
+ };
+
+ if (OVS_LIKELY(VLOG_DROP_DBG((&upcall_rl)))) {
+ return;
+ }
+
+ ofpbuf_init(&key_buf, 0);
+ ofpbuf_init(&mask_buf, 0);
+
+ odp_flow_key_from_flow(&odp_parms, &key_buf);
+ odp_parms.key_buf = &key_buf;
+ odp_flow_key_from_mask(&odp_parms, &mask_buf);
+
+ if (old_actions) {
+ ds_put_cstr(&ds, "flow_mod: ");
+ } else {
+ ds_put_cstr(&ds, "flow_add: ");
+ }
+ odp_format_ufid(&flow->ufid, &ds);
+ ds_put_cstr(&ds, " mega_");
+ odp_format_ufid(&flow->mega_ufid, &ds);
+ ds_put_cstr(&ds, " ");
+ odp_flow_format(key_buf.data, key_buf.size,
+ mask_buf.data, mask_buf.size,
+ NULL, &ds, false);
+ if (old_actions) {
+ ds_put_cstr(&ds, ", old_actions:");
+ format_odp_actions(&ds, old_actions->actions, old_actions->size,
+ NULL);
+ }
+ ds_put_cstr(&ds, ", actions:");
+ format_odp_actions(&ds, actions, actions_len, NULL);
+
+ VLOG_DBG("%s", ds_cstr(&ds));
+
+ ofpbuf_uninit(&key_buf);
+ ofpbuf_uninit(&mask_buf);
+
+ /* Add a printout of the actual match installed. */
+ struct match m;
+ ds_clear(&ds);
+ ds_put_cstr(&ds, "flow match: ");
+ miniflow_expand(&flow->cr.flow.mf, &m.flow);
+ miniflow_expand(&flow->cr.mask->mf, &m.wc.masks);
+ memset(&m.tun_md, 0, sizeof m.tun_md);
+ match_format(&m, NULL, &ds, OFP_DEFAULT_PRIORITY);
+
+ VLOG_DBG("%s", ds_cstr(&ds));
+
+ ds_destroy(&ds);
+}
+
+static void
queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd,
struct dp_netdev_flow *flow, struct match *match,
const struct nlattr *actions, size_t actions_len,
@@ -3579,52 +3644,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
queue_netdev_flow_put(pmd, flow, match, actions, actions_len,
orig_in_port, DP_NETDEV_FLOW_OFFLOAD_OP_ADD);
-
- if (OVS_UNLIKELY(!VLOG_DROP_DBG((&upcall_rl)))) {
- struct ds ds = DS_EMPTY_INITIALIZER;
- struct ofpbuf key_buf, mask_buf;
- struct odp_flow_key_parms odp_parms = {
- .flow = &match->flow,
- .mask = &match->wc.masks,
- .support = dp_netdev_support,
- };
-
- ofpbuf_init(&key_buf, 0);
- ofpbuf_init(&mask_buf, 0);
-
- odp_flow_key_from_flow(&odp_parms, &key_buf);
- odp_parms.key_buf = &key_buf;
- odp_flow_key_from_mask(&odp_parms, &mask_buf);
-
- ds_put_cstr(&ds, "flow_add: ");
- odp_format_ufid(ufid, &ds);
- ds_put_cstr(&ds, " mega_");
- odp_format_ufid(&flow->mega_ufid, &ds);
- ds_put_cstr(&ds, " ");
- odp_flow_format(key_buf.data, key_buf.size,
- mask_buf.data, mask_buf.size,
- NULL, &ds, false);
- ds_put_cstr(&ds, ", actions:");
- format_odp_actions(&ds, actions, actions_len, NULL);
-
- VLOG_DBG("%s", ds_cstr(&ds));
-
- ofpbuf_uninit(&key_buf);
- ofpbuf_uninit(&mask_buf);
-
- /* Add a printout of the actual match installed. */
- struct match m;
- ds_clear(&ds);
- ds_put_cstr(&ds, "flow match: ");
- miniflow_expand(&flow->cr.flow.mf, &m.flow);
- miniflow_expand(&flow->cr.mask->mf, &m.wc.masks);
- memset(&m.tun_md, 0, sizeof m.tun_md);
- match_format(&m, NULL, &ds, OFP_DEFAULT_PRIORITY);
-
- VLOG_DBG("%s", ds_cstr(&ds));
-
- ds_destroy(&ds);
- }
+ log_netdev_flow_change(flow, match, NULL, actions, actions_len);
return flow;
}
@@ -3667,6 +3687,8 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
queue_netdev_flow_put(pmd, netdev_flow, match,
put->actions, put->actions_len, ODPP_NONE,
DP_NETDEV_FLOW_OFFLOAD_OP_MOD);
+ log_netdev_flow_change(netdev_flow, match, old_actions,
+ put->actions, put->actions_len);
if (stats) {
get_dpif_flow_status(pmd->dp, netdev_flow, stats, NULL);