summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-01-15 09:27:22 +0100
committerThomas Haller <thaller@redhat.com>2018-01-15 20:29:26 +0100
commita21a5558b1e50c05e0094dda2b76c8e128873366 (patch)
tree87820415b7551298ceb8d020837478ffd8f87e82
parentd7025818123631e893948f389ab2ec428359b238 (diff)
downloadNetworkManager-a21a5558b1e50c05e0094dda2b76c8e128873366.tar.gz
platform: move genl functions to nm-netlink.c
So they can be reused outside of wifi, like for implementing wireguard support.
-rw-r--r--src/platform/nm-netlink.c97
-rw-r--r--src/platform/nm-netlink.h17
-rw-r--r--src/platform/wifi/wifi-utils-nl80211.c97
3 files changed, 114 insertions, 97 deletions
diff --git a/src/platform/nm-netlink.c b/src/platform/nm-netlink.c
index 34128e54c7..45bc1cf75b 100644
--- a/src/platform/nm-netlink.c
+++ b/src/platform/nm-netlink.c
@@ -22,4 +22,101 @@
#include "nm-netlink.h"
+/*****************************************************************************
+ * Reimplementations/copied from libnl3/genl
+ *****************************************************************************/
+
+void *
+genlmsg_put (struct nl_msg *msg, uint32_t port, uint32_t seq, int family,
+ int hdrlen, int flags, uint8_t cmd, uint8_t version)
+{
+ struct nlmsghdr *nlh;
+ struct genlmsghdr hdr = {
+ .cmd = cmd,
+ .version = version,
+ };
+
+ nlh = nlmsg_put (msg, port, seq, family, GENL_HDRLEN + hdrlen, flags);
+ if (nlh == NULL)
+ return NULL;
+
+ memcpy (nlmsg_data (nlh), &hdr, sizeof (hdr));
+
+ return (char *) nlmsg_data (nlh) + GENL_HDRLEN;
+}
+
+void *
+genlmsg_data (const struct genlmsghdr *gnlh)
+{
+ return ((unsigned char *) gnlh + GENL_HDRLEN);
+}
+
+void *
+genlmsg_user_hdr (const struct genlmsghdr *gnlh)
+{
+ return genlmsg_data (gnlh);
+}
+
+struct genlmsghdr *
+genlmsg_hdr (struct nlmsghdr *nlh)
+{
+ return nlmsg_data (nlh);
+}
+
+void *
+genlmsg_user_data (const struct genlmsghdr *gnlh, const int hdrlen)
+{
+ return (char *) genlmsg_user_hdr (gnlh) + NLMSG_ALIGN (hdrlen);
+}
+
+struct nlattr *
+genlmsg_attrdata (const struct genlmsghdr *gnlh, int hdrlen)
+{
+ return genlmsg_user_data (gnlh, hdrlen);
+}
+
+int
+genlmsg_len (const struct genlmsghdr *gnlh)
+{
+ const struct nlmsghdr *nlh;
+
+ nlh = (const struct nlmsghdr *) ((const unsigned char *) gnlh - NLMSG_HDRLEN);
+ return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
+}
+
+int
+genlmsg_attrlen (const struct genlmsghdr *gnlh, int hdrlen)
+{
+ return genlmsg_len (gnlh) - NLMSG_ALIGN (hdrlen);
+}
+
+int
+genlmsg_valid_hdr (struct nlmsghdr *nlh, int hdrlen)
+{
+ struct genlmsghdr *ghdr;
+
+ if (!nlmsg_valid_hdr (nlh, GENL_HDRLEN))
+ return 0;
+
+ ghdr = nlmsg_data (nlh);
+ if (genlmsg_len (ghdr) < NLMSG_ALIGN (hdrlen))
+ return 0;
+
+ return 1;
+}
+
+int
+genlmsg_parse (struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[],
+ int maxtype, const struct nla_policy *policy)
+{
+ struct genlmsghdr *ghdr;
+
+ if (!genlmsg_valid_hdr (nlh, hdrlen))
+ return -NLE_MSG_TOOSHORT;
+
+ ghdr = nlmsg_data (nlh);
+ return nla_parse (tb, maxtype, genlmsg_attrdata (ghdr, hdrlen),
+ genlmsg_attrlen (ghdr, hdrlen), policy);
+}
+
/*****************************************************************************/
diff --git a/src/platform/nm-netlink.h b/src/platform/nm-netlink.h
index f94e6de7ea..64fcbfa4ad 100644
--- a/src/platform/nm-netlink.h
+++ b/src/platform/nm-netlink.h
@@ -53,6 +53,23 @@ _nl_nla_parse_nested (struct nlattr *tb[], int maxtype, struct nlattr *nla,
#define nla_parse_nested(...) _nl_nla_parse_nested(__VA_ARGS__)
/*****************************************************************************
+ * Reimplementations/copied from libnl3/genl
+ *****************************************************************************/
+
+void *genlmsg_put (struct nl_msg *msg, uint32_t port, uint32_t seq, int family,
+ int hdrlen, int flags, uint8_t cmd, uint8_t version);
+void *genlmsg_data (const struct genlmsghdr *gnlh);
+void *genlmsg_user_hdr (const struct genlmsghdr *gnlh);
+struct genlmsghdr *genlmsg_hdr (struct nlmsghdr *nlh);
+void *genlmsg_user_data (const struct genlmsghdr *gnlh, const int hdrlen);
+struct nlattr *genlmsg_attrdata (const struct genlmsghdr *gnlh, int hdrlen);
+int genlmsg_len (const struct genlmsghdr *gnlh);
+int genlmsg_attrlen (const struct genlmsghdr *gnlh, int hdrlen);
+int genlmsg_valid_hdr (struct nlmsghdr *nlh, int hdrlen);
+int genlmsg_parse (struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[],
+ int maxtype, const struct nla_policy *policy);
+
+/*****************************************************************************
* helpers
*****************************************************************************/
diff --git a/src/platform/wifi/wifi-utils-nl80211.c b/src/platform/wifi/wifi-utils-nl80211.c
index 6125461175..a2082b05d7 100644
--- a/src/platform/wifi/wifi-utils-nl80211.c
+++ b/src/platform/wifi/wifi-utils-nl80211.c
@@ -47,103 +47,6 @@
} G_STMT_END
/*****************************************************************************
- * Copied from libnl3/genl:
- *****************************************************************************/
-
-static void *
-genlmsg_put (struct nl_msg *msg, uint32_t port, uint32_t seq, int family,
- int hdrlen, int flags, uint8_t cmd, uint8_t version)
-{
- struct nlmsghdr *nlh;
- struct genlmsghdr hdr = {
- .cmd = cmd,
- .version = version,
- };
-
- nlh = nlmsg_put (msg, port, seq, family, GENL_HDRLEN + hdrlen, flags);
- if (nlh == NULL)
- return NULL;
-
- memcpy (nlmsg_data (nlh), &hdr, sizeof (hdr));
-
- return (char *) nlmsg_data (nlh) + GENL_HDRLEN;
-}
-
-static void *
-genlmsg_data (const struct genlmsghdr *gnlh)
-{
- return ((unsigned char *) gnlh + GENL_HDRLEN);
-}
-
-static void *
-genlmsg_user_hdr (const struct genlmsghdr *gnlh)
-{
- return genlmsg_data (gnlh);
-}
-
-static struct genlmsghdr *
-genlmsg_hdr (struct nlmsghdr *nlh)
-{
- return nlmsg_data (nlh);
-}
-
-static void *
-genlmsg_user_data (const struct genlmsghdr *gnlh, const int hdrlen)
-{
- return (char *) genlmsg_user_hdr (gnlh) + NLMSG_ALIGN (hdrlen);
-}
-
-static struct nlattr *
-genlmsg_attrdata (const struct genlmsghdr *gnlh, int hdrlen)
-{
- return genlmsg_user_data (gnlh, hdrlen);
-}
-
-static int
-genlmsg_len (const struct genlmsghdr *gnlh)
-{
- const struct nlmsghdr *nlh;
-
- nlh = (const struct nlmsghdr *) ((const unsigned char *) gnlh - NLMSG_HDRLEN);
- return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
-}
-
-static int
-genlmsg_attrlen (const struct genlmsghdr *gnlh, int hdrlen)
-{
- return genlmsg_len (gnlh) - NLMSG_ALIGN (hdrlen);
-}
-
-static int
-genlmsg_valid_hdr (struct nlmsghdr *nlh, int hdrlen)
-{
- struct genlmsghdr *ghdr;
-
- if (!nlmsg_valid_hdr (nlh, GENL_HDRLEN))
- return 0;
-
- ghdr = nlmsg_data (nlh);
- if (genlmsg_len (ghdr) < NLMSG_ALIGN (hdrlen))
- return 0;
-
- return 1;
-}
-
-static int
-genlmsg_parse (struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[],
- int maxtype, const struct nla_policy *policy)
-{
- struct genlmsghdr *ghdr;
-
- if (!genlmsg_valid_hdr (nlh, hdrlen))
- return -NLE_MSG_TOOSHORT;
-
- ghdr = nlmsg_data (nlh);
- return nla_parse (tb, maxtype, genlmsg_attrdata (ghdr, hdrlen),
- genlmsg_attrlen (ghdr, hdrlen), policy);
-}
-
-/*****************************************************************************
* Reimplementation of libnl3/genl functions:
*****************************************************************************/