On Wed, Apr 3, 2013 at 2:11 AM, Simon Horman <ho...@verge.net.au> wrote: > In the case where a non-MPLS packet is recieved and an MPLS stack is > added it may well be the case that the original skb is GSO but the > NIC used for transmit does not support GSO of MPLS packets. > > The aim of this code is to provide GSO in software for MPLS packets > whose skbs are GSO. > > When an implementation adds an MPLS stack to a non-MPLS packet it should do > the following to skb metadata: > > * Set skb_mac_header(skb)->protocol to the new MPLS ethertype. > That is, either ETH_P_MPLS_UC or ETH_P_MPLS_MC. > > * Leave skb->protocol as the old non-MPLS ethertype. > > * Set skb->encapsulation = 1. > > This may not strictly be necessary as I believe that checking > skb_mac_header(skb)->protocol and skb->protocol should be necessary and > sufficient. > > However, it does seem to fit nicely with the current implementation of > dev_hard_start_xmit() where the more expensive check of > skb_mac_header(skb)->protocol may be guarded by an existing check of > skb->encapsulation. > > One aspect of this patch that I am unsure about is the modification I have > made to skb_segment(). This seems to be necessary as checskum accelearation > may no longer be possible as the packet has changed to be MPLS from some > other packet type which may have been supported by the hardware in use. > > I will post a patch, "[PATCH v3.24] datapath: Add basic MPLS support to > kernel" which adds MPLS support to the kernel datapath of Open vSwtich. > That patch sets the above requirements in > datapath/actions.c:set_ethertype() and was used to exercise the MPLS GSO > code. The datapath patch is against the Open vSwtich tree but it is > intended that it be added to the Open vSwtich code present in the mainline > Linux kernel at some point. > > Suggested by Jesse Gross. Based heavily on "v4 GRE: Add TCP segmentation > offload for GRE" by Pravin B Shelar. > > Cc: Jesse Gross <je...@nicira.com> > Cc: Pravin B Shelar <pshe...@nicira.com> > Signed-off-by: Simon Horman <ho...@verge.net.au>
MPLS is very similar to both the Ethernet header and vlans in that GSO only requires replication without any modification. That means that if we look at the mac_len as containing all three then we can just copy it without any special knowledge. I don't know that we carefully maintain mac_len in all places but you are already doing that in your MPLS patches. The other piece at that point is getting the inner protocol. I'm worried that using skb->protocol for this will break things that try to use it for filtering. It also means that depending on whether an MPLS packet is locally sourced or not skb->protocol may be different because we won't always be able to find the inner header. I think this will require a careful definition of that field to make it consistent. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev