Skip to content

Commit

Permalink
Support ELL 0.68 l_netlink_message API. (#303)
Browse files Browse the repository at this point in the history
* configure: Check for l_netlink_message_new_sized()

ELL 0.68 introduced a non-backward compatible change to its API by
introducing a new l_netlink_message API to simplify use of the
l_netlink_send() function.  Check for the existence of the new API in
the mptcpd configure script.

* network_monitor: Support ELL l_netlink_message API

Support both the pre- and post- ELL 0.68 versions of l_netlink_send()
function.

* network_monitor: Refactor l_netlink_send() calls.

Refactor #ifdef blocks containing calls to the pre- and post-0.68
ELL l_netlink_send() calls to a separate helper functions.  This
simplifies the code, and obviates the need to have an #ifdef block
each time l_netlink_send() is called.  Many thanks to Matthieu Baerts
for making this suggestion.

* configure: Bump copyright year.
  • Loading branch information
Ossama Othman authored Sep 14, 2024
1 parent a4e7b65 commit ffa276f
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 26 deletions.
8 changes: 7 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down Expand Up @@ -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

# ---------------------------------------------------------------
Expand Down
95 changes: 70 additions & 25 deletions lib/network_monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
// -------------------------------------------------------------------
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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.");

/*
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit ffa276f

Please sign in to comment.