--- zzzz-none-000/linux-5.15.111/net/ipv6/udp.c 2023-05-11 14:00:40.000000000 +0000 +++ puma7-atom-6670-761/linux-5.15.111/net/ipv6/udp.c 2024-02-07 10:23:30.000000000 +0000 @@ -55,6 +55,8 @@ #include #include "udp_impl.h" +#include + static void udpv6_destruct_sock(struct sock *sk) { udp_destruct_common(sk); @@ -687,11 +689,14 @@ static int udpv6_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb) { struct udp_sock *up = udp_sk(sk); + struct net *net = dev_net(skb->dev); int is_udplite = IS_UDPLITE(sk); if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) goto drop; + avm_pa_add_local_session(AVM_PA_NET_IP6_DEVINFO(net), skb, sk); + if (static_branch_unlikely(&udpv6_encap_needed_key) && up->encap_type) { int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); @@ -1048,13 +1053,15 @@ struct udp_hslot *hslot2 = &udp_table.hash2[slot2]; const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum); struct sock *sk; + bool scan_limit = !toe_udp_early_demux_no_scan_limit; udp_portaddr_for_each_entry_rcu(sk, &hslot2->head) { if (sk->sk_state == TCP_ESTABLISHED && inet6_match(net, sk, rmt_addr, loc_addr, ports, dif, sdif)) return sk; - /* Only check first socket in chain */ - break; + if (scan_limit) + /* Only check first socket in chain */ + break; } return NULL; }