• Dmitry Safonov's avatar
    net/tcp: Wire up l3index to TCP-AO · 248411b8
    Dmitry Safonov authored
    Similarly how TCP_MD5SIG_FLAG_IFINDEX works for TCP-MD5,
    TCP_AO_KEYF_IFINDEX is an AO-key flag that binds that MKT to a specified
    by L3 ifinndex. Similarly, without this flag the key will work in
    the default VRF l3index = 0 for connections.
    To prevent AO-keys from overlapping, it's restricted to add key B for a
    socket that has key A, which have the same sndid/rcvid and one of
    the following is true:
    - !(A.keyflags & TCP_AO_KEYF_IFINDEX) or !(B.keyflags & TCP_AO_KEYF_IFINDEX)
      so that any key is non-bound to a VRF
    - A.l3index == B.l3index
      both want to work for the same VRF
    
    Additionally, it's restricted to match TCP-MD5 keys for the same peer
    the following way:
    |--------------|--------------------|----------------|---------------|
    |              | MD5 key without    |     MD5 key    |    MD5 key    |
    |              |     l3index        |    l3index=0   |   l3index=N   |
    |--------------|--------------------|----------------|---------------|
    |  TCP-AO key  |                    |                |               |
    |  without     |       reject       |    reject      |   reject      |
    |  l3index     |                    |                |               |
    |--------------|--------------------|----------------|---------------|
    |  TCP-AO key  |                    |                |               |
    |  l3index=0   |       reject       |    reject      |   allow       |
    |--------------|--------------------|----------------|---------------|
    |  TCP-AO key  |                    |                |               |
    |  l3index=N   |       reject       |    allow       |   reject      |
    |--------------|--------------------|----------------|---------------|
    
    This is done with the help of tcp_md5_do_lookup_any_l3index() to reject
    adding AO key without TCP_AO_KEYF_IFINDEX if there's TCP-MD5 in any VRF.
    This is important for case where sysctl_tcp_l3mdev_accept = 1
    Similarly, for TCP-AO lookups tcp_ao_do_lookup() may be used with
    l3index < 0, so that __tcp_ao_key_cmp() will match TCP-AO key in any VRF.
    Signed-off-by: default avatarDmitry Safonov <dima@arista.com>
    Acked-by: default avatarDavid Ahern <dsahern@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    248411b8
tcp_ipv6.c 63.7 KB