summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanielle Ratson <danieller@nvidia.com>2024-07-31 09:35:51 +0300
committerPhil Sutter <phil@nwl.cc>2024-07-31 09:12:57 +0200
commit102942be401a99943b2c68981b238dadfa788f2d (patch)
treefc42fd7427ce564252a39b12c68e5798296016f7
parent754c9de5ea1bea821495523cf01989299552e524 (diff)
src: attr: Add mnl_attr_get_uint() function
NLA_UINT attributes have a 4-byte payload if possible, and an 8-byte one if necessary. There are some NLA_UINT attributes that lack an appropriate getter function. Add a function mnl_attr_get_uint() to cover that extract these. Since we need to dispatch on length anyway, make the getter truly universal by supporting also u8 and u16. Signed-off-by: Danielle Ratson <danieller@nvidia.com> Signed-off-by: Phil Sutter <phil@nwl.cc>
-rw-r--r--include/libmnl/libmnl.h1
-rw-r--r--src/attr.c22
-rw-r--r--src/libmnl.map4
3 files changed, 27 insertions, 0 deletions
diff --git a/include/libmnl/libmnl.h b/include/libmnl/libmnl.h
index 4bd0b92..9c03280 100644
--- a/include/libmnl/libmnl.h
+++ b/include/libmnl/libmnl.h
@@ -92,6 +92,7 @@ extern uint8_t mnl_attr_get_u8(const struct nlattr *attr);
extern uint16_t mnl_attr_get_u16(const struct nlattr *attr);
extern uint32_t mnl_attr_get_u32(const struct nlattr *attr);
extern uint64_t mnl_attr_get_u64(const struct nlattr *attr);
+extern uint64_t mnl_attr_get_uint(const struct nlattr *attr);
extern const char *mnl_attr_get_str(const struct nlattr *attr);
/* TLV attribute putters */
diff --git a/src/attr.c b/src/attr.c
index bc39df4..399318e 100644
--- a/src/attr.c
+++ b/src/attr.c
@@ -390,6 +390,28 @@ EXPORT_SYMBOL uint64_t mnl_attr_get_u64(const struct nlattr *attr)
}
/**
+ * mnl_attr_get_uint - returns 64-bit unsigned integer attribute.
+ * \param attr pointer to netlink attribute
+ *
+ * This function returns the 64-bit value of the attribute payload.
+ */
+EXPORT_SYMBOL uint64_t mnl_attr_get_uint(const struct nlattr *attr)
+{
+ switch (mnl_attr_get_payload_len(attr)) {
+ case sizeof(uint8_t):
+ return mnl_attr_get_u8(attr);
+ case sizeof(uint16_t):
+ return mnl_attr_get_u16(attr);
+ case sizeof(uint32_t):
+ return mnl_attr_get_u32(attr);
+ case sizeof(uint64_t):
+ return mnl_attr_get_u64(attr);
+ }
+
+ return -1ULL;
+}
+
+/**
* mnl_attr_get_str - get pointer to string attribute
* \param attr pointer to netlink attribute
*
diff --git a/src/libmnl.map b/src/libmnl.map
index e5920e5..cd58863 100644
--- a/src/libmnl.map
+++ b/src/libmnl.map
@@ -77,3 +77,7 @@ LIBMNL_1.2 {
mnl_socket_open2;
mnl_socket_fdopen;
} LIBMNL_1.1;
+
+LIBMNL_1.3 {
+ mnl_attr_get_uint;
+} LIBMNL_1.2;