• Andrey Ignatov's avatar
    net: Introduce __inet_bind() and __inet6_bind · 3679d585
    Andrey Ignatov authored
    Refactor `bind()` code to make it ready to be called from BPF helper
    function `bpf_bind()` (will be added soon). Implementation of
    `inet_bind()` and `inet6_bind()` is separated into `__inet_bind()` and
    `__inet6_bind()` correspondingly. These function can be used from both
    `sk_prot->bind` and `bpf_bind()` contexts.
    
    New functions have two additional arguments.
    
    `force_bind_address_no_port` forces binding to IP only w/o checking
    `inet_sock.bind_address_no_port` field. It'll allow to bind local end of
    a connection to desired IP in `bpf_bind()` w/o changing
    `bind_address_no_port` field of a socket. It's useful since `bpf_bind()`
    can return an error and we'd need to restore original value of
    `bind_address_no_port` in that case if we changed this before calling to
    the helper.
    
    `with_lock` specifies whether to lock socket when working with `struct
    sk` or not. The argument is set to `true` for `sk_prot->bind`, i.e. old
    behavior is preserved. But it will be set to `false` for `bpf_bind()`
    use-case. The reason is all call-sites, where `bpf_bind()` will be
    called, already hold that socket lock.
    Signed-off-by: default avatarAndrey Ignatov <rdna@fb.com>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    3679d585
af_inet.c 49.6 KB