OSDN Git Service

sctp: add dif and sdif check in asoc and ep lookup
authorXin Long <lucien.xin@gmail.com>
Wed, 16 Nov 2022 20:01:20 +0000 (15:01 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Nov 2022 11:42:54 +0000 (11:42 +0000)
commit0af03170637f47fb5cc6501d4b2dcbf1c14772a9
tree5307ec19ec98002dc14ac83b5b0a8699f841edaa
parent33e93ed2209d5971043bed41dd194bc583b57ef3
sctp: add dif and sdif check in asoc and ep lookup

This patch at first adds a pernet global l3mdev_accept to decide if it
accepts the packets from a l3mdev when a SCTP socket doesn't bind to
any interface. It's set to 1 to avoid any possible incompatible issue,
and in next patch, a sysctl will be introduced to allow to change it.

Then similar to inet/udp_sk_bound_dev_eq(), sctp_sk_bound_dev_eq() is
added to check either dif or sdif is equal to sk_bound_dev_if, and to
check sid is 0 or l3mdev_accept is 1 if sk_bound_dev_if is not set.
This function is used to match a association or a endpoint, namely
called by sctp_addrs_lookup_transport() and sctp_endpoint_is_match().
All functions that needs updating are:

sctp_rcv():
  asoc:
  __sctp_rcv_lookup()
    __sctp_lookup_association() -> sctp_addrs_lookup_transport()
    __sctp_rcv_lookup_harder()
      __sctp_rcv_init_lookup()
         __sctp_lookup_association() -> sctp_addrs_lookup_transport()
      __sctp_rcv_walk_lookup()
         __sctp_rcv_asconf_lookup()
           __sctp_lookup_association() -> sctp_addrs_lookup_transport()

  ep:
  __sctp_rcv_lookup_endpoint() -> sctp_endpoint_is_match()

sctp_connect():
  sctp_endpoint_is_peeled_off()
    __sctp_lookup_association()
      sctp_has_association()
        sctp_lookup_association()
          __sctp_lookup_association() -> sctp_addrs_lookup_transport()

sctp_diag_dump_one():
  sctp_transport_lookup_process() -> sctp_addrs_lookup_transport()

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netns/sctp.h
include/net/sctp/sctp.h
include/net/sctp/structs.h
net/sctp/diag.c
net/sctp/endpointola.c
net/sctp/input.c
net/sctp/protocol.c
net/sctp/socket.c