Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

openvswitch: use mpls_hdr

skb_mpls_header is equivalent to mpls_hdr now. Use the existing helper
instead.

Signed-off-by: Jiri Benc <jbenc@redhat.com>
Acked-by: Pravin B Shelar <pshelar@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Benc and committed by
David S. Miller
85de4a21 9095e10e

+12 -24
-12
include/net/mpls.h
··· 33 33 { 34 34 return (struct mpls_shim_hdr *)skb_network_header(skb); 35 35 } 36 - 37 - /* 38 - * For non-MPLS skbs this will correspond to the network header. 39 - * For MPLS skbs it will be before the network_header as the MPLS 40 - * label stack lies between the end of the mac header and the network 41 - * header. That is, for MPLS skbs the end of the mac header 42 - * is the top of the MPLS label stack. 43 - */ 44 - static inline unsigned char *skb_mpls_header(struct sk_buff *skb) 45 - { 46 - return skb_mac_header(skb) + skb->mac_len; 47 - } 48 36 #endif
+12 -12
net/openvswitch/actions.c
··· 160 160 static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key, 161 161 const struct ovs_action_push_mpls *mpls) 162 162 { 163 - __be32 *new_mpls_lse; 163 + struct mpls_shim_hdr *new_mpls_lse; 164 164 165 165 /* Networking stack do not allow simultaneous Tunnel and MPLS GSO. */ 166 166 if (skb->encapsulation) ··· 180 180 skb_reset_mac_header(skb); 181 181 skb_set_network_header(skb, skb->mac_len); 182 182 183 - new_mpls_lse = (__be32 *)skb_mpls_header(skb); 184 - *new_mpls_lse = mpls->mpls_lse; 183 + new_mpls_lse = mpls_hdr(skb); 184 + new_mpls_lse->label_stack_entry = mpls->mpls_lse; 185 185 186 186 skb_postpush_rcsum(skb, new_mpls_lse, MPLS_HLEN); 187 187 ··· 202 202 if (unlikely(err)) 203 203 return err; 204 204 205 - skb_postpull_rcsum(skb, skb_mpls_header(skb), MPLS_HLEN); 205 + skb_postpull_rcsum(skb, mpls_hdr(skb), MPLS_HLEN); 206 206 207 207 memmove(skb_mac_header(skb) + MPLS_HLEN, skb_mac_header(skb), 208 208 skb->mac_len); ··· 211 211 skb_reset_mac_header(skb); 212 212 skb_set_network_header(skb, skb->mac_len); 213 213 214 - /* skb_mpls_header() is used to locate the ethertype 215 - * field correctly in the presence of VLAN tags. 214 + /* mpls_hdr() is used to locate the ethertype field correctly in the 215 + * presence of VLAN tags. 216 216 */ 217 - hdr = (struct ethhdr *)(skb_mpls_header(skb) - ETH_HLEN); 217 + hdr = (struct ethhdr *)((void *)mpls_hdr(skb) - ETH_HLEN); 218 218 update_ethertype(skb, hdr, ethertype); 219 219 if (eth_p_mpls(skb->protocol)) 220 220 skb->protocol = ethertype; ··· 226 226 static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key, 227 227 const __be32 *mpls_lse, const __be32 *mask) 228 228 { 229 - __be32 *stack; 229 + struct mpls_shim_hdr *stack; 230 230 __be32 lse; 231 231 int err; 232 232 ··· 234 234 if (unlikely(err)) 235 235 return err; 236 236 237 - stack = (__be32 *)skb_mpls_header(skb); 238 - lse = OVS_MASKED(*stack, *mpls_lse, *mask); 237 + stack = mpls_hdr(skb); 238 + lse = OVS_MASKED(stack->label_stack_entry, *mpls_lse, *mask); 239 239 if (skb->ip_summed == CHECKSUM_COMPLETE) { 240 - __be32 diff[] = { ~(*stack), lse }; 240 + __be32 diff[] = { ~(stack->label_stack_entry), lse }; 241 241 242 242 skb->csum = ~csum_partial((char *)diff, sizeof(diff), 243 243 ~skb->csum); 244 244 } 245 245 246 - *stack = lse; 246 + stack->label_stack_entry = lse; 247 247 flow_key->mpls.top_lse = lse; 248 248 return 0; 249 249 }