• Xin Long's avatar
    sctp: allow changing transport encap_port by peer packets · a1dd2cf2
    Xin Long authored
    As rfc6951#section-5.4 says:
    
      "After finding the SCTP association (which
       includes checking the verification tag), the UDP source port MUST be
       stored as the encapsulation port for the destination address the SCTP
       packet is received from (see Section 5.1).
    
       When a non-encapsulated SCTP packet is received by the SCTP stack,
       the encapsulation of outgoing packets belonging to the same
       association and the corresponding destination address MUST be
       disabled."
    
    transport encap_port should be updated by a validated incoming packet's
    udp src port.
    
    We save the udp src port in sctp_input_cb->encap_port, and then update
    the transport in two places:
    
      1. right after vtag is verified, which is required by RFC, and this
         allows the existent transports to be updated by the chunks that
         can only be processed on an asoc.
    
      2. right before processing the 'init' where the transports are added,
         and this allows building a sctp over udp connection by client with
         the server not knowing the remote encap port.
    
      3. when processing ootb_pkt and creating the temporary transport for
         the reply pkt.
    
    Note that sctp_input_cb->header is removed, as it's not used any more
    in sctp.
    
    v1->v2:
      - Change encap_port as __be16 for sctp_input_cb.
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    a1dd2cf2
sm_statefuns.c 204 KB