diff options
-rw-r--r-- | lib/dpif-netdev.c | 114 |
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); |