Message ID | 20210725124339.72884-1-peterchenshen@gmail.com |
---|---|
State | New |
Headers | show |
Series | sctp: delete addr based on sin6_scope_id | expand |
Hi, The fix is right, but a couple of small changes: On Sun, Jul 25, 2021 at 08:43:39PM +0800, Chen Shen wrote: > sctp_inet6addr_event deletes 'addr' from 'local_addr_list' when setting > netdev down, but it has possibility to delete the incorroct entry (match ^ typo > the first one with the same ipaddr, but the different 'ifindex'), if > there are some netdevs with the same 'local-link' ipaddr added already. > It should delete the entry depending on 'sin6_addr' and 'sin6_scope_id' > both, otherwise, the endpoint will call 'sctp_sf_ootb' if it can't find > the accroding association when receives 'heartbeat', and finally will ^^ typo > reply 'abort' which causes the test case for NOKIA SYSCOM GW failed. > ... > diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c > index 52c92b8d827f..66ebf1e3383d 100644 > --- a/net/sctp/ipv6.c > +++ b/net/sctp/ipv6.c > @@ -100,7 +100,9 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev, > &net->sctp.local_addr_list, list) { > if (addr->a.sa.sa_family == AF_INET6 && > ipv6_addr_equal(&addr->a.v6.sin6_addr, > - &ifa->addr)) { > + &ifa->addr) && > + addr->a.v6.sin6_scope_id == > + ifa->idev->dev->ifindex) { The indentation here is not right. It was wrong already, but lets seize the moment and fix it. This is how it should look like: if (addr->a.sa.sa_family == AF_INET6 && ipv6_addr_equal(&addr->a.v6.sin6_addr, &ifa->addr) && addr->a.v6.sin6_scope_id == ifa->idev->dev->ifindex) { Thanks, Marcelo > sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_DEL); > found = 1; > addr->valid = 0; > -- > 2.19.0 >
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 52c92b8d827f..66ebf1e3383d 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -100,7 +100,9 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev, &net->sctp.local_addr_list, list) { if (addr->a.sa.sa_family == AF_INET6 && ipv6_addr_equal(&addr->a.v6.sin6_addr, - &ifa->addr)) { + &ifa->addr) && + addr->a.v6.sin6_scope_id == + ifa->idev->dev->ifindex) { sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_DEL); found = 1; addr->valid = 0;
sctp_inet6addr_event deletes 'addr' from 'local_addr_list' when setting netdev down, but it has possibility to delete the incorroct entry (match the first one with the same ipaddr, but the different 'ifindex'), if there are some netdevs with the same 'local-link' ipaddr added already. It should delete the entry depending on 'sin6_addr' and 'sin6_scope_id' both, otherwise, the endpoint will call 'sctp_sf_ootb' if it can't find the accroding association when receives 'heartbeat', and finally will reply 'abort' which causes the test case for NOKIA SYSCOM GW failed. For example: 1.when linux startup the entries in local_addr_list: ifindex:35 addr:fe80::40:43ff:fe80:0 (eths0.201) ifindex:36 addr:fe80::40:43ff:fe80:0 (eths0.209) ifindex:37 addr:fe80::40:43ff:fe80:0 (eths0.210) the route table: local fe80::40:43ff:fe80:0 dev eths0.201 local fe80::40:43ff:fe80:0 dev eths0.209 local fe80::40:43ff:fe80:0 dev eths0.210 2.after 'ifconfig eths0.209 down' the entries in local_addr_list: ifindex:36 addr:fe80::40:43ff:fe80:0 (eths0.209) ifindex:37 addr:fe80::40:43ff:fe80:0 (eths0.210) the route table: local fe80::40:43ff:fe80:0 dev eths0.201 local fe80::40:43ff:fe80:0 dev eths0.210 3.asoc not found for src:[fe80::40:43ff:fe80:0]:37381 dst:[:1]:53335 ::1->fe80::40:43ff:fe80:0 HEARTBEAT fe80::40:43ff:fe80:0->::1 ABORT Change-Id: I9fd4745a9a95489c62571c2764d37259c0209eff Signed-off-by: Chen Shen <peterchenshen@gmail.com> --- net/sctp/ipv6.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)