Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

net: bpf: handle return value of post_bind{4,6} and add selftests for it #2349

Closed
wants to merge 4 commits into from

Commits on Jan 6, 2022

  1. adding ci files

    Nobody committed Jan 6, 2022
    Configuration menu
    Copy the full SHA
    a5c5078 View commit details
    Browse the repository at this point in the history
  2. net: bpf: handle return value of BPF_CGROUP_RUN_PROG_INET{4,6}_POST_B…

    …IND()
    
    The return value of BPF_CGROUP_RUN_PROG_INET{4,6}_POST_BIND() in
    __inet_bind() is not handled properly. While the return value
    is non-zero, it will set inet_saddr and inet_rcv_saddr to 0 and
    exit:
    
    	err = BPF_CGROUP_RUN_PROG_INET4_POST_BIND(sk);
    	if (err) {
    		inet->inet_saddr = inet->inet_rcv_saddr = 0;
    		goto out_release_sock;
    	}
    
    Let's take UDP for example and see what will happen. For UDP
    socket, it will be added to 'udp_prot.h.udp_table->hash' and
    'udp_prot.h.udp_table->hash2' after the sk->sk_prot->get_port()
    called success. If 'inet->inet_rcv_saddr' is specified here,
    then 'sk' will be in the 'hslot2' of 'hash2' that it don't belong
    to (because inet_saddr is changed to 0), and UDP packet received
    will not be passed to this sock. If 'inet->inet_rcv_saddr' is not
    specified here, the sock will work fine, as it can receive packet
    properly, which is wired, as the 'bind()' is already failed.
    
    To undo the get_port() operation, introduce the 'put_port' field
    for 'struct proto'. For TCP proto, it is inet_put_port(); For UDP
    proto, it is udp_lib_unhash(); For icmp proto, it is
    ping_unhash().
    
    Therefore, after sys_bind() fail caused by
    BPF_CGROUP_RUN_PROG_INET4_POST_BIND(), it will be unbinded, which
    means that it can try to be binded to another port.
    
    Signed-off-by: Menglong Dong <imagedong@tencent.com>
    menglongdong authored and Nobody committed Jan 6, 2022
    Configuration menu
    Copy the full SHA
    b4e6348 View commit details
    Browse the repository at this point in the history
  3. bpf: selftests: add bind retry for post_bind{4, 6}

    With previous patch, kernel is able to 'put_port' after sys_bind()
    fails. Add the test for that case: rebind another port after
    sys_bind() fails. If the bind success, it means previous bind
    operation is already undoed.
    
    Signed-off-by: Menglong Dong <imagedong@tencent.com>
    menglongdong authored and Nobody committed Jan 6, 2022
    Configuration menu
    Copy the full SHA
    d01f471 View commit details
    Browse the repository at this point in the history
  4. bpf: selftests: use C99 initializers in test_sock.c

    Use C99 initializers for the initialization of 'tests' in test_sock.c.
    
    Signed-off-by: Menglong Dong <imagedong@tencent.com>
    menglongdong authored and Nobody committed Jan 6, 2022
    Configuration menu
    Copy the full SHA
    4661839 View commit details
    Browse the repository at this point in the history