]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
mnl: add fallback implementation for mnl_attr_get_uint()
authorJiri Pirko <jiri@nvidia.com>
Mon, 16 Mar 2026 15:44:17 +0000 (16:44 +0100)
committerDavid Ahern <dsahern@kernel.org>
Mon, 23 Mar 2026 00:08:48 +0000 (18:08 -0600)
libmnl introduced mnl_attr_get_uint() to handle NLA_UINT
variable-width attributes. Add a configure check to detect it
and provide a fallback implementation for older libmnl versions.

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

index 7437db4f22a827920e3dd23df4e6a0077d3932aa..ebc0d97a6f26c80070bb29b1e58f62365e07aaee 100755 (executable)
--- a/configure
+++ b/configure
@@ -366,6 +366,24 @@ check_tirpc()
        fi
 }
 
+have_mnl_attr_get_uint()
+{
+    cat >$TMPDIR/mnl_attr_get_uint_test.c <<EOF
+#include <libmnl/libmnl.h>
+int main(int argc, char **argv)
+{
+       return !!mnl_attr_get_uint(NULL);
+}
+EOF
+
+    $CC -I$INCLUDE $(${PKG_CONFIG} libmnl --cflags --libs 2>/dev/null) \
+           -o $TMPDIR/mnl_attr_get_uint_test $TMPDIR/mnl_attr_get_uint_test.c >/dev/null 2>&1
+    local ret=$?
+
+    rm -f $TMPDIR/mnl_attr_get_uint_test.c $TMPDIR/mnl_attr_get_uint_test
+    return $ret
+}
+
 check_mnl()
 {
        if ${PKG_CONFIG} libmnl --exists; then
@@ -374,6 +392,10 @@ check_mnl()
 
                echo 'CFLAGS += -DHAVE_LIBMNL' "$(${PKG_CONFIG} libmnl --cflags)" >>$CONFIG
                echo 'LDLIBS +=' "$(${PKG_CONFIG} libmnl --libs)" >> $CONFIG
+
+               if have_mnl_attr_get_uint; then
+                       echo "CFLAGS += -DHAVE_MNL_ATTR_GET_UINT" >>$CONFIG
+               fi
        else
                echo "no"
        fi
index 0ddf2932db62e26345bbcd27a467daf4ea41d021..4df9e398e59165fe9a82c08632b3cbfd7f19c3fb 100644 (file)
@@ -33,4 +33,8 @@ int mnlu_gen_socket_recv_run(struct mnlu_gen_socket *nlg, mnl_cb_t cb,
                             void *data);
 int mnlu_gen_cmd_dump_policy(struct mnlu_gen_socket *nlg, uint8_t cmd);
 
+#ifndef HAVE_MNL_ATTR_GET_UINT
+uint64_t mnl_attr_get_uint(const struct nlattr *attr);
+#endif
+
 #endif /* __MNL_UTILS_H__ */
index 5f6671bf94cc50531ea1fa3542f87866026d9259..43b4cd1a9e40d41ac23c5a48f248a776a195bbf2 100644 (file)
@@ -381,3 +381,20 @@ int mnlu_gen_cmd_dump_policy(struct mnlu_gen_socket *nlg, uint8_t cmd)
 
        return 0;
 }
+
+#ifndef HAVE_MNL_ATTR_GET_UINT
+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;
+}
+#endif