Message ID | 5dbc2dbc222ff778861ef08b4e0a68a49a7afeb1.1576896417.git.martin.varghese@nokia.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | New openvswitch MPLS actions for layer 2 tunnelling | expand |
On Fri, Dec 20, 2019 at 7:21 PM Martin Varghese <martinvarghesenokia@gmail.com> wrote: > > From: Martin Varghese <martin.varghese@nokia.com> > > The existing skb_mpls_push() implementation always inserts mpls header > after the mac header. L2 VPN use cases requires MPLS header to be > inserted before the ethernet header as the ethernet packet gets tunnelled > inside MPLS header in those cases. > > Signed-off-by: Martin Varghese <martin.varghese@nokia.com> > --- > Changes in v2: > - Fixed comments section of skb_mpls_push(). > - Added skb_reset_mac_len() in skb_mpls_push(). The mac len changes > when MPLS header in inserted at the start of the packet. > > net/core/skbuff.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > Acked-by: Pravin B Shelar <pshelar@ovn.org> Thanks.
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 973a71f..d90c827 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5472,12 +5472,15 @@ static void skb_mod_eth_type(struct sk_buff *skb, struct ethhdr *hdr, } /** - * skb_mpls_push() - push a new MPLS header after the mac header + * skb_mpls_push() - push a new MPLS header after mac_len bytes from start of + * the packet * * @skb: buffer * @mpls_lse: MPLS label stack entry to push * @mpls_proto: ethertype of the new MPLS header (expects 0x8847 or 0x8848) * @mac_len: length of the MAC header + * @ethernet: flag to indicate if the resulting packet after skb_mpls_push is + * ethernet * * Expects skb->data at mac header. * @@ -5501,7 +5504,7 @@ int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, return err; if (!skb->inner_protocol) { - skb_set_inner_network_header(skb, mac_len); + skb_set_inner_network_header(skb, skb_network_offset(skb)); skb_set_inner_protocol(skb, skb->protocol); } @@ -5510,6 +5513,7 @@ int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, mac_len); skb_reset_mac_header(skb); skb_set_network_header(skb, mac_len); + skb_reset_mac_len(skb); lse = mpls_hdr(skb); lse->label_stack_entry = mpls_lse;