• Xin Long's avatar
    sctp: support for sending packet over udp4 sock · 600af7fd
    Xin Long authored
    This patch does what the rfc6951#section-5.3 says for ipv4:
    
      "Within the UDP header, the source port MUST be the local UDP
       encapsulation port number of the SCTP stack, and the destination port
       MUST be the remote UDP encapsulation port number maintained for the
       association and the destination address to which the packet is sent
       (see Section 5.1).
    
       Because the SCTP packet is the UDP payload, the length of the UDP
       packet MUST be the length of the SCTP packet plus the size of the UDP
       header.
    
       The SCTP checksum MUST be computed for IPv4 and IPv6, and the UDP
       checksum SHOULD be computed for IPv4 and IPv6."
    
    Some places need to be adjusted in sctp_packet_transmit():
    
      1. For non-gso packets, when transport's encap_port is set, sctp
         checksum has to be done in sctp_packet_pack(), as the outer
         udp will use ip_summed = CHECKSUM_PARTIAL to do the offload
         setting for checksum.
    
      2. Delay calling dst_clone() and skb_dst_set() for non-udp packets
         until sctp_v4_xmit(), as for udp packets, skb_dst_set() is not
         needed before calling udp_tunnel_xmit_skb().
    
    then in sctp_v4_xmit():
    
      1. Go to udp_tunnel_xmit_skb() only when transport->encap_port and
         net->sctp.udp_port both are set, as these are one for dst port
         and another for src port.
    
      2. For gso packet, SKB_GSO_UDP_TUNNEL_CSUM is set for gso_type, and
         with this udp checksum can be done in __skb_udp_tunnel_segment()
         for each segments after the sctp gso.
    
      3. inner_mac_header and inner_transport_header are set, as these
         will be needed in __skb_udp_tunnel_segment() to find the right
         headers.
    
      4. df and ttl are calculated, as these are the required params by
         udp_tunnel_xmit_skb().
    
      5. nocheck param has to be false, as "the UDP checksum SHOULD be
         computed for IPv4 and IPv6", says in rfc6951#section-5.3.
    
    v1->v2:
      - Use sp->udp_port instead in sctp_v4_xmit(), which is more safe.
    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>
    600af7fd
output.c 22.9 KB