]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
utils: Introduce helper routines for generic socket recv
authorParav Pandit <parav@nvidia.com>
Mon, 1 Mar 2021 10:56:52 +0000 (12:56 +0200)
committerDavid Ahern <dsahern@kernel.org>
Wed, 3 Mar 2021 04:00:04 +0000 (04:00 +0000)
Introduce helper for generic socket receive helper and introduce helper
to build command with custom family and version.

Use API in subsequent devlink patch.

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
include/mnl_utils.h
lib/mnl_utils.c

index 9e7d6879009c01e6336cc7d568a090f125395880..aa5f0a9b17c72228f1997478a6b3e9fd09bff927 100644 (file)
@@ -13,6 +13,10 @@ struct mnlu_gen_socket {
 int mnlu_gen_socket_open(struct mnlu_gen_socket *nlg, const char *family_name,
                         uint8_t version);
 void mnlu_gen_socket_close(struct mnlu_gen_socket *nlg);
+struct nlmsghdr *
+_mnlu_gen_socket_cmd_prepare(struct mnlu_gen_socket *nlg,
+                            uint8_t cmd, uint16_t flags,
+                            uint32_t id, uint8_t version);
 struct nlmsghdr *mnlu_gen_socket_cmd_prepare(struct mnlu_gen_socket *nlg,
                                             uint8_t cmd, uint16_t flags);
 int mnlu_gen_socket_sndrcv(struct mnlu_gen_socket *nlg, const struct nlmsghdr *nlh,
@@ -23,5 +27,7 @@ struct nlmsghdr *mnlu_msg_prepare(void *buf, uint32_t nlmsg_type, uint16_t flags
                                  void *extra_header, size_t extra_header_size);
 int mnlu_socket_recv_run(struct mnl_socket *nl, unsigned int seq, void *buf, size_t buf_size,
                         mnl_cb_t cb, void *data);
+int mnlu_gen_socket_recv_run(struct mnlu_gen_socket *nlg, mnl_cb_t cb,
+                            void *data);
 
 #endif /* __MNL_UTILS_H__ */
index 4f69945541778936f143a309377c102bcebfe987..d5abff58d816ceb92971df8e61b0e19fd7451ed7 100644 (file)
@@ -196,19 +196,28 @@ void mnlu_gen_socket_close(struct mnlu_gen_socket *nlg)
        free(nlg->buf);
 }
 
-struct nlmsghdr *mnlu_gen_socket_cmd_prepare(struct mnlu_gen_socket *nlg,
-                                            uint8_t cmd, uint16_t flags)
+struct nlmsghdr *
+_mnlu_gen_socket_cmd_prepare(struct mnlu_gen_socket *nlg,
+                            uint8_t cmd, uint16_t flags,
+                            uint32_t id, uint8_t version)
 {
        struct genlmsghdr hdr = {};
        struct nlmsghdr *nlh;
 
        hdr.cmd = cmd;
-       hdr.version = nlg->version;
-       nlh = mnlu_msg_prepare(nlg->buf, nlg->family, flags, &hdr, sizeof(hdr));
+       hdr.version = version;
+       nlh = mnlu_msg_prepare(nlg->buf, id, flags, &hdr, sizeof(hdr));
        nlg->seq = nlh->nlmsg_seq;
        return nlh;
 }
 
+struct nlmsghdr *mnlu_gen_socket_cmd_prepare(struct mnlu_gen_socket *nlg,
+                                            uint8_t cmd, uint16_t flags)
+{
+       return _mnlu_gen_socket_cmd_prepare(nlg, cmd, flags, nlg->family,
+                                           nlg->version);
+}
+
 int mnlu_gen_socket_sndrcv(struct mnlu_gen_socket *nlg, const struct nlmsghdr *nlh,
                           mnl_cb_t data_cb, void *data)
 {
@@ -229,3 +238,11 @@ int mnlu_gen_socket_sndrcv(struct mnlu_gen_socket *nlg, const struct nlmsghdr *n
        }
        return 0;
 }
+
+int mnlu_gen_socket_recv_run(struct mnlu_gen_socket *nlg, mnl_cb_t cb,
+                            void *data)
+{
+       return mnlu_socket_recv_run(nlg->nl, nlg->seq, nlg->buf,
+                                   MNL_SOCKET_BUFFER_SIZE,
+                                   cb, data);
+}