Ethan helps push the patches of moving send_packet() to ofproto-dpif-xlate module.
So, this will need some adjustment. thanks, On Tue, Oct 8, 2013 at 3:53 PM, Alex Wang <al...@nicira.com> wrote: > Looks good to me, this is very clear! > > > On Mon, Sep 23, 2013 at 10:49 AM, Ben Pfaff <b...@nicira.com> wrote: > >> Signed-off-by: Ben Pfaff <b...@nicira.com> >> --- >> ofproto/ofproto-dpif.c | 108 >> ++++++++++++++++++------------------------------ >> 1 file changed, 41 insertions(+), 67 deletions(-) >> >> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c >> index 93db491..1c82318 100644 >> --- a/ofproto/ofproto-dpif.c >> +++ b/ofproto/ofproto-dpif.c >> @@ -3956,22 +3956,46 @@ facet_free(struct facet *facet) >> >> /* Executes, within 'ofproto', the 'n_actions' actions in 'actions' on >> * 'packet', which arrived on 'in_port'. */ >> -static bool >> -execute_odp_actions(struct ofproto_dpif *ofproto, const struct flow >> *flow, >> - const struct nlattr *odp_actions, size_t actions_len, >> - struct ofpbuf *packet) >> +static int >> +execute_actions(struct ofproto *ofproto_, const struct flow *flow, >> + struct rule_dpif *rule, >> + const struct ofpact *ofpacts, size_t ofpacts_len, >> + struct ofpbuf *packet) >> { >> + struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); >> struct odputil_keybuf keybuf; >> + struct dpif_flow_stats stats; >> + struct xlate_out xout; >> + struct xlate_in xin; >> + ofp_port_t in_port; >> struct ofpbuf key; >> int error; >> >> + ovs_assert((rule != NULL) != (ofpacts != NULL)); >> + >> + dpif_flow_stats_extract(flow, packet, time_msec(), &stats); >> + if (rule) { >> + rule_dpif_credit_stats(rule, &stats); >> + } >> + >> + xlate_in_init(&xin, ofproto, flow, rule, stats.tcp_flags, packet); >> + xin.ofpacts = ofpacts; >> + xin.ofpacts_len = ofpacts_len; >> + xin.resubmit_stats = &stats; >> + xlate_actions(&xin, &xout); >> + >> ofpbuf_use_stack(&key, &keybuf, sizeof keybuf); >> - odp_flow_key_from_flow(&key, flow, >> - ofp_port_to_odp_port(ofproto, >> flow->in_port.ofp_port)); >> + in_port = flow->in_port.ofp_port; >> + if (in_port == OFPP_NONE) { >> + in_port = OFPP_LOCAL; >> + } >> + odp_flow_key_from_flow(&key, flow, ofp_port_to_odp_port(ofproto, >> in_port)); >> >> error = dpif_execute(ofproto->backer->dpif, key.data, key.size, >> - odp_actions, actions_len, packet); >> - return !error; >> + xout.odp_actions.data, xout.odp_actions.size, >> packet); >> + xlate_out_uninit(&xout); >> + >> + return error; >> } >> >> /* Remove 'facet' from its ofproto and free up the associated memory: >> @@ -4899,22 +4923,7 @@ static void >> rule_dpif_execute(struct rule_dpif *rule, const struct flow *flow, >> struct ofpbuf *packet) >> { >> - struct ofproto_dpif *ofproto = ofproto_dpif_cast(rule->up.ofproto); >> - struct dpif_flow_stats stats; >> - struct xlate_out xout; >> - struct xlate_in xin; >> - >> - dpif_flow_stats_extract(flow, packet, time_msec(), &stats); >> - rule_dpif_credit_stats(rule, &stats); >> - >> - xlate_in_init(&xin, ofproto, flow, rule, stats.tcp_flags, packet); >> - xin.resubmit_stats = &stats; >> - xlate_actions(&xin, &xout); >> - >> - execute_odp_actions(ofproto, flow, xout.odp_actions.data, >> - xout.odp_actions.size, packet); >> - >> - xlate_out_uninit(&xout); >> + execute_actions(rule->up.ofproto, flow, rule, NULL, 0, packet); >> } >> >> static enum ofperr >> @@ -4949,46 +4958,27 @@ static int >> send_packet(const struct ofport_dpif *ofport, struct ofpbuf *packet) >> { >> struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofport->up.ofproto); >> - uint64_t odp_actions_stub[1024 / 8]; >> - struct ofpbuf odp_actions; >> - struct dpif_flow_stats stats; >> struct ofpact_output output; >> - struct xlate_out xout; >> - struct xlate_in xin; >> - struct flow flow; >> union flow_in_port in_port_; >> + struct flow flow; >> int error; >> >> - ofpbuf_use_stub(&odp_actions, odp_actions_stub, sizeof >> odp_actions_stub); >> - >> - /* Use OFPP_NONE as the in_port to avoid special packet processing. >> */ >> - in_port_.ofp_port = OFPP_NONE; >> - flow_extract(packet, 0, 0, NULL, &in_port_, &flow); >> - dpif_flow_stats_extract(&flow, packet, time_msec(), &stats); >> - >> ofpact_init(&output.ofpact, OFPACT_OUTPUT, sizeof output); >> output.port = ofport->up.ofp_port; >> output.max_len = 0; >> >> - xlate_in_init(&xin, ofproto, &flow, NULL, 0, packet); >> - xin.ofpacts_len = sizeof output; >> - xin.ofpacts = &output.ofpact; >> - xin.resubmit_stats = &stats; >> - xlate_actions(&xin, &xout); >> - >> - /* The kernel, however, doesn't know about OFPP_NONE. Use a real >> port. */ >> - flow.in_port.ofp_port = OFPP_LOCAL; >> - error = execute_odp_actions(ofproto, &flow, >> - xout.odp_actions.data, >> xout.odp_actions.size, >> - packet); >> - xlate_out_uninit(&xout); >> + in_port_.ofp_port = OFPP_NONE; >> + flow_extract(packet, 0, 0, NULL, &in_port_, &flow); >> >> + error = execute_actions(&ofproto->up, &flow, NULL, >> + &output.ofpact, sizeof output, packet); >> if (error) { >> VLOG_WARN_RL(&rl, "%s: failed to send packet on port %s (%s)", >> ofproto->up.name, >> netdev_get_name(ofport->up.netdev), >> ovs_strerror(error)); >> } >> >> + >> ofproto->stats.tx_packets++; >> ofproto->stats.tx_bytes += packet->size; >> return error; >> @@ -5048,27 +5038,11 @@ set_frag_handling(struct ofproto *ofproto_, >> } >> >> static enum ofperr >> -packet_out(struct ofproto *ofproto_, struct ofpbuf *packet, >> +packet_out(struct ofproto *ofproto, struct ofpbuf *packet, >> const struct flow *flow, >> const struct ofpact *ofpacts, size_t ofpacts_len) >> { >> - struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); >> - struct dpif_flow_stats stats; >> - struct xlate_out xout; >> - struct xlate_in xin; >> - >> - dpif_flow_stats_extract(flow, packet, time_msec(), &stats); >> - >> - xlate_in_init(&xin, ofproto, flow, NULL, stats.tcp_flags, packet); >> - xin.resubmit_stats = &stats; >> - xin.ofpacts_len = ofpacts_len; >> - xin.ofpacts = ofpacts; >> - >> - xlate_actions(&xin, &xout); >> - execute_odp_actions(ofproto, flow, >> - xout.odp_actions.data, xout.odp_actions.size, >> packet); >> - xlate_out_uninit(&xout); >> - >> + execute_actions(ofproto, flow, NULL, ofpacts, ofpacts_len, packet); >> return 0; >> } >> >> -- >> 1.7.10.4 >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> http://openvswitch.org/mailman/listinfo/dev >> > >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev