Skip to content
Open
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
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ AC_INIT([mptcpd],
# Interfaces changed: CURRENT++ REVISION=0
# added: CURRENT++ REVISION=0 AGE++
# removed: CURRENT++ REVISION=0 AGE=0
LIB_CURRENT=4
LIB_CURRENT=5
LIB_REVISION=0
LIB_AGE=1

Expand Down
3 changes: 3 additions & 0 deletions include/linux/mptcp_upstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
#define MPTCP_INFO_FLAG_FALLBACK _BITUL(0)
#define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED _BITUL(1)

#define MPTCP_PM_EV_FLAG_DENY_JOIN_ID0 _BITUL(0)
#define MPTCP_PM_EV_FLAG_SERVER_SIDE _BITUL(1)

#define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0)
#define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)
#define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2)
Expand Down
4 changes: 2 additions & 2 deletions include/linux/mptcp_upstream_pm.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
* good time to allocate memory and send ADD_ADDR if needed. Depending on the
* traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED
* is sent. Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6,
* sport, dport, server-side.
* sport, dport, [server-side], [flags].
* @MPTCP_EVENT_ESTABLISHED: A MPTCP connection is established (can start new
* subflows). Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6,
* sport, dport, server-side.
* sport, dport, [server-side], [flags].
* @MPTCP_EVENT_CLOSED: A MPTCP connection has stopped. Attribute: token.
* @MPTCP_EVENT_ANNOUNCED: A new address has been announced by the peer.
* Attributes: token, rem_id, family, daddr4 | daddr6 [, dport].
Expand Down
8 changes: 8 additions & 0 deletions include/mptcpd/plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,13 +145,17 @@ struct mptcpd_plugin_ops
* @param[in] server_side @c true if this peer was the
* listener (server), @c false if this
* peer initiated the connection.
* @param[in] deny_join_id0 @c true if the other peer requested not to
* create a new subflow to the initial IP
* address and port
* @param[in] pm Opaque pointer to mptcpd path
* manager object.
*/
void (*new_connection)(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm);

/**
Expand All @@ -163,13 +167,17 @@ struct mptcpd_plugin_ops
* @param[in] server_side @c true if this peer was the
* listener (server), @c false if this
* peer initiated the connection.
* @param[in] deny_join_id0 @c true if the other peer requested not to
* create a new subflow to the initial IP
* address and port
* @param[in] pm Opaque pointer to mptcpd path
* manager object.
*/
void (*connection_established)(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm);

/**
Expand Down
4 changes: 4 additions & 0 deletions include/mptcpd/private/plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ MPTCPD_API void mptcpd_plugin_unload(struct mptcpd_pm *pm);
* @param[in] laddr Local address information.
* @param[in] raddr Remote address information.
* @param[in] server_side Server side connection flag.
* @param[in] deny_join_id0 No MPJ to the initial address and port.
* @param[in] pm Opaque pointer to mptcpd path manager object.
*/
MPTCPD_API void mptcpd_plugin_new_connection(
Expand All @@ -68,6 +69,7 @@ MPTCPD_API void mptcpd_plugin_new_connection(
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm);

/**
Expand All @@ -77,13 +79,15 @@ MPTCPD_API void mptcpd_plugin_new_connection(
* @param[in] laddr Local address information.
* @param[in] raddr Remote address information.
* @param[in] server_side Server side connection flag.
* @param[in] deny_join_id0 No MPJ to the initial address and port.
* @param[in] pm Opaque pointer to mptcpd path manager object.
*/
MPTCPD_API void mptcpd_plugin_connection_established(
mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm);

/**
Expand Down
10 changes: 9 additions & 1 deletion lib/plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@ void mptcpd_plugin_new_connection(char const *name,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
struct mptcpd_plugin_ops const *const ops = name_to_ops(name);
Expand All @@ -586,13 +587,19 @@ void mptcpd_plugin_new_connection(char const *name,
l_error("Unable to map connection to plugin.");

if (ops && ops->new_connection)
ops->new_connection(token, laddr, raddr, server_side, pm);
ops->new_connection(token,
laddr,
raddr,
server_side,
deny_join_id0,
pm);
}

void mptcpd_plugin_connection_established(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
struct mptcpd_plugin_ops const *const ops = token_to_ops(token);
Expand All @@ -602,6 +609,7 @@ void mptcpd_plugin_connection_established(mptcpd_token_t token,
laddr,
raddr,
server_side,
deny_join_id0,
pm);
}

Expand Down
4 changes: 4 additions & 0 deletions plugins/path_managers/sspi.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,10 +542,12 @@ static void sspi_new_connection(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) raddr;
(void) server_side;
(void) deny_join_id0;

/**
* @note Because we directly store connection tokens in a
Expand Down Expand Up @@ -604,12 +606,14 @@ static void sspi_connection_established(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) token;
(void) laddr;
(void) raddr;
(void) server_side;
(void) deny_join_id0;
(void) pm;

/**
Expand Down
24 changes: 21 additions & 3 deletions src/path_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
* Copyright (c) 2017-2022, Intel Corporation
*/

#include "linux/mptcp_upstream_pm.h"
#ifdef HAVE_CONFIG_H
# include <mptcpd/private/config.h>
#endif
Expand Down Expand Up @@ -133,6 +134,9 @@ struct pm_event_attrs

/// Server side connection event (boolean)
uint8_t const *server_side;

/// Event flags
uint16_t const *flags;
};

/**
Expand Down Expand Up @@ -196,8 +200,10 @@ static void parse_netlink_attributes(struct l_genl_msg *msg,
case MPTCP_ATTR_SERVER_SIDE:
MPTCP_GET_NL_ATTR(data, len, attrs->server_side);
break;
case MPTCP_ATTR_FAMILY:
case MPTCP_ATTR_FLAGS:
MPTCP_GET_NL_ATTR(data, len, attrs->flags);
break;
case MPTCP_ATTR_FAMILY:
case MPTCP_ATTR_TIMEOUT:
case MPTCP_ATTR_RESET_REASON:
case MPTCP_ATTR_RESET_FLAGS:
Expand Down Expand Up @@ -252,13 +258,19 @@ static void handle_connection_created(struct pm_event_attrs const *attrs,

static char const *const pm_name = NULL;
bool const server_side =
(attrs->server_side != NULL ? *attrs->server_side : false);
(attrs->flags != NULL &&
*attrs->flags & MPTCP_PM_EV_FLAG_SERVER_SIDE) ||
(attrs->server_side != NULL && *attrs->server_side);
bool const deny_join_id0 =
attrs->flags != NULL &&
*attrs->flags & MPTCP_PM_EV_FLAG_DENY_JOIN_ID0;

mptcpd_plugin_new_connection(pm_name,
*attrs->token,
(struct sockaddr *) &laddr,
(struct sockaddr *) &raddr,
server_side,
deny_join_id0,
pm);
}

Expand Down Expand Up @@ -304,12 +316,18 @@ static void handle_connection_established(struct pm_event_attrs const *attrs,

// Assume server_side is false if event attribute is unavailable.
bool const server_side =
(attrs->server_side != NULL ? *attrs->server_side : false);
(attrs->flags != NULL &&
*attrs->flags & MPTCP_PM_EV_FLAG_SERVER_SIDE) ||
(attrs->server_side != NULL && *attrs->server_side);
bool const deny_join_id0 =
attrs->flags != NULL &&
*attrs->flags & MPTCP_PM_EV_FLAG_DENY_JOIN_ID0;

mptcpd_plugin_connection_established(*attrs->token,
(struct sockaddr *) &laddr,
(struct sockaddr *) &raddr,
server_side,
deny_join_id0,
pm);
}

Expand Down
2 changes: 2 additions & 0 deletions tests/lib/call_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@ void call_plugin_ops(struct plugin_call_count const *count,
args->laddr,
args->raddr,
args->server_side,
args->deny_join_id0,
args->pm);

for (int i = 0; i < count->connection_established; ++i)
mptcpd_plugin_connection_established(args->token,
args->laddr,
args->raddr,
args->server_side,
args->deny_join_id0,
args->pm);

for (int i = 0; i < count->new_address; ++i)
Expand Down
6 changes: 6 additions & 0 deletions tests/lib/test-plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,19 +151,22 @@ static mptcpd_aid_t const test_laddr_id_1 = 0x34;
static mptcpd_aid_t const test_raddr_id_1 = 0x56;
static bool const test_backup_1 = true;
static bool const test_server_side_1 = true;
static bool const test_deny_join_id0_1 = true;


static mptcpd_token_t const test_token_2 = 0x23456789;
static mptcpd_aid_t const test_laddr_id_2 = 0x23;
static mptcpd_aid_t const test_raddr_id_2 = 0x45;
static bool const test_backup_2 = false;
static bool const test_server_side_2 = true;
static bool const test_deny_join_id0_2 = true;

static mptcpd_token_t const test_token_4 = 0x34567890;
static mptcpd_aid_t const test_laddr_id_4 = 0x90;
static mptcpd_aid_t const test_raddr_id_4 = 0x01;
static bool const test_backup_4 = true;
static bool const test_server_side_4 = false;
static bool const test_deny_join_id0_4 = false;

// For verifying that a plugin will not be dispatched.
static mptcpd_token_t const test_bad_token = 0xFFFFFFFF;
Expand Down Expand Up @@ -306,6 +309,9 @@ struct plugin_call_args
/// Server side connection flag.
bool server_side;

/// Remote peer deny a MP_JOIN to the initial IP address and port
bool deny_join_id0;

/// Mptcpd path manager object.
struct mptcpd_pm *const pm;
};
Expand Down
4 changes: 4 additions & 0 deletions tests/plugins/noop/noop.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@ static void plugin_noop_new_connection(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) token;
(void) laddr;
(void) raddr;
(void) server_side;
(void) deny_join_id0;
(void) pm;
}

Expand All @@ -34,12 +36,14 @@ static void plugin_noop_connection_established(
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) token;
(void) laddr;
(void) raddr;
(void) server_side;
(void) deny_join_id0;
(void) pm;
}

Expand Down
4 changes: 4 additions & 0 deletions tests/plugins/priority/one.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ static void plugin_one_new_connection(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) pm;
Expand All @@ -47,6 +48,7 @@ static void plugin_one_new_connection(mptcpd_token_t token,
assert(sockaddr_is_equal(laddr, local_addr));
assert(sockaddr_is_equal(raddr, remote_addr));
assert(server_side == test_server_side_1);
assert(deny_join_id0 == test_deny_join_id0_1);

++call_count.new_connection;
}
Expand All @@ -56,6 +58,7 @@ static void plugin_one_connection_established(
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) pm;
Expand All @@ -66,6 +69,7 @@ static void plugin_one_connection_established(
assert(sockaddr_is_equal(laddr, local_addr));
assert(sockaddr_is_equal(raddr, remote_addr));
assert(server_side == test_server_side_1);
assert(deny_join_id0 == test_deny_join_id0_1);

++call_count.connection_established;
}
Expand Down
4 changes: 4 additions & 0 deletions tests/plugins/priority/two.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ static void plugin_two_new_connection(mptcpd_token_t token,
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) pm;
Expand All @@ -47,6 +48,7 @@ static void plugin_two_new_connection(mptcpd_token_t token,
assert(sockaddr_is_equal(laddr, local_addr));
assert(sockaddr_is_equal(raddr, remote_addr));
assert(server_side == test_server_side_2);
assert(deny_join_id0 == test_deny_join_id0_2);

++call_count.new_connection;
}
Expand All @@ -56,6 +58,7 @@ static void plugin_two_connection_established(
struct sockaddr const *laddr,
struct sockaddr const *raddr,
bool server_side,
bool deny_join_id0,
struct mptcpd_pm *pm)
{
(void) pm;
Expand All @@ -66,6 +69,7 @@ static void plugin_two_connection_established(
assert(sockaddr_is_equal(laddr, local_addr));
assert(sockaddr_is_equal(raddr, remote_addr));
assert(server_side == test_server_side_2);
assert(deny_join_id0 == test_deny_join_id0_2);

++call_count.connection_established;
}
Expand Down
Loading