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

Reply via email to