diff --git a/configure.ac b/configure.ac index fdb2055b..c5d6986f 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. # -# Copyright (c) 2017-2023, Intel Corporation +# Copyright (c) 2017-2024, Intel Corporation AC_PREREQ([2.69]) AC_INIT([mptcpd], @@ -265,6 +265,12 @@ AC_CHECK_FUNC([l_hashmap_replace], [AC_DEFINE([HAVE_L_HASHMAP_REPLACE], [], [ELL has l_hashmap_replace()])]) + +dnl l_netlink_message_new_sized() was introduced in ELL v0.68. +AC_CHECK_FUNC([l_netlink_message_new_sized], + [AC_DEFINE([HAVE_L_NETLINK_MESSAGE_NEW_SIZED], + [], + [ELL has l_netlink_message_new_sized()])]) LIBS=$mptcpd_save_libs # --------------------------------------------------------------- diff --git a/lib/network_monitor.c b/lib/network_monitor.c index 1861373c..b521e3e6 100644 --- a/lib/network_monitor.c +++ b/lib/network_monitor.c @@ -4,7 +4,7 @@ * * @brief mptcpd network device monitoring. * - * Copyright (c) 2017-2022, Intel Corporation + * Copyright (c) 2017-2022, 2024, Intel Corporation */ #ifdef HAVE_CONFIG_H @@ -95,6 +95,51 @@ struct mptcpd_nm bool monitor_loopback; }; +// ------------------------------------------------------------------- +// Helper Functions +// ------------------------------------------------------------------- + +/** + * @brief Wrap different versions of ELL @c l_netlink_send(). + * + * ELL 0.68 changed the API for @c l_netlink_send(). This helper + * function wraps the two different function calls so that mptcpd will + * work with both pre- and post-0.68 @c l_netlink_send() APIs. + */ +static unsigned int netlink_send(struct l_netlink *netlink, + uint16_t type, + uint16_t flags, + void const *data, + uint32_t len, + l_netlink_command_func_t function, + void *user_data, + l_netlink_destroy_func_t destroy) +{ +#ifdef HAVE_L_NETLINK_MESSAGE_NEW_SIZED + // ELL >= 0.68 + struct l_netlink_message *const message = + l_netlink_message_new_sized(type, flags, len); + + l_netlink_message_add_header(message, data, len); + + return l_netlink_send(netlink, + message, + function, + user_data, + destroy); +#else + // ELL < 0.68 + return l_netlink_send(netlink, + type, + flags, + data, + len, + function, + user_data, + destroy); +#endif +} + // ------------------------------------------------------------------- // Network Address Information Handling // ------------------------------------------------------------------- @@ -1015,14 +1060,14 @@ static void check_default_route(struct nm_addr_info *ai) */ mptcpd_addr_get(ai); - if (l_netlink_send(ai->nm->rtnl, - RTM_GETROUTE, - 0, - &store, - buf - (char *) &store, - handle_rtm_getroute, - ai, - NULL) == 0) { + if (netlink_send(ai->nm->rtnl, + RTM_GETROUTE, + 0, + &store, + buf - (char *) &store, + handle_rtm_getroute, + ai, + NULL) == 0) { l_debug("Route lookup failed"); mptcpd_addr_put(ai); } @@ -1388,14 +1433,14 @@ static void send_getaddr_command(void *user_data) // Get IP addresses. struct ifaddrmsg addr_msg = { .ifa_family = AF_UNSPEC }; - if (l_netlink_send(nm->rtnl, - RTM_GETADDR, - NLM_F_DUMP, - &addr_msg, - sizeof(addr_msg), - handle_rtm_getaddr, - nm, - NULL) == 0) { + if (netlink_send(nm->rtnl, + RTM_GETADDR, + NLM_F_DUMP, + &addr_msg, + sizeof(addr_msg), + handle_rtm_getaddr, + nm, + NULL) == 0) { l_error("Unable to obtain IP addresses."); /* @@ -1481,14 +1526,14 @@ struct mptcpd_nm *mptcpd_nm_create(uint32_t flags) * resulted in an EBUSY error. */ struct ifinfomsg link_msg = { .ifi_family = AF_UNSPEC }; - if (l_netlink_send(nm->rtnl, - RTM_GETLINK, - NLM_F_DUMP, - &link_msg, - sizeof(link_msg), - handle_rtm_getlink, - nm, - send_getaddr_command) + if (netlink_send(nm->rtnl, + RTM_GETLINK, + NLM_F_DUMP, + &link_msg, + sizeof(link_msg), + handle_rtm_getlink, + nm, + send_getaddr_command) == 0) { l_error("Unable to obtain network devices."); mptcpd_nm_destroy(nm);