@@ -4498,6 +4498,7 @@ BPF_CALL_4(bpf_skb_get_tunnel_key, struct sk_buff *, skb, struct bpf_tunnel_key
4498
4498
if (unlikely (size != sizeof (struct bpf_tunnel_key ))) {
4499
4499
err = - EINVAL ;
4500
4500
switch (size ) {
4501
+ case offsetof(struct bpf_tunnel_key , local_ipv6 [0 ]):
4501
4502
case offsetof(struct bpf_tunnel_key , tunnel_label ):
4502
4503
case offsetof(struct bpf_tunnel_key , tunnel_ext ):
4503
4504
goto set_compat ;
@@ -4523,10 +4524,14 @@ BPF_CALL_4(bpf_skb_get_tunnel_key, struct sk_buff *, skb, struct bpf_tunnel_key
4523
4524
if (flags & BPF_F_TUNINFO_IPV6 ) {
4524
4525
memcpy (to -> remote_ipv6 , & info -> key .u .ipv6 .src ,
4525
4526
sizeof (to -> remote_ipv6 ));
4527
+ memcpy (to -> local_ipv6 , & info -> key .u .ipv6 .dst ,
4528
+ sizeof (to -> local_ipv6 ));
4526
4529
to -> tunnel_label = be32_to_cpu (info -> key .label );
4527
4530
} else {
4528
4531
to -> remote_ipv4 = be32_to_cpu (info -> key .u .ipv4 .src );
4529
4532
memset (& to -> remote_ipv6 [1 ], 0 , sizeof (__u32 ) * 3 );
4533
+ to -> local_ipv4 = be32_to_cpu (info -> key .u .ipv4 .dst );
4534
+ memset (& to -> local_ipv6 [1 ], 0 , sizeof (__u32 ) * 3 );
4530
4535
to -> tunnel_label = 0 ;
4531
4536
}
4532
4537
@@ -4597,6 +4602,7 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb,
4597
4602
return - EINVAL ;
4598
4603
if (unlikely (size != sizeof (struct bpf_tunnel_key ))) {
4599
4604
switch (size ) {
4605
+ case offsetof(struct bpf_tunnel_key , local_ipv6 [0 ]):
4600
4606
case offsetof(struct bpf_tunnel_key , tunnel_label ):
4601
4607
case offsetof(struct bpf_tunnel_key , tunnel_ext ):
4602
4608
case offsetof(struct bpf_tunnel_key , remote_ipv6 [1 ]):
@@ -4639,10 +4645,13 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb,
4639
4645
info -> mode |= IP_TUNNEL_INFO_IPV6 ;
4640
4646
memcpy (& info -> key .u .ipv6 .dst , from -> remote_ipv6 ,
4641
4647
sizeof (from -> remote_ipv6 ));
4648
+ memcpy (& info -> key .u .ipv6 .src , from -> local_ipv6 ,
4649
+ sizeof (from -> local_ipv6 ));
4642
4650
info -> key .label = cpu_to_be32 (from -> tunnel_label ) &
4643
4651
IPV6_FLOWLABEL_MASK ;
4644
4652
} else {
4645
4653
info -> key .u .ipv4 .dst = cpu_to_be32 (from -> remote_ipv4 );
4654
+ info -> key .u .ipv4 .src = cpu_to_be32 (from -> local_ipv4 );
4646
4655
}
4647
4656
4648
4657
return 0 ;
0 commit comments