• Xin Long's avatar
    sctp: add dif and sdif check in asoc and ep lookup · 0af03170
    Xin Long authored
    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: default avatarXin Long <lucien.xin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0af03170
input.c 36.2 KB