]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
netlink: add __netlink_{send,recv,transaction} 2521/head
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 11 Aug 2018 14:25:14 +0000 (16:25 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sat, 11 Aug 2018 14:25:14 +0000 (16:25 +0200)
These allow to pass a struct nlmsghdr directly and are used in the higher level
netlink_{send,rcv,transaction}.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/network.c
src/lxc/nl.c
src/lxc/nl.h

index 53bc581114b96b22cbe7418e5cb360b3ca77c54b..dd294cd914869ca4aabd941bef55b6d60a9bed96 100644 (file)
@@ -3192,93 +3192,6 @@ enum {
        __LXC_NETNSA_MAX,
 };
 
-static int nl_send(struct nl_handler *handler, struct nlmsghdr *nlmsghdr)
-{
-       struct sockaddr_nl nladdr;
-       struct iovec iov = {
-               .iov_base = nlmsghdr,
-               .iov_len = nlmsghdr->nlmsg_len,
-       };
-       struct msghdr msg = {
-               .msg_name = &nladdr,
-               .msg_namelen = sizeof(nladdr),
-               .msg_iov = &iov,
-               .msg_iovlen = 1,
-       };
-       int ret;
-
-       memset(&nladdr, 0, sizeof(nladdr));
-       nladdr.nl_family = AF_NETLINK;
-       nladdr.nl_pid = 0;
-       nladdr.nl_groups = 0;
-
-       ret = sendmsg(handler->fd, &msg, MSG_NOSIGNAL);
-       if (ret < 0)
-               return -errno;
-
-       return ret;
-}
-
-static int nl_recv(struct nl_handler *handler, struct nlmsghdr *nlmsghdr)
-{
-       int ret;
-       struct sockaddr_nl nladdr;
-       struct iovec iov = {
-           .iov_base = nlmsghdr,
-           .iov_len = nlmsghdr->nlmsg_len,
-       };
-
-       struct msghdr msg = {
-               .msg_name = &nladdr,
-               .msg_namelen = sizeof(nladdr),
-               .msg_iov = &iov,
-               .msg_iovlen = 1,
-       };
-
-       memset(&nladdr, 0, sizeof(nladdr));
-       nladdr.nl_family = AF_NETLINK;
-       nladdr.nl_pid = 0;
-       nladdr.nl_groups = 0;
-
-again:
-       ret = recvmsg(handler->fd, &msg, 0);
-       if (ret < 0) {
-               if (errno == EINTR)
-                       goto again;
-
-               return -1;
-       }
-
-       if (!ret)
-               return 0;
-
-       if (msg.msg_flags & MSG_TRUNC && (ret == nlmsghdr->nlmsg_len))
-               return -EMSGSIZE;
-
-       return ret;
-}
-
-extern int nl_transaction(struct nl_handler *handler, struct nlmsghdr *request,
-                         struct nlmsghdr *answer)
-{
-       int ret;
-
-       ret = nl_send(handler, request);
-       if (ret < 0)
-               return ret;
-
-       ret = nl_recv(handler, answer);
-       if (ret < 0)
-               return ret;
-
-       if (answer->nlmsg_type == NLMSG_ERROR) {
-               struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(answer);
-               return err->error;
-       }
-
-       return 0;
-}
-
 int lxc_netns_set_nsid(int fd)
 {
        ssize_t ret;
@@ -3309,7 +3222,7 @@ int lxc_netns_set_nsid(int fd)
        addattr(hdr, 1024, __LXC_NETNSA_FD, &netns_fd, sizeof(netns_fd));
        addattr(hdr, 1024, __LXC_NETNSA_NSID, &ns_id, sizeof(ns_id));
 
-       ret = nl_transaction(&nlh, hdr, hdr);
+       ret = __netlink_transaction(&nlh, hdr, hdr);
        netlink_close(&nlh);
        if (ret < 0)
                return -1;
index c83c587e8c2625025ec4abb25da9212fd3dff070..2e97efcca4a447f5f582a904ea100c8b52064fa9 100644 (file)
@@ -171,20 +171,20 @@ extern void nlmsg_free(struct nlmsg *nlmsg)
        free(nlmsg);
 }
 
-extern int netlink_rcv(struct nl_handler *handler, struct nlmsg *answer)
+extern int __netlink_recv(struct nl_handler *handler, struct nlmsghdr *nlmsghdr)
 {
        int ret;
        struct sockaddr_nl nladdr;
        struct iovec iov = {
-               .iov_base = answer->nlmsghdr,
-               .iov_len = answer->nlmsghdr->nlmsg_len,
+           .iov_base = nlmsghdr,
+           .iov_len = nlmsghdr->nlmsg_len,
        };
 
        struct msghdr msg = {
-               .msg_name = &nladdr,
-               .msg_namelen = sizeof(nladdr),
-               .msg_iov = &iov,
-               .msg_iovlen = 1,
+           .msg_name = &nladdr,
+           .msg_namelen = sizeof(nladdr),
+           .msg_iov = &iov,
+           .msg_iovlen = 1,
        };
 
        memset(&nladdr, 0, sizeof(nladdr));
@@ -197,33 +197,38 @@ again:
        if (ret < 0) {
                if (errno == EINTR)
                        goto again;
-               return -errno;
+
+               return -1;
        }
 
        if (!ret)
                return 0;
 
-       if (msg.msg_flags & MSG_TRUNC &&
-           ret == answer->nlmsghdr->nlmsg_len)
+       if (msg.msg_flags & MSG_TRUNC && (ret == nlmsghdr->nlmsg_len))
                return -EMSGSIZE;
 
        return ret;
 }
 
-extern int netlink_send(struct nl_handler *handler, struct nlmsg *nlmsg)
+extern int netlink_rcv(struct nl_handler *handler, struct nlmsg *answer)
 {
+       return __netlink_recv(handler, answer->nlmsghdr);
+}
+
+extern int __netlink_send(struct nl_handler *handler, struct nlmsghdr *nlmsghdr)
+{
+       int ret;
        struct sockaddr_nl nladdr;
        struct iovec iov = {
-               .iov_base = nlmsg->nlmsghdr,
-               .iov_len = nlmsg->nlmsghdr->nlmsg_len,
+           .iov_base = nlmsghdr,
+           .iov_len = nlmsghdr->nlmsg_len,
        };
        struct msghdr msg = {
-               .msg_name = &nladdr,
-               .msg_namelen = sizeof(nladdr),
-               .msg_iov = &iov,
-               .msg_iovlen = 1,
+           .msg_name = &nladdr,
+           .msg_namelen = sizeof(nladdr),
+           .msg_iov = &iov,
+           .msg_iovlen = 1,
        };
-       int ret;
 
        memset(&nladdr, 0, sizeof(nladdr));
        nladdr.nl_family = AF_NETLINK;
@@ -232,32 +237,45 @@ extern int netlink_send(struct nl_handler *handler, struct nlmsg *nlmsg)
 
        ret = sendmsg(handler->fd, &msg, MSG_NOSIGNAL);
        if (ret < 0)
-               return -errno;
+               return -1;
 
        return ret;
 }
 
-extern int netlink_transaction(struct nl_handler *handler,
-                              struct nlmsg *request, struct nlmsg *answer)
+extern int netlink_send(struct nl_handler *handler, struct nlmsg *nlmsg)
+{
+       return __netlink_send(handler, nlmsg->nlmsghdr);
+}
+
+extern int __netlink_transaction(struct nl_handler *handler,
+                                struct nlmsghdr *request,
+                                struct nlmsghdr *answer)
 {
        int ret;
 
-       ret = netlink_send(handler, request);
+       ret = __netlink_send(handler, request);
        if (ret < 0)
                return ret;
 
-       ret = netlink_rcv(handler, answer);
+       ret = __netlink_recv(handler, answer);
        if (ret < 0)
                return ret;
 
-       if (answer->nlmsghdr->nlmsg_type == NLMSG_ERROR) {
-               struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(answer->nlmsghdr);
+       if (answer->nlmsg_type == NLMSG_ERROR) {
+               struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(answer);
                return err->error;
        }
 
        return 0;
 }
 
+extern int netlink_transaction(struct nl_handler *handler,
+                              struct nlmsg *request, struct nlmsg *answer)
+{
+       return __netlink_transaction(handler, request->nlmsghdr,
+                                    answer->nlmsghdr);
+}
+
 extern int netlink_open(struct nl_handler *handler, int protocol)
 {
        socklen_t socklen;
index 0bf62d5804ae27b90c5693771f8d781edbe41579..a00fc16df3626d27e105ed2373f4aeaf2eb698e2 100644 (file)
@@ -98,6 +98,7 @@ int netlink_close(struct nl_handler *handler);
  * Returns 0 on success, < 0 otherwise
  */
 int netlink_rcv(struct nl_handler *handler, struct nlmsg *nlmsg);
+int __netlink_recv(struct nl_handler *handler, struct nlmsghdr *nlmsg);
 
 /*
  * netlink_send: send a netlink message to the kernel. It is up
@@ -109,6 +110,7 @@ int netlink_rcv(struct nl_handler *handler, struct nlmsg *nlmsg);
  * Returns 0 on success, < 0 otherwise
  */
 int netlink_send(struct nl_handler *handler, struct nlmsg *nlmsg);
+int __netlink_send(struct nl_handler *handler, struct nlmsghdr *nlmsg);
 
 /*
  * netlink_transaction: send a request to the kernel and read the response.
@@ -123,6 +125,8 @@ int netlink_send(struct nl_handler *handler, struct nlmsg *nlmsg);
  */
 int netlink_transaction(struct nl_handler *handler,
                        struct nlmsg *request, struct nlmsg *anwser);
+int __netlink_transaction(struct nl_handler *handler, struct nlmsghdr *request,
+                         struct nlmsghdr *anwser);
 
 /*
  * nla_put_string: copy a null terminated string to a netlink message