• Kumar Kartikeya Dwivedi's avatar
    libbpf: Add various netlink helpers · 8bbb77b7
    Kumar Kartikeya Dwivedi authored
    This change introduces a few helpers to wrap open coded attribute
    preparation in netlink.c. It also adds a libbpf_netlink_send_recv() that
    is useful to wrap send + recv handling in a generic way. Subsequent patch
    will also use this function for sending and receiving a netlink response.
    The libbpf_nl_get_link() helper has been removed instead, moving socket
    creation into the newly named libbpf_netlink_send_recv().
    
    Every nested attribute's closure must happen using the helper
    nlattr_end_nested(), which sets its length properly. NLA_F_NESTED is
    enforced using nlattr_begin_nested() helper. Other simple attributes
    can be added directly.
    
    The maxsz parameter corresponds to the size of the request structure
    which is being filled in, so for instance with req being:
    
      struct {
    	struct nlmsghdr nh;
    	struct tcmsg t;
    	char buf[4096];
      } req;
    
    Then, maxsz should be sizeof(req).
    
    This change also converts the open coded attribute preparation with these
    helpers. Note that the only failure the internal call to nlattr_add()
    could result in the nested helper would be -EMSGSIZE, hence that is what
    we return to our caller.
    
    The libbpf_netlink_send_recv() call takes care of opening the socket,
    sending the netlink message, receiving the response, potentially invoking
    callbacks, and return errors if any, and then finally close the socket.
    This allows users to avoid identical socket setup code in different places.
    The only user of libbpf_nl_get_link() has been converted to make use of it.
    __bpf_set_link_xdp_fd_replace() has also been refactored to use it.
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    [ Daniel: major patch cleanup ]
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
    Link: https://lore.kernel.org/bpf/20210512103451.989420-2-memxor@gmail.com
    8bbb77b7
nlattr.h 3.77 KB