Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com> --- lib/dpif-netdev.c | 13 ++++++++--- lib/dpif.c | 12 ++++++---- lib/odp-execute.c | 54 ++++++++++++++++++++++++++++++-------------- lib/odp-execute.h | 8 +++---- ofproto/ofproto-dpif-xlate.c | 3 ++- 5 files changed, 61 insertions(+), 29 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index d50452f..43bfc20 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2108,8 +2108,8 @@ struct dp_netdev_execute_aux { }; static void -dp_execute_cb(void *aux_, struct ofpbuf *packet, - struct pkt_metadata *md, +dp_execute_cb(void *aux_, struct ofpbuf **packets, int c, + struct pkt_metadata **pmd, const struct nlattr *a, bool may_steal) OVS_NO_THREAD_SAFETY_ANALYSIS { @@ -2117,6 +2117,13 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet, int type = nl_attr_type(a); struct dp_netdev_port *p; uint32_t *depth = recirc_depth_get(); + struct ofpbuf * packet; + struct pkt_metadata * md; + + ovs_assert(c==1); + + packet = packets[0]; + md = pmd[0]; switch ((enum ovs_action_attr)type) { case OVS_ACTION_ATTR_OUTPUT: @@ -2203,7 +2210,7 @@ dp_netdev_execute_actions(struct dp_netdev *dp, const struct miniflow *key, { struct dp_netdev_execute_aux aux = {dp, key}; - odp_execute_actions(&aux, packet, may_steal, md, + odp_execute_actions(&aux, &packet, 1, may_steal, &md, actions, actions_len, dp_execute_cb); } diff --git a/lib/dpif.c b/lib/dpif.c index 84dba28..517e33a 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -1058,13 +1058,16 @@ struct dpif_execute_helper_aux { /* This is called for actions that need the context of the datapath to be * meaningful. */ static void -dpif_execute_helper_cb(void *aux_, struct ofpbuf *packet, - struct pkt_metadata *md, +dpif_execute_helper_cb(void *aux_, struct ofpbuf **packets, int c, + struct pkt_metadata **md, const struct nlattr *action, bool may_steal OVS_UNUSED) { struct dpif_execute_helper_aux *aux = aux_; struct dpif_execute execute; int type = nl_attr_type(action); + struct ofpbuf * packet = packets[0]; + + ovs_assert(c == 1); switch ((enum ovs_action_attr)type) { case OVS_ACTION_ATTR_OUTPUT: @@ -1072,7 +1075,7 @@ dpif_execute_helper_cb(void *aux_, struct ofpbuf *packet, execute.actions = action; execute.actions_len = NLA_ALIGN(action->nla_len); execute.packet = packet; - execute.md = *md; + execute.md = **md; execute.needs_help = false; aux->error = aux->dpif->dpif_class->execute(aux->dpif, &execute); break; @@ -1100,10 +1103,11 @@ static int dpif_execute_with_help(struct dpif *dpif, struct dpif_execute *execute) { struct dpif_execute_helper_aux aux = {dpif, 0}; + struct pkt_metadata * md = &execute->md; COVERAGE_INC(dpif_execute_with_help); - odp_execute_actions(&aux, execute->packet, false, &execute->md, + odp_execute_actions(&aux, &execute->packet, 1, false, &md, execute->actions, execute->actions_len, dpif_execute_helper_cb); return aux.error; diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 12ad679..8463832 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -151,8 +151,8 @@ odp_execute_set_action(struct ofpbuf *packet, const struct nlattr *a, } static void -odp_execute_actions__(void *dp, struct ofpbuf *packet, bool steal, - struct pkt_metadata *, +odp_execute_actions__(void *dp, struct ofpbuf **packets, int c, bool steal, + struct pkt_metadata **, const struct nlattr *actions, size_t actions_len, odp_execute_cb dp_execute_action, bool more_actions); @@ -186,20 +186,22 @@ odp_execute_sample(void *dp, struct ofpbuf *packet, bool steal, } } - odp_execute_actions__(dp, packet, steal, md, nl_attr_get(subactions), + odp_execute_actions__(dp, &packet, 1, steal, &md, nl_attr_get(subactions), nl_attr_get_size(subactions), dp_execute_action, more_actions); } static void -odp_execute_actions__(void *dp, struct ofpbuf *packet, bool steal, - struct pkt_metadata *md, +odp_execute_actions__(void *dp, struct ofpbuf **packets, int c, bool steal, + struct pkt_metadata **md, const struct nlattr *actions, size_t actions_len, odp_execute_cb dp_execute_action, bool more_actions) { const struct nlattr *a; unsigned int left; + int i; + NL_ATTR_FOR_EACH_UNSAFE (a, left, actions, actions_len) { int type = nl_attr_type(a); @@ -215,37 +217,51 @@ odp_execute_actions__(void *dp, struct ofpbuf *packet, bool steal, bool may_steal = steal && (!more_actions && left <= NLA_ALIGN(a->nla_len) && type != OVS_ACTION_ATTR_RECIRC); - dp_execute_action(dp, packet, md, a, may_steal); + dp_execute_action(dp, packets, c, md, a, may_steal); } break; case OVS_ACTION_ATTR_PUSH_VLAN: { const struct ovs_action_push_vlan *vlan = nl_attr_get(a); - eth_push_vlan(packet, htons(ETH_TYPE_VLAN), vlan->vlan_tci); + + for (i = 0; i < c; i++) { + eth_push_vlan(packets[i], htons(ETH_TYPE_VLAN), vlan->vlan_tci); + } break; } case OVS_ACTION_ATTR_POP_VLAN: - eth_pop_vlan(packet); + for (i = 0; i < c; i++) { + eth_pop_vlan(packets[i]); + } break; case OVS_ACTION_ATTR_PUSH_MPLS: { const struct ovs_action_push_mpls *mpls = nl_attr_get(a); - push_mpls(packet, mpls->mpls_ethertype, mpls->mpls_lse); + for (i = 0; i < c; i++) { + push_mpls(packets[i], mpls->mpls_ethertype, mpls->mpls_lse); + } break; } case OVS_ACTION_ATTR_POP_MPLS: - pop_mpls(packet, nl_attr_get_be16(a)); + for (i = 0; i < c; i++) { + pop_mpls(packets[i], nl_attr_get_be16(a)); + } break; case OVS_ACTION_ATTR_SET: - odp_execute_set_action(packet, nl_attr_get(a), md); + for (i = 0; i < c; i++) { + odp_execute_set_action(packets[i], nl_attr_get(a), md[i]); + } break; case OVS_ACTION_ATTR_SAMPLE: - odp_execute_sample(dp, packet, steal, md, a, dp_execute_action, - more_actions || left > NLA_ALIGN(a->nla_len)); + for (i = 0; i < c; i++) { + odp_execute_sample(dp, packets[i], steal, md[i], a, + dp_execute_action, + more_actions || left > NLA_ALIGN(a->nla_len)); + } break; case OVS_ACTION_ATTR_UNSPEC: @@ -256,16 +272,20 @@ odp_execute_actions__(void *dp, struct ofpbuf *packet, bool steal, } void -odp_execute_actions(void *dp, struct ofpbuf *packet, bool steal, - struct pkt_metadata *md, +odp_execute_actions(void *dp, struct ofpbuf **packets, int c, bool steal, + struct pkt_metadata **md, const struct nlattr *actions, size_t actions_len, odp_execute_cb dp_execute_action) { - odp_execute_actions__(dp, packet, steal, md, actions, actions_len, + odp_execute_actions__(dp, packets, c, steal, md, actions, actions_len, dp_execute_action, false); if (!actions_len && steal) { /* Drop action. */ - ofpbuf_delete(packet); + int i = 0; + + for (i = 0; i < c; i++) { + ofpbuf_delete(packets[i]); + } } } diff --git a/lib/odp-execute.h b/lib/odp-execute.h index 91f0c51..c5378a1 100644 --- a/lib/odp-execute.h +++ b/lib/odp-execute.h @@ -27,16 +27,16 @@ struct nlattr; struct ofpbuf; struct pkt_metadata; -typedef void (*odp_execute_cb)(void *dp, struct ofpbuf *packet, - struct pkt_metadata *, +typedef void (*odp_execute_cb)(void *dp, struct ofpbuf **packets, int c, + struct pkt_metadata **, const struct nlattr *action, bool may_steal); /* Actions that need to be executed in the context of a datapath are handed * to 'dp_execute_action', if non-NULL. Currently this is called only for * actions OVS_ACTION_ATTR_OUTPUT and OVS_ACTION_ATTR_USERSPACE so * 'dp_execute_action' needs to handle only these. */ -void odp_execute_actions(void *dp, struct ofpbuf *packet, bool steal, - struct pkt_metadata *, +void odp_execute_actions(void *dp, struct ofpbuf **packets, int c, bool steal, + struct pkt_metadata **, const struct nlattr *actions, size_t actions_len, odp_execute_cb dp_execute_action); #endif diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 022c4c7..d315680 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -2331,6 +2331,7 @@ execute_controller_action(struct xlate_ctx *ctx, int len, struct ofproto_packet_in *pin; struct ofpbuf *packet; struct pkt_metadata md = PKT_METADATA_INITIALIZER(0); + struct pkt_metadata *pmd = &md; ctx->xout->slow |= SLOW_CONTROLLER; if (!ctx->xin->packet) { @@ -2343,7 +2344,7 @@ execute_controller_action(struct xlate_ctx *ctx, int len, &ctx->xout->odp_actions, &ctx->xout->wc); - odp_execute_actions(NULL, packet, false, &md, + odp_execute_actions(NULL, &packet, 1, false, &pmd, ofpbuf_data(&ctx->xout->odp_actions), ofpbuf_size(&ctx->xout->odp_actions), NULL); -- 2.0.0.rc0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev