Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support ELL 0.68 l_netlink_message API. #303

Merged
merged 4 commits into from
Sep 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
matttbe marked this conversation as resolved.
Show resolved Hide resolved

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
Loading