@@ -3197,6 +3197,13 @@ static const struct bpf_func_proto bpf_skb_vlan_pop_proto = {
31973197 .arg1_type = ARG_PTR_TO_CTX ,
31983198};
31993199
3200+ static void bpf_skb_change_protocol (struct sk_buff * skb , u16 proto )
3201+ {
3202+ skb -> protocol = htons (proto );
3203+ if (skb_valid_dst (skb ))
3204+ skb_dst_drop (skb );
3205+ }
3206+
32003207static int bpf_skb_generic_push (struct sk_buff * skb , u32 off , u32 len )
32013208{
32023209 /* Caller already did skb_cow() with len as headroom,
@@ -3293,7 +3300,7 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb)
32933300 }
32943301 }
32953302
3296- skb -> protocol = htons ( ETH_P_IPV6 );
3303+ bpf_skb_change_protocol ( skb , ETH_P_IPV6 );
32973304 skb_clear_hash (skb );
32983305
32993306 return 0 ;
@@ -3323,7 +3330,7 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb)
33233330 }
33243331 }
33253332
3326- skb -> protocol = htons ( ETH_P_IP );
3333+ bpf_skb_change_protocol ( skb , ETH_P_IP );
33273334 skb_clear_hash (skb );
33283335
33293336 return 0 ;
@@ -3514,10 +3521,10 @@ static int bpf_skb_net_grow(struct sk_buff *skb, u32 off, u32 len_diff,
35143521 /* Match skb->protocol to new outer l3 protocol */
35153522 if (skb -> protocol == htons (ETH_P_IP ) &&
35163523 flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 )
3517- skb -> protocol = htons ( ETH_P_IPV6 );
3524+ bpf_skb_change_protocol ( skb , ETH_P_IPV6 );
35183525 else if (skb -> protocol == htons (ETH_P_IPV6 ) &&
35193526 flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 )
3520- skb -> protocol = htons ( ETH_P_IP );
3527+ bpf_skb_change_protocol ( skb , ETH_P_IP );
35213528 }
35223529
35233530 if (skb_is_gso (skb )) {
@@ -3570,10 +3577,10 @@ static int bpf_skb_net_shrink(struct sk_buff *skb, u32 off, u32 len_diff,
35703577 /* Match skb->protocol to new outer l3 protocol */
35713578 if (skb -> protocol == htons (ETH_P_IP ) &&
35723579 flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV6 )
3573- skb -> protocol = htons ( ETH_P_IPV6 );
3580+ bpf_skb_change_protocol ( skb , ETH_P_IPV6 );
35743581 else if (skb -> protocol == htons (ETH_P_IPV6 ) &&
35753582 flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV4 )
3576- skb -> protocol = htons ( ETH_P_IP );
3583+ bpf_skb_change_protocol ( skb , ETH_P_IP );
35773584
35783585 if (skb_is_gso (skb )) {
35793586 struct skb_shared_info * shinfo = skb_shinfo (skb );
0 commit comments