From 66525ef3b8d604e47ca0bd1a7510b1ae9f3eb5ba Mon Sep 17 00:00:00 2001 From: Pravin B Shelar Date: Tue, 17 May 2016 17:33:44 -0700 Subject: [PATCH] dpif-netdev: Refactor userspace action Large segment support need to use this refactored function to send individual segments. Signed-off-by: Pravin B Shelar Acked-by: Jesse Gross --- lib/dpif-netdev.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 05cd40172..2677ceabe 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3715,6 +3715,30 @@ error: return err; } +static void +dp_execute_userspace_action(struct dp_netdev_pmd_thread *pmd, + struct dp_packet *packet, bool may_steal, + struct flow *flow, ovs_u128 *ufid, + struct ofpbuf *actions, + const struct nlattr *userdata) +{ + struct dp_packet_batch b; + int error; + + ofpbuf_clear(actions); + + error = dp_netdev_upcall(pmd, packet, flow, NULL, ufid, + DPIF_UC_ACTION, userdata, actions, + NULL); + if (!error || error == ENOSPC) { + packet_batch_init_packet(&b, packet); + dp_netdev_execute_actions(pmd, &b, may_steal, + actions->data, actions->size); + } else if (may_steal) { + dp_packet_delete(packet); + } +} + static void dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, const struct nlattr *a, bool may_steal) @@ -3804,23 +3828,10 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, ofpbuf_init(&actions, 0); for (i = 0; i < packets_->count; i++) { - int error; - struct dp_packet_batch b; - - ofpbuf_clear(&actions); - flow_extract(packets[i], &flow); dpif_flow_hash(dp->dpif, &flow, sizeof flow, &ufid); - error = dp_netdev_upcall(pmd, packets[i], &flow, NULL, &ufid, - DPIF_UC_ACTION, userdata,&actions, - NULL); - if (!error || error == ENOSPC) { - packet_batch_init_packet(&b, packets[i]); - dp_netdev_execute_actions(pmd, &b, may_steal, - actions.data, actions.size); - } else if (may_steal) { - dp_packet_delete(packets[i]); - } + dp_execute_userspace_action(pmd, packets[i], may_steal, &flow, + &ufid, &actions, userdata); } ofpbuf_uninit(&actions); fat_rwlock_unlock(&dp->upcall_rwlock);