Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
On 4/16/17 6:44 PM, Subash Abhinov Kasiviswanathan wrote: > Can you try this > > --- > net/ipv6/udp.c | 21 + > 1 file changed, 13 insertions(+), 8 deletions(-) > > diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c > index b793ed1..0e307e5 100644 > --- a/net/ipv6/udp.c > +++ b/net/ipv6/udp.c > @@ -46,6 +46,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -864,21 +865,25 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct > udp_table *udptable, > return 0; > } > > + > static struct sock *__udp6_lib_demux_lookup(struct net *net, > __be16 loc_port, const struct in6_addr *loc_addr, > __be16 rmt_port, const struct in6_addr *rmt_addr, > int dif) > { > + unsigned short hnum = ntohs(loc_port); > + unsigned int hash2 = udp6_portaddr_hash(net, loc_addr, hnum); > + unsigned int slot2 = hash2 & udp_table.mask; > + struct udp_hslot *hslot2 = &udp_table.hash2[slot2]; > + const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum); > struct sock *sk; > > - rcu_read_lock(); > - sk = __udp6_lib_lookup(net, rmt_addr, rmt_port, loc_addr, loc_port, > -dif, &udp_table, NULL); > - if (sk && !atomic_inc_not_zero(&sk->sk_refcnt)) > - sk = NULL; > - rcu_read_unlock(); > - > - return sk; > + udp_portaddr_for_each_entry_rcu(sk, &hslot2->head) { > + if (INET6_MATCH(sk, net, rmt_addr, loc_addr, ports, dif)) > + return sk; > + break; > + } > + return NULL; > } > > static void udp_v6_early_demux(struct sk_buff *skb) > That works for me. Thanks for the fast turn around.
Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
Can you try this --- net/ipv6/udp.c | 21 + 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index b793ed1..0e307e5 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -864,21 +865,25 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, return 0; } + static struct sock *__udp6_lib_demux_lookup(struct net *net, __be16 loc_port, const struct in6_addr *loc_addr, __be16 rmt_port, const struct in6_addr *rmt_addr, int dif) { + unsigned short hnum = ntohs(loc_port); + unsigned int hash2 = udp6_portaddr_hash(net, loc_addr, hnum); + unsigned int slot2 = hash2 & udp_table.mask; + struct udp_hslot *hslot2 = &udp_table.hash2[slot2]; + const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum); struct sock *sk; - rcu_read_lock(); - sk = __udp6_lib_lookup(net, rmt_addr, rmt_port, loc_addr, loc_port, - dif, &udp_table, NULL); - if (sk && !atomic_inc_not_zero(&sk->sk_refcnt)) - sk = NULL; - rcu_read_unlock(); - - return sk; + udp_portaddr_for_each_entry_rcu(sk, &hslot2->head) { + if (INET6_MATCH(sk, net, rmt_addr, loc_addr, ports, dif)) + return sk; + break; + } + return NULL; } static void udp_v6_early_demux(struct sk_buff *skb) -- 1.9.1
Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
On 4/15/17 8:23 PM, Subash Abhinov Kasiviswanathan wrote: >>> It should be fixed for 4.12. Basically, __udp6_lib_demux_lookup needs to >>> be more like __udp4_lib_demux_lookup > > Hi David > > Would it be possible for you to test this with udp_l3mdev_accept=0 formatting was botched so it does not apply cleanly. please send a patch file
Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
It should be fixed for 4.12. Basically, __udp6_lib_demux_lookup needs to be more like __udp4_lib_demux_lookup Hi David Would it be possible for you to test this with udp_l3mdev_accept=0 diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index b793ed1..0e307e5 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -864,21 +865,25 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, return 0; } + static struct sock *__udp6_lib_demux_lookup(struct net *net, __be16 loc_port, const struct in6_addr *loc_addr, __be16 rmt_port, const struct in6_addr *rmt_addr, int dif) { + unsigned short hnum = ntohs(loc_port); + unsigned int hash2 = udp6_portaddr_hash(net, loc_addr, hnum); + unsigned int slot2 = hash2 & udp_table.mask; + struct udp_hslot *hslot2 = &udp_table.hash2[slot2]; + const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum); struct sock *sk; - rcu_read_lock(); - sk = __udp6_lib_lookup(net, rmt_addr, rmt_port, loc_addr, loc_port, - dif, &udp_table, NULL); - if (sk && !atomic_inc_not_zero(&sk->sk_refcnt)) - sk = NULL; - rcu_read_unlock(); - - return sk; + udp_portaddr_for_each_entry_rcu(sk, &hslot2->head) { + if (INET6_MATCH(sk, net, rmt_addr, loc_addr, ports, dif)) + return sk; + break; + } + return NULL; } static void udp_v6_early_demux(struct sk_buff *skb) -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
From: David Ahern Date: Fri, 14 Apr 2017 18:42:14 -0600 > On 4/14/17 6:38 PM, Subash Abhinov Kasiviswanathan wrote: >> On 2017-04-14 16:23, David Ahern wrote: >>> Subash: >>> >>> My understanding of early demux is that it should only match connected >>> sockets (src/sport + dst/dport are all set). The ipv6 udp early demux >>> code added in 5425077d73e0c is doing a generic socket lookup which does >>> not require an exact match and accordingly breaks udp_l3mdev_accept=0. >>> Please fix. >>> >>> David >> >> Hi David >> >> Would it be possible to disable udp_early_demux for your case temporarily. >> I'll look into this. >> > > It should be fixed for 4.12. Basically, __udp6_lib_demux_lookup needs to > be more like __udp4_lib_demux_lookup Agreed.
Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
On 4/14/17 6:38 PM, Subash Abhinov Kasiviswanathan wrote: > On 2017-04-14 16:23, David Ahern wrote: >> Subash: >> >> My understanding of early demux is that it should only match connected >> sockets (src/sport + dst/dport are all set). The ipv6 udp early demux >> code added in 5425077d73e0c is doing a generic socket lookup which does >> not require an exact match and accordingly breaks udp_l3mdev_accept=0. >> Please fix. >> >> David > > Hi David > > Would it be possible to disable udp_early_demux for your case temporarily. > I'll look into this. > It should be fixed for 4.12. Basically, __udp6_lib_demux_lookup needs to be more like __udp4_lib_demux_lookup
Re: ipv6 udp early demux breaks udp_l3mdev_accept=0
On 2017-04-14 16:23, David Ahern wrote: Subash: My understanding of early demux is that it should only match connected sockets (src/sport + dst/dport are all set). The ipv6 udp early demux code added in 5425077d73e0c is doing a generic socket lookup which does not require an exact match and accordingly breaks udp_l3mdev_accept=0. Please fix. David Hi David Would it be possible to disable udp_early_demux for your case temporarily. I'll look into this. -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
ipv6 udp early demux breaks udp_l3mdev_accept=0
Subash: My understanding of early demux is that it should only match connected sockets (src/sport + dst/dport are all set). The ipv6 udp early demux code added in 5425077d73e0c is doing a generic socket lookup which does not require an exact match and accordingly breaks udp_l3mdev_accept=0. Please fix. David