The skb_mpls_pop was not updating ethertype of an ethernet packet if the packet was originally received from a non ARPHRD_ETHER device. In the below OVS data path flow, since the device corresponding to port 7 is an l3 device (ARPHRD_NONE) the skb_mpls_pop function does not update the ethertype of the packet even though the previous push_eth action had added an ethernet header to the packet. recirc_id(0),in_port(7),eth_type(0x8847), mpls(label=12/0xfffff,tc=0/0,ttl=0/0x0,bos=1/1), actions:push_eth(src=00:00:00:00:00:00,dst=00:00:00:00:00:00), pop_mpls(eth_type=0x800),4
Showing the changes to include/linux (1 of 4 files). Show all
Unified · Split
| @@ -3530,7 +3530,8 @@ int skb_vlan_pop(struct sk_buff *skb); · 3529 unmodified lines | |||
| 3530 | int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci); | 3530 | int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci); |
| 3531 | int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, | 3531 | int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, |
| 3532 | int mac_len); | 3532 | int mac_len); |
| 3533 | int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len); | 3533 | int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len, |
| 3534 | bool ethernet); | ||
| 3534 | int skb_mpls_update_lse(struct sk_buff *skb, __be32 mpls_lse); | 3535 | int skb_mpls_update_lse(struct sk_buff *skb, __be32 mpls_lse); |
| 3535 | int skb_mpls_dec_ttl(struct sk_buff *skb); | 3536 | int skb_mpls_dec_ttl(struct sk_buff *skb); |
| 3536 | struct sk_buff *pskb_extract(struct sk_buff *skb, int off, int to_copy, | 3537 | struct sk_buff *pskb_extract(struct sk_buff *skb, int off, int to_copy, |