From: Jiri Pirko 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 --- configure | 22 ++++++++++++++++++++++ include/mnl_utils.h | 4 ++++ lib/mnl_utils.c | 17 +++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/configure b/configure index 7437db4f22a8..ebc0d97a6f26 100755 --- a/configure +++ b/configure @@ -366,6 +366,24 @@ check_tirpc() fi } +have_mnl_attr_get_uint() +{ + cat >$TMPDIR/mnl_attr_get_uint_test.c < +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 diff --git a/include/mnl_utils.h b/include/mnl_utils.h index 0ddf2932db62..4df9e398e591 100644 --- a/include/mnl_utils.h +++ b/include/mnl_utils.h @@ -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__ */ diff --git a/lib/mnl_utils.c b/lib/mnl_utils.c index 5f6671bf94cc..43b4cd1a9e40 100644 --- a/lib/mnl_utils.c +++ b/lib/mnl_utils.c @@ -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 -- 2.51.1