Thanks for the detailed answer. Comments below.

Jarno Rajahalme <ja...@ovn.org> escreveu no dia quarta, 17/02/2016 às 17:59:

>
> > On Feb 17, 2016, at 2:39 AM, André Mantas <andremant...@gmail.com>
> wrote:
> >
> > Hi. I'm currently adding support for packet-out messages in bundles.
> >
> > I started to look at *handle_packet_out*, *handle_bundle_add *and
> > *do_bundle_commit
> > *functions to understand how things work. Here is what I did in each
> > function:
> >
> > *handle_bundle_add:* added if case for OFPTYPE_PACKET_OUT which does all
> > the validations performed in handle_packet_out as well as saving the
> > packet_out info in the bundle_entry. For this I added a new
>
> You’d have to make sure that the validations work as expected in the
> context of the bundle. I haven’t checked the details, but if an earlier
> message in the bundle adds a port (that has not been committed yet), will
> the in_port of the packet_out using that port validate correctly?
>

Good question, will have to look at this. It should allow a packet_out in
that "new" port.


> Group and meter validation is part of the action validation for
> packet_out. While the bundles can’t currently include group or meter mods,
> I’d like to see that adding packet_out to a bundle does not unnecessarily
> complicate adding group and meter mods to bundles.
>
>
If this is the case, should a new validation function be made that does not
involve validating group and meters?


> > ofproto_packet_out struct to the union in ofp_bundle_entry. This new
> struct
> > (created in the same way as ofproto_flow_mod and ofproto_port_mod)
> contains
> > an ofputil_packet_out, a dp_packet *payload and a flow. If I understand
> > correctly, this three structs are needed later to send the packet_out in
> > the commit phase.
> >
> > *do_bundle_commit: *added if case for OFPTYPE_PACKET_OUT in phase 3
> > (finish) which calls the ofproto->ofproto_class->packet_out function
> using
> > the data saved in the bundle entry and then deletes de payload (as done
> in
> > handle_packet_out).
> > In phase 1 (begin) I only added prev_is_port_mod = false; to the
> packet-out
> > "if case" because all the validations were done before.
> >
> > Is there a way to verify if the packet can be sent without actually
> sending
> > it?
>
> Currently, no. The packet_out execution can fail either in action
> translation (which may call into arbitrarily complex set of flow tables via
> resubmit action), or in datapath action execution. Datapaths (such as the
> openvswitch Linux kernel module) currently perform action validation as an
> integral part of packet execution, and it may be impossible to create a
> call that would only exercise the validation part.
>
> > If not, the ofproto->ofproto_class->packet_out can still return errors,
> but
> > this will be in the finish phase, which cannot be rolled back.
>
> To make packet_out behave correctly in a bundle, the
> ofproto_class->packet_out should be split into separate validation and
> execution pieces. If you decide to do this, it may be possible to perform
> the action translation piece before the commit phase, leaving only the
> datapath action execution to the ofproto_class->packet_out. However, it may
> be costly to split the datapath action execution to separate validation and
> execution steps. Generally we do a good job not trying to execute something
> that the datapath then rejects, so maybe that is not necessary.
>

That's good to know. If it comes out that splitting the function is a
better solution, I may be able to do it.


>
> > I think that in this case the bundle should still be committed (because
> it
> > does not affect other modifications like flow-mods and port-mods) and
> > errors can be returned to the controller. Would this be a good option?
> >
>
> As per the OpenFlow bundle spec, the controller does not expect any errors
> for a successful bundle commit. So this would not be a good option.
>

Right, I just thought it would make sense in this case, but it cannot be
done.


>
> However, contrary to the documentation in ofproto-provider.h, our current
> implementation of packet_out in ofproto-dpif.c does not pass any errors
> back to the caller. If we decide to keep it that way, then all of the above
> is kind of moot, as we pretend that the packet_out succeeded even when it
> did not.
>

So, summing up, the most straightforward solution is to assume that after
the first validation, a packet-out never fails being sent, right?


>
>   Jarno
>
> > I would also like to know if I'm going in the right direction or if I did
> > something wrong.
> >
> > Thanks in advance.
> > _______________________________________________
> > 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