On Mon, Jul 18, 2016 at 11:21:11PM +0000, Jan Scheurich wrote: > Hi Johnson, > > > From: dev [mailto:dev-boun...@openvswitch.org] On Behalf Of Yang, Yi > > Sent: Monday, 18 July, 2016 12:37 > > > > On Mon, Jul 18, 2016 at 03:15:13PM +0900, Simon Horman wrote: > > > Hi Johnson, > > > > > > On Wed, Jul 13, 2016 at 01:28:48AM +0800, Johnson Li wrote: > > > > Signed-off-by: Johnson Li <johnson...@intel.com> > > > > > > * Regarding the action set (which we discussed briefly off-list): > > > > > > I think that you need to update ofpacts_execute_action_set(), though > > > possibly not in this patch, for push/pop_nsh to be usable in write > > > actions. However, its not clear to me at which position of that function > > > push/pop_nsh because as far as I know this has not been defined by > > > OpenFlow. > > The OF standard specifies the following order for action set execution: > 1. copy TTL inwards: apply copy TTL inward actions to the packet > 2. pop: apply all tag pop actions to the packet > 3. push-MPLS: apply MPLS tag push action to the packet > 4. push-PBB: apply PBB tag push action to the packet > 5. push-VLAN: apply VLAN tag push action to the packet > 6. copy TTL outwards: apply copy TTL outwards action to the packet > 7. decrement TTL: apply decrement TTL action to the packet > 8. set: apply all set-field actions to the packet > 9. qos: apply all QoS actions, such as set queue to the packet > 10. group: if a group action is specified, apply the actions of the relevant > group bucket(s) in the order specified by this list > 11. output: if no group action is specified, forward the packet on the port > specified by the output action > > If both push_nsh and push_eth are in the action set, push_nsh should be > executed before push_eth. Furthermore, if push_mpls and push_eth are present > in the action set, push_eth should be executed before push_mpls (push_mpls > pushes the MPLS shim header between MAC header and L2 payload, so the > resulting encap would be Outer Ethernet, MPLS, Inner Ethernet, which may be > useful for Ethernet over MPLS). > > My suggestion for the action set execution order would therefore be: > 3.a push_nsh > 3.b push_eth > 3.c push_mpls > 4 push_pbb > 5 push_vlan > > I agree that this is somewhat arbitrary and can be debated, but one can > achieve any wanted order using the Apply Actions instruction.
I think that sounds reasonable. Actually, I think the important thing is to define the ordering clearly. I wonder if taking it to the ONF earlier than later would be wise. It will be painful if at some point they chose a different ordering to what is present in the wild. > > > * Regarding the implementation of push/pop_nsh in this patch: > > > > > > In general translation occurs in two phases in OvS. > > > > > > 1. Composition: This generally involves updating fields of > > > ctx->xin->flow to new desired values and ctx->wc to indicate > > > which fields have been accessed so that masks for megaflows > > > can be calculated correctly. > > > > > > For simple cases such as OFPACT_SET_IP_TTL this is open-coded > > > in do_xlate_actions. For more complex cases helpers are provided, > > > e.g. OFPACT_PUSH_MPLS (though that is not very complex) > > > > > > 2. Commit: Here differences between ctx->in->flow and ctx->base_flow, > > > which are the same before translation starts, are compared. And any > > > differences are resolved by writing actions to ctx->odp_actions. > > > base_flow is then reset for cases where translation continues. > > > > > > This is performed by commit_odp_actions(), e.g. when called via > > > xlate_commit_actions(). > > > > > > There are exceptions to the above and in some cases actions are > > > written directly to ctx->odp_actions, but I'm not sure that > > > push/pop_nsh needs to be such an exception. > > In addition to splitting up the push_nsh handling into compose and commit > phase you need to consider the following: > > As push_nsh pushes an encapsulation that changes the packet's ethertype and > hides the inner packet, you need to call xlate_commit_actions(ctx) to really > carry out all not yet committed actions on the inner packet before you start > composing the push_nsh action. > > Conversely, when you compose the pop_nsh action you need to trigger a > recirculation of the packet after pop_nsh to have the datapath reparse the > inner packet and subject it to another megaflow lookup. You should do that by > calling ctx_trigger_freeze(ctx) after having composed the pop_mpls action. > > The same goes for the actions push_eth and pop_eth. Yes, I believe that is true except for the last statement. I think that push/pop_nsh will likely follow a similar pattern to push/pop_mpls as both sets of actions may change the ethernet type of a packet. But I think the case of push/pop_eth is a little different. The way this is modelled is that those actions affect the presence of an ethernet header (which is in itself a bit special) but not the type of the packet. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev