libbpf: add the capability to specify netlink proto in libbpf_netlink_send_recv
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 1 Feb 2023 10:24:20 +0000 (11:24 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 3 Feb 2023 04:48:23 +0000 (20:48 -0800)
This is a preliminary patch in order to introduce netlink_generic
protocol support to libbpf.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://lore.kernel.org/r/7878a54667e74afeec3ee519999c044bd514b44c.1675245258.git.lorenzo@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/lib/bpf/netlink.c

index 35104580870c0f0ae90e6e4e5a9602e8d67f7f84..d2468a04a6c38844bb73edc2af458aa4648201bc 100644 (file)
@@ -41,7 +41,7 @@ struct xdp_id_md {
        struct xdp_link_info info;
 };
 
-static int libbpf_netlink_open(__u32 *nl_pid)
+static int libbpf_netlink_open(__u32 *nl_pid, int proto)
 {
        struct sockaddr_nl sa;
        socklen_t addrlen;
@@ -51,7 +51,7 @@ static int libbpf_netlink_open(__u32 *nl_pid)
        memset(&sa, 0, sizeof(sa));
        sa.nl_family = AF_NETLINK;
 
-       sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
+       sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, proto);
        if (sock < 0)
                return -errno;
 
@@ -212,14 +212,14 @@ done:
 }
 
 static int libbpf_netlink_send_recv(struct libbpf_nla_req *req,
-                                   __dump_nlmsg_t parse_msg,
+                                   int proto, __dump_nlmsg_t parse_msg,
                                    libbpf_dump_nlmsg_t parse_attr,
                                    void *cookie)
 {
        __u32 nl_pid = 0;
        int sock, ret;
 
-       sock = libbpf_netlink_open(&nl_pid);
+       sock = libbpf_netlink_open(&nl_pid, proto);
        if (sock < 0)
                return sock;
 
@@ -271,7 +271,7 @@ static int __bpf_set_link_xdp_fd_replace(int ifindex, int fd, int old_fd,
        }
        nlattr_end_nested(&req, nla);
 
-       return libbpf_netlink_send_recv(&req, NULL, NULL, NULL);
+       return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL);
 }
 
 int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, const struct bpf_xdp_attach_opts *opts)
@@ -382,7 +382,7 @@ int bpf_xdp_query(int ifindex, int xdp_flags, struct bpf_xdp_query_opts *opts)
        xdp_id.ifindex = ifindex;
        xdp_id.flags = xdp_flags;
 
-       err = libbpf_netlink_send_recv(&req, __dump_link_nlmsg,
+       err = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, __dump_link_nlmsg,
                                       get_xdp_info, &xdp_id);
        if (err)
                return libbpf_err(err);
@@ -493,7 +493,7 @@ static int tc_qdisc_modify(struct bpf_tc_hook *hook, int cmd, int flags)
        if (ret < 0)
                return ret;
 
-       return libbpf_netlink_send_recv(&req, NULL, NULL, NULL);
+       return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL);
 }
 
 static int tc_qdisc_create_excl(struct bpf_tc_hook *hook)
@@ -673,7 +673,8 @@ int bpf_tc_attach(const struct bpf_tc_hook *hook, struct bpf_tc_opts *opts)
 
        info.opts = opts;
 
-       ret = libbpf_netlink_send_recv(&req, get_tc_info, NULL, &info);
+       ret = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, get_tc_info, NULL,
+                                      &info);
        if (ret < 0)
                return libbpf_err(ret);
        if (!info.processed)
@@ -739,7 +740,7 @@ static int __bpf_tc_detach(const struct bpf_tc_hook *hook,
                        return ret;
        }
 
-       return libbpf_netlink_send_recv(&req, NULL, NULL, NULL);
+       return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL);
 }
 
 int bpf_tc_detach(const struct bpf_tc_hook *hook,
@@ -804,7 +805,8 @@ int bpf_tc_query(const struct bpf_tc_hook *hook, struct bpf_tc_opts *opts)
 
        info.opts = opts;
 
-       ret = libbpf_netlink_send_recv(&req, get_tc_info, NULL, &info);
+       ret = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, get_tc_info, NULL,
+                                      &info);
        if (ret < 0)
                return libbpf_err(ret);
        if (!info.processed)