* [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support
@ 2021-07-21 14:31 Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Geliang Tang
2021-07-22 15:30 ` [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support Matthieu Baerts
0 siblings, 2 replies; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Implement the in-kernel fullmesh path manager like on the mptcp.org
kernel.
v2:
- Implement the fullmesh mode as an extension to the netlink PM, not a
standalone PM as Paolo suggested.
- drop duplicate code.
- add a new per endpoint flag MPTCP_PM_ADDR_FLAG_FULLMESH.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/193
Geliang Tang (10):
mptcp: add a new sysctl fullmesh_enabled
mptcp: register ipv4 addr notifier
mptcp: register ipv6 addr notifier
mptcp: add netdev up event handler
mptcp: invoke mptcp_nl_remove_subflow_and_signal_addr in rcu_work
mptcp: add netdev down event handler
mptcp: add proc file local_addr_list
selftests: mptcp: print the fullmesh flag
selftests: mptcp: add fullmesh testcases
selftests: mptcp: del uncontinuous removing ids
Documentation/networking/mptcp-sysctl.rst | 8 ++
include/uapi/linux/mptcp.h | 1 +
net/mptcp/Kconfig | 10 ++
net/mptcp/Makefile | 1 +
net/mptcp/ctrl.c | 16 +++
net/mptcp/pm.c | 3 +
net/mptcp/pm_fullmesh.c | 94 ++++++++++++++
net/mptcp/pm_netlink.c | 116 +++++++++++++++++-
net/mptcp/protocol.h | 6 +
.../testing/selftests/net/mptcp/mptcp_join.sh | 91 +++++++++++++-
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 7 ++
11 files changed, 342 insertions(+), 11 deletions(-)
create mode 100644 net/mptcp/pm_fullmesh.c
--
2.31.1
^ permalink raw reply [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled
2021-07-21 14:31 [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Geliang Tang
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Matthieu Baerts
2021-07-22 15:30 ` [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support Matthieu Baerts
1 sibling, 2 replies; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added a new sysctl, named fullmesh_enabled, to control whether
the fullmesh path manager mode can be enabled.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
Documentation/networking/mptcp-sysctl.rst | 8 ++++++++
net/mptcp/ctrl.c | 16 ++++++++++++++++
net/mptcp/protocol.h | 1 +
3 files changed, 25 insertions(+)
diff --git a/Documentation/networking/mptcp-sysctl.rst b/Documentation/networking/mptcp-sysctl.rst
index b0d4da71e68e..7e8350cbb042 100644
--- a/Documentation/networking/mptcp-sysctl.rst
+++ b/Documentation/networking/mptcp-sysctl.rst
@@ -57,3 +57,11 @@ stale_loss_cnt - INTEGER
This is a per-namespace sysctl.
Default: 4
+
+fullmesh_enabled - BOOLEAN
+ Control whether the fullmesh path manager mode can be enabled.
+
+ The fullmesh path manager mode can be enabled if the value it nonzero.
+ This is a per-namespace sysctl.
+
+ Default: 0
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
index 8b235468c88f..432a859e9153 100644
--- a/net/mptcp/ctrl.c
+++ b/net/mptcp/ctrl.c
@@ -26,6 +26,7 @@ struct mptcp_pernet {
u8 mptcp_enabled;
u8 checksum_enabled;
u8 allow_join_initial_addr_port;
+ u8 fullmesh_enabled;
};
static struct mptcp_pernet *mptcp_get_pernet(const struct net *net)
@@ -58,6 +59,11 @@ unsigned int mptcp_stale_loss_cnt(const struct net *net)
return mptcp_get_pernet(net)->stale_loss_cnt;
}
+int mptcp_is_fullmesh_enabled(struct net *net)
+{
+ return mptcp_get_pernet(net)->fullmesh_enabled;
+}
+
static void mptcp_pernet_set_defaults(struct mptcp_pernet *pernet)
{
pernet->mptcp_enabled = 1;
@@ -65,6 +71,7 @@ static void mptcp_pernet_set_defaults(struct mptcp_pernet *pernet)
pernet->checksum_enabled = 0;
pernet->allow_join_initial_addr_port = 1;
pernet->stale_loss_cnt = 4;
+ pernet->fullmesh_enabled = 0;
}
#ifdef CONFIG_SYSCTL
@@ -108,6 +115,14 @@ static struct ctl_table mptcp_sysctl_table[] = {
.mode = 0644,
.proc_handler = proc_douintvec_minmax,
},
+ {
+ .procname = "fullmesh_enabled",
+ .maxlen = sizeof(u8),
+ .mode = 0644,
+ .proc_handler = proc_dou8vec_minmax,
+ .extra1 = SYSCTL_ZERO,
+ .extra2 = SYSCTL_ONE
+ },
{}
};
@@ -128,6 +143,7 @@ static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet)
table[2].data = &pernet->checksum_enabled;
table[3].data = &pernet->allow_join_initial_addr_port;
table[4].data = &pernet->stale_loss_cnt;
+ table[5].data = &pernet->fullmesh_enabled;
hdr = register_net_sysctl(net, MPTCP_SYSCTL_PATH, table);
if (!hdr)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 8bdd038def38..ce972edc7bbe 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -562,6 +562,7 @@ unsigned int mptcp_get_add_addr_timeout(const struct net *net);
int mptcp_is_checksum_enabled(const struct net *net);
int mptcp_allow_join_id0(const struct net *net);
unsigned int mptcp_stale_loss_cnt(const struct net *net);
+int mptcp_is_fullmesh_enabled(struct net *net);
void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
struct mptcp_options_received *mp_opt);
bool __mptcp_retransmit_pending_data(struct sock *sk);
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 03/10] mptcp: register ipv6 " Geliang Tang
2021-07-21 17:08 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Paolo Abeni
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Matthieu Baerts
1 sibling, 2 replies; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added a new file pm_fullmesh.c, and modify Makefile and
Kconfig to support it.
Implemented a new function mptcp_pm_fm_init(). In it registered a ipv4
addr notifier, named mptcp_pm_addr4_notifier, to deal with the events
of net device UP, DOWN and CHANGE, and skip the loopback device.
Save the ipv4 address, and pass it to the event handler.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
net/mptcp/Kconfig | 10 +++++++++
net/mptcp/Makefile | 1 +
net/mptcp/pm.c | 3 +++
net/mptcp/pm_fullmesh.c | 48 +++++++++++++++++++++++++++++++++++++++++
net/mptcp/protocol.h | 3 +++
5 files changed, 65 insertions(+)
create mode 100644 net/mptcp/pm_fullmesh.c
diff --git a/net/mptcp/Kconfig b/net/mptcp/Kconfig
index 10c97e19a7da..fd7f02ec6442 100644
--- a/net/mptcp/Kconfig
+++ b/net/mptcp/Kconfig
@@ -37,4 +37,14 @@ config MPTCP_KUNIT_TEST
If unsure, say N.
+config MPTCP_FULLMESH
+ bool "The fullmesh path manager mode"
+ default n
+ help
+ Use the fullmesh path manager mode. In this mode, all the net device
+ addresses will use to create the subflows automatically. When the
+ addresses are deleted, the subflows will be closed automatically.
+
+ If unsure, say N.
+
endif
diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile
index 0a0608b6b4b4..83c59c8fdbbf 100644
--- a/net/mptcp/Makefile
+++ b/net/mptcp/Makefile
@@ -13,3 +13,4 @@ mptcp_token_test-objs := token_test.o
obj-$(CONFIG_MPTCP_KUNIT_TEST) += mptcp_crypto_test.o mptcp_token_test.o
obj-$(CONFIG_BPF) += bpf.o
+obj-$(CONFIG_MPTCP_FULLMESH) += pm_fullmesh.o
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 0ed3e565f8f8..57c69e8d4bed 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -353,4 +353,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
void __init mptcp_pm_init(void)
{
mptcp_pm_nl_init();
+#if IS_ENABLED(CONFIG_MPTCP_FULLMESH)
+ mptcp_pm_fm_init();
+#endif
}
diff --git a/net/mptcp/pm_fullmesh.c b/net/mptcp/pm_fullmesh.c
new file mode 100644
index 000000000000..38a44ce8a5fa
--- /dev/null
+++ b/net/mptcp/pm_fullmesh.c
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#define pr_fmt(fmt) "MPTCP: " fmt
+
+#include <linux/kernel.h>
+#include <net/mptcp.h>
+
+#include "protocol.h"
+
+static void addr_event_handler(unsigned long event, struct net *net,
+ struct mptcp_addr_info *addr)
+{
+ if (!mptcp_is_fullmesh_enabled(net))
+ return;
+}
+
+static int mptcp_pm_addr4_event(struct notifier_block *this,
+ unsigned long event, void *ptr)
+{
+ const struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
+ struct net *net = dev_net(ifa->ifa_dev->dev);
+ struct mptcp_addr_info addr = { 0 };
+
+ if (!(event == NETDEV_UP || event == NETDEV_DOWN || event == NETDEV_CHANGE))
+ goto out;
+
+ if (ifa->ifa_scope > RT_SCOPE_LINK ||
+ ipv4_is_loopback(ifa->ifa_local))
+ goto out;
+
+ addr.family = AF_INET;
+ addr.addr.s_addr = ifa->ifa_local;
+
+ addr_event_handler(event, net, &addr);
+
+out:
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block mptcp_pm_addr4_notifier = {
+ .notifier_call = mptcp_pm_addr4_event,
+};
+
+void __init mptcp_pm_fm_init(void)
+{
+ if (register_inetaddr_notifier(&mptcp_pm_addr4_notifier))
+ return;
+}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index ce972edc7bbe..2c3a4d507454 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -810,6 +810,9 @@ unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk);
unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk);
unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk);
unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
+#if IS_ENABLED(CONFIG_MPTCP_FULLMESH)
+void __init mptcp_pm_fm_init(void);
+#endif
void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
void mptcp_sockopt_sync_all(struct mptcp_sock *msk);
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 03/10] mptcp: register ipv6 addr notifier
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Geliang Tang
2021-07-21 17:08 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Paolo Abeni
1 sibling, 1 reply; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch registered a ipv6 addr notifier, named mptcp_pm_addr6_notifier,
to deal with the events of net device UP, DOWN and CHANGE, and skip the
loopback device.
Save the ipv6 address, and pass it to the event handler.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
net/mptcp/pm_fullmesh.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/net/mptcp/pm_fullmesh.c b/net/mptcp/pm_fullmesh.c
index 38a44ce8a5fa..bac06ddc658b 100644
--- a/net/mptcp/pm_fullmesh.c
+++ b/net/mptcp/pm_fullmesh.c
@@ -3,6 +3,8 @@
#define pr_fmt(fmt) "MPTCP: " fmt
#include <linux/kernel.h>
+#include <linux/inetdevice.h>
+#include <net/addrconf.h>
#include <net/mptcp.h>
#include "protocol.h"
@@ -41,8 +43,47 @@ static struct notifier_block mptcp_pm_addr4_notifier = {
.notifier_call = mptcp_pm_addr4_event,
};
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+
+static int mptcp_pm_addr6_event(struct notifier_block *this,
+ unsigned long event, void *ptr)
+{
+ const struct inet6_ifaddr *ifa6 = (struct inet6_ifaddr *)ptr;
+ struct net *net = dev_net(ifa6->idev->dev);
+ int addr_type = ipv6_addr_type(&ifa6->addr);
+ struct mptcp_addr_info addr = { 0 };
+
+ if (!(event == NETDEV_UP || event == NETDEV_DOWN || event == NETDEV_CHANGE))
+ goto out;
+
+ if (ifa6->scope > RT_SCOPE_LINK ||
+ addr_type == IPV6_ADDR_ANY ||
+ (addr_type & IPV6_ADDR_LOOPBACK) ||
+ (addr_type & IPV6_ADDR_LINKLOCAL))
+ goto out;
+
+ addr.family = AF_INET6;
+ addr.addr6 = ifa6->addr;
+
+ addr_event_handler(event, net, &addr);
+
+out:
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block mptcp_pm_addr6_notifier = {
+ .notifier_call = mptcp_pm_addr6_event,
+};
+
+#endif
+
void __init mptcp_pm_fm_init(void)
{
if (register_inetaddr_notifier(&mptcp_pm_addr4_notifier))
return;
+
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+ if (register_inet6addr_notifier(&mptcp_pm_addr6_notifier))
+ unregister_inetaddr_notifier(&mptcp_pm_addr4_notifier);
+#endif
}
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 03/10] mptcp: register ipv6 " Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 05/10] mptcp: invoke mptcp_nl_remove_subflow_and_signal_addr in rcu_work Geliang Tang
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Matthieu Baerts
0 siblings, 2 replies; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added the net device UP event handler function named
mptcp_fm_cmd_add_addr. In it, alloc an address entry, populate it, and
append this entry to the local address list. Then invoke
mptcp_nl_add_subflow_or_signal_addr to create the new subflows.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
include/uapi/linux/mptcp.h | 1 +
net/mptcp/pm_fullmesh.c | 3 +++
net/mptcp/pm_netlink.c | 31 +++++++++++++++++++++++++++++--
net/mptcp/protocol.h | 1 +
4 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
index 7b05f7102321..f66038b9551f 100644
--- a/include/uapi/linux/mptcp.h
+++ b/include/uapi/linux/mptcp.h
@@ -73,6 +73,7 @@ enum {
#define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0)
#define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)
#define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2)
+#define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3)
enum {
MPTCP_PM_CMD_UNSPEC,
diff --git a/net/mptcp/pm_fullmesh.c b/net/mptcp/pm_fullmesh.c
index bac06ddc658b..6c52a64657f4 100644
--- a/net/mptcp/pm_fullmesh.c
+++ b/net/mptcp/pm_fullmesh.c
@@ -14,6 +14,9 @@ static void addr_event_handler(unsigned long event, struct net *net,
{
if (!mptcp_is_fullmesh_enabled(net))
return;
+
+ if (event == NETDEV_UP)
+ mptcp_fm_cmd_add_addr(net, addr);
}
static int mptcp_pm_addr4_event(struct notifier_block *this,
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index ac0aa6faacfa..3437de74f003 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -170,7 +170,8 @@ select_local_address(const struct pm_nl_pernet *pernet,
rcu_read_lock();
__mptcp_flush_join_list(msk);
list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) {
- if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW))
+ if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) &&
+ !(entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH))
continue;
if (entry->addr.family != sk->sk_family) {
@@ -745,7 +746,8 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
addr_max = pernet->add_addr_signal_max;
WRITE_ONCE(pernet->add_addr_signal_max, addr_max + 1);
}
- if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) {
+ if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW ||
+ entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH) {
addr_max = pernet->local_addr_max;
WRITE_ONCE(pernet->local_addr_max, addr_max + 1);
}
@@ -1954,6 +1956,31 @@ static struct genl_family mptcp_genl_family __ro_after_init = {
.n_mcgrps = ARRAY_SIZE(mptcp_pm_mcgrps),
};
+#if IS_ENABLED(CONFIG_MPTCP_FULLMESH)
+
+int mptcp_fm_cmd_add_addr(struct net *net, const struct mptcp_addr_info *addr)
+{
+ struct pm_nl_pernet *pernet = net_generic(net, pm_nl_pernet_id);
+ struct mptcp_pm_addr_entry *entry;
+
+ entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+ if (!entry)
+ return -ENOMEM;
+
+ entry->addr = *addr;
+ entry->addr.id = 0;
+ entry->addr.port = 0;
+ entry->flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
+ entry->ifindex = 0;
+
+ mptcp_pm_nl_append_new_local_addr(pernet, entry);
+ mptcp_nl_add_subflow_or_signal_addr(net);
+
+ return 0;
+}
+
+#endif
+
static int __net_init pm_nl_init_net(struct net *net)
{
struct pm_nl_pernet *pernet = net_generic(net, pm_nl_pernet_id);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 2c3a4d507454..78a9cd90b0f9 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -812,6 +812,7 @@ unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk);
unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
#if IS_ENABLED(CONFIG_MPTCP_FULLMESH)
void __init mptcp_pm_fm_init(void);
+int mptcp_fm_cmd_add_addr(struct net *net, const struct mptcp_addr_info *addr);
#endif
void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 05/10] mptcp: invoke mptcp_nl_remove_subflow_and_signal_addr in rcu_work
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 06/10] mptcp: add netdev down event handler Geliang Tang
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Matthieu Baerts
1 sibling, 1 reply; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
mptcp_nl_remove_subflow_and_signal_addr will be invoked in the atomic
context in the next patch. So we need to move it into the rcu_work to
remove the subflow and signal the RM_ADDR suboption.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
net/mptcp/pm_netlink.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 3437de74f003..533818b4dba2 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1177,6 +1177,7 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
struct addr_entry_release_work {
struct rcu_work rwork;
+ struct net *net;
struct mptcp_pm_addr_entry *entry;
};
@@ -1184,10 +1185,14 @@ static void mptcp_pm_release_addr_entry(struct work_struct *work)
{
struct addr_entry_release_work *w;
struct mptcp_pm_addr_entry *entry;
+ struct net *net;
w = container_of(to_rcu_work(work), struct addr_entry_release_work, rwork);
+ net = w->net;
entry = w->entry;
if (entry) {
+ if (net)
+ mptcp_nl_remove_subflow_and_signal_addr(net, &entry->addr);
if (entry->lsk)
sock_release(entry->lsk);
kfree(entry);
@@ -1195,13 +1200,14 @@ static void mptcp_pm_release_addr_entry(struct work_struct *work)
kfree(w);
}
-static void mptcp_pm_free_addr_entry(struct mptcp_pm_addr_entry *entry)
+static void mptcp_pm_free_addr_entry(struct net *net, struct mptcp_pm_addr_entry *entry)
{
struct addr_entry_release_work *w;
w = kmalloc(sizeof(*w), GFP_ATOMIC);
if (w) {
INIT_RCU_WORK(&w->rwork, mptcp_pm_release_addr_entry);
+ w->net = net;
w->entry = entry;
queue_rcu_work(system_wq, &w->rwork);
}
@@ -1283,8 +1289,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
__clear_bit(entry->addr.id, pernet->id_bitmap);
spin_unlock_bh(&pernet->lock);
- mptcp_nl_remove_subflow_and_signal_addr(sock_net(skb->sk), &entry->addr);
- mptcp_pm_free_addr_entry(entry);
+ mptcp_pm_free_addr_entry(sock_net(skb->sk), entry);
return ret;
}
@@ -1345,7 +1350,7 @@ static void __flush_addrs(struct list_head *list)
cur = list_entry(list->next,
struct mptcp_pm_addr_entry, list);
list_del_rcu(&cur->list);
- mptcp_pm_free_addr_entry(cur);
+ mptcp_pm_free_addr_entry(NULL, cur);
}
}
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 06/10] mptcp: add netdev down event handler
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 05/10] mptcp: invoke mptcp_nl_remove_subflow_and_signal_addr in rcu_work Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Geliang Tang
0 siblings, 1 reply; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added the net device DOWN event handler function named
mptcp_fm_cmd_del_addr. In it, traverse the local address list to find
the deleting address entry, pass this entry to mptcp_pm_free_addr_entry,
then start the rcu_work to remove the subflow and signal the RM_ADDR
suboption.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
net/mptcp/pm_fullmesh.c | 2 ++
net/mptcp/pm_netlink.c | 20 ++++++++++++++++++++
net/mptcp/protocol.h | 1 +
3 files changed, 23 insertions(+)
diff --git a/net/mptcp/pm_fullmesh.c b/net/mptcp/pm_fullmesh.c
index 6c52a64657f4..beb6e4c7cf46 100644
--- a/net/mptcp/pm_fullmesh.c
+++ b/net/mptcp/pm_fullmesh.c
@@ -17,6 +17,8 @@ static void addr_event_handler(unsigned long event, struct net *net,
if (event == NETDEV_UP)
mptcp_fm_cmd_add_addr(net, addr);
+ else if (event == NETDEV_DOWN)
+ mptcp_fm_cmd_del_addr(net, addr);
}
static int mptcp_pm_addr4_event(struct notifier_block *this,
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 533818b4dba2..765d59dd2a5d 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1984,6 +1984,26 @@ int mptcp_fm_cmd_add_addr(struct net *net, const struct mptcp_addr_info *addr)
return 0;
}
+int mptcp_fm_cmd_del_addr(struct net *net, struct mptcp_addr_info *addr)
+{
+ struct pm_nl_pernet *pernet = net_generic(net, pm_nl_pernet_id);
+ struct mptcp_pm_addr_entry *entry, *tmp;
+
+ spin_lock_bh(&pernet->lock);
+ list_for_each_entry_safe(entry, tmp, &pernet->local_addr_list, list) {
+ if (addresses_equal(&entry->addr, addr, false)) {
+ list_del_rcu(&entry->list);
+ spin_unlock_bh(&pernet->lock);
+ mptcp_pm_free_addr_entry(net, entry);
+
+ return 0;
+ }
+ }
+ spin_unlock_bh(&pernet->lock);
+
+ return 0;
+}
+
#endif
static int __net_init pm_nl_init_net(struct net *net)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 78a9cd90b0f9..1dbd8de17a22 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -813,6 +813,7 @@ unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk);
#if IS_ENABLED(CONFIG_MPTCP_FULLMESH)
void __init mptcp_pm_fm_init(void);
int mptcp_fm_cmd_add_addr(struct net *net, const struct mptcp_addr_info *addr);
+int mptcp_fm_cmd_del_addr(struct net *net, struct mptcp_addr_info *addr);
#endif
void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 06/10] mptcp: add netdev down event handler Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 08/10] selftests: mptcp: print the fullmesh flag Geliang Tang
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Matthieu Baerts
0 siblings, 2 replies; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added a proc file /proc/net/local_addr_list to show all
the addresses on the local address list.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
net/mptcp/pm_netlink.c | 52 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 765d59dd2a5d..3bf7467af74b 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -8,6 +8,9 @@
#include <linux/inet.h>
#include <linux/kernel.h>
+#ifdef CONFIG_PROC_FS
+#include <linux/proc_fs.h>
+#endif
#include <net/tcp.h>
#include <net/netns/generic.h>
#include <net/mptcp.h>
@@ -2006,6 +2009,46 @@ int mptcp_fm_cmd_del_addr(struct net *net, struct mptcp_addr_info *addr)
#endif
+#ifdef CONFIG_PROC_FS
+
+/* Output /proc/net/local_addr_list */
+static int mptcp_addr_list_seq_show(struct seq_file *seq, void *v)
+{
+ const struct net *net = seq->private;
+ struct mptcp_pm_addr_entry *cur;
+ struct pm_nl_pernet *pernet;
+
+ pernet = net_generic(net, pm_nl_pernet_id);
+
+ seq_puts(seq, "ID, Family, Address, Flags\n");
+
+ spin_lock_bh(&pernet->lock);
+
+ list_for_each_entry(cur, &pernet->local_addr_list, list) {
+ seq_printf(seq, "%u, ", cur->addr.id);
+ if (cur->addr.family == AF_INET)
+ seq_printf(seq, "4 %pI4, ", &cur->addr.addr);
+ else if (cur->addr.family == AF_INET6)
+ seq_printf(seq, "6 %pI6, ", &cur->addr.addr6);
+
+ if (cur->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)
+ seq_puts(seq, "subflow ");
+ if (cur->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)
+ seq_puts(seq, "signal ");
+ if (cur->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
+ seq_puts(seq, "backup ");
+ if (cur->flags & MPTCP_PM_ADDR_FLAG_FULLMESH)
+ seq_puts(seq, "fullmesh ");
+ seq_puts(seq, "\n");
+ }
+
+ spin_unlock_bh(&pernet->lock);
+
+ return 0;
+}
+
+#endif
+
static int __net_init pm_nl_init_net(struct net *net)
{
struct pm_nl_pernet *pernet = net_generic(net, pm_nl_pernet_id);
@@ -2015,6 +2058,12 @@ static int __net_init pm_nl_init_net(struct net *net)
pernet->stale_loss_cnt = 4;
spin_lock_init(&pernet->lock);
+#ifdef CONFIG_PROC_FS
+ if (!proc_create_net_single("local_addr_list", 0444, net->proc_net,
+ mptcp_addr_list_seq_show, NULL))
+ return -EINVAL;
+#endif
+
/* No need to initialize other pernet fields, the struct is zeroed at
* allocation time.
*/
@@ -2033,6 +2082,9 @@ static void __net_exit pm_nl_exit_net(struct list_head *net_list)
* other modifiers
*/
__flush_addrs(&pernet->local_addr_list);
+#ifdef CONFIG_PROC_FS
+ remove_proc_entry("local_addr_list", net->proc_net);
+#endif
}
}
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 08/10] selftests: mptcp: print the fullmesh flag
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 09/10] selftests: mptcp: add fullmesh testcases Geliang Tang
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Matthieu Baerts
1 sibling, 1 reply; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch dealt with the MPTCP_PM_ADDR_FLAG_FULLMESH flag in
print_addr() to print out the fullmesh flag.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
index 115decfdc1ef..78e0d37d008e 100644
--- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
+++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c
@@ -422,6 +422,13 @@ static void print_addr(struct rtattr *attrs, int len)
printf(",");
}
+ if (flags & MPTCP_PM_ADDR_FLAG_FULLMESH) {
+ printf("fullmesh");
+ flags &= ~MPTCP_PM_ADDR_FLAG_FULLMESH;
+ if (flags)
+ printf(",");
+ }
+
/* bump unknown flags, if any */
if (flags)
printf("0x%x", flags);
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 09/10] selftests: mptcp: add fullmesh testcases
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 08/10] selftests: mptcp: print the fullmesh flag Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 10/10] selftests: mptcp: del uncontinuous removing ids Geliang Tang
0 siblings, 1 reply; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added the net device UP and DOWN testcases for the fullmesh
path manager.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 81 ++++++++++++++++++-
1 file changed, 80 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 220154cb92a7..823300986459 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -160,6 +160,27 @@ reset_with_allow_join_id0()
ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
}
+reset_fullmesh()
+{
+ reset
+
+ ip netns exec $ns2 sysctl -q net.mptcp.fullmesh_enabled=1
+
+ for i in `seq 5 8`; do
+ ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
+ ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
+ ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
+ ip -net "$ns1" link set ns1eth$i up
+
+ ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
+ ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
+ ip -net "$ns2" link set ns2eth$i up
+
+ # let $ns2 reach any $ns1 address from any interface
+ ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
+ done
+}
+
ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool"
@@ -364,6 +385,16 @@ do_transfer()
elif [ $rm_nr_ns1 -eq 9 ]; then
sleep 1
ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
+ elif [ $rm_nr_ns1 -eq 10 ]; then
+ local addr
+ local i=5
+ if is_v6 "${connect_addr}"; then
+ addr="dead:beef:$i::1/64"
+ else
+ addr="10.0.$i.1/24"
+ fi
+ sleep 2
+ ip -net "${listener_ns}" addr del $addr dev ns1eth$i
fi
fi
@@ -412,6 +443,16 @@ do_transfer()
fi
sleep 1
ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
+ elif [ $rm_nr_ns2 -eq 10 ]; then
+ local addr
+ local i=5
+ if is_v6 "${connect_addr}"; then
+ addr="dead:beef:$i::2/64"
+ else
+ addr="10.0.$i.2/24"
+ fi
+ sleep 2
+ ip -net "${connector_ns}" addr del $addr dev ns2eth$i
fi
fi
@@ -1683,6 +1724,39 @@ deny_join_id0_tests()
chk_join_nr "subflow and address allow join id0 2" 1 1 1
}
+fullmesh_tests()
+{
+ # fullmesh add
+ reset_fullmesh
+ ip netns exec $ns1 ./pm_nl_ctl limits 8 8
+ ip netns exec $ns2 ./pm_nl_ctl limits 8 8
+ run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+ chk_join_nr "fullmesh add" 4 4 4
+
+ # fullmesh add IPv6
+ reset_fullmesh
+ ip netns exec $ns1 ./pm_nl_ctl limits 8 8
+ ip netns exec $ns2 ./pm_nl_ctl limits 8 8
+ run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+ chk_join_nr "fullmesh add IPv6" 4 4 4
+
+ # fullmesh del
+ reset_fullmesh
+ ip netns exec $ns1 ./pm_nl_ctl limits 8 8
+ ip netns exec $ns2 ./pm_nl_ctl limits 8 8
+ run_tests $ns1 $ns2 10.0.1.1 0 0 -10 slow
+ chk_join_nr "fullmesh del" 4 4 4
+ chk_rm_nr 1 1
+
+ # fullmesh del IPv6
+ reset_fullmesh
+ ip netns exec $ns1 ./pm_nl_ctl limits 8 8
+ ip netns exec $ns2 ./pm_nl_ctl limits 8 8
+ run_tests $ns1 $ns2 dead:beef:1::1 0 0 -10 slow
+ chk_join_nr "fullmesh del IPv6" 4 4 4
+ chk_rm_nr 1 1
+}
+
all_tests()
{
subflows_tests
@@ -1698,6 +1772,7 @@ all_tests()
syncookies_tests
checksum_tests
deny_join_id0_tests
+ fullmesh_tests
}
usage()
@@ -1716,6 +1791,7 @@ usage()
echo " -k syncookies_tests"
echo " -S checksum_tests"
echo " -d deny_join_id0_tests"
+ echo " -m fullmesh_tests"
echo " -c capture pcap files"
echo " -C enable data checksum"
echo " -h help"
@@ -1751,7 +1827,7 @@ if [ $do_all_tests -eq 1 ]; then
exit $ret
fi
-while getopts 'fsltra64bpkdchCS' opt; do
+while getopts 'fsltra64bpkdmchCS' opt; do
case $opt in
f)
subflows_tests
@@ -1792,6 +1868,9 @@ while getopts 'fsltra64bpkdchCS' opt; do
d)
deny_join_id0_tests
;;
+ m)
+ fullmesh_tests
+ ;;
c)
;;
C)
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [MPTCP][PATCH v2 mptcp-next 10/10] selftests: mptcp: del uncontinuous removing ids
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 09/10] selftests: mptcp: add fullmesh testcases Geliang Tang
@ 2021-07-21 14:31 ` Geliang Tang
2021-07-22 13:34 ` Matthieu Baerts
0 siblings, 1 reply; 18+ messages in thread
From: Geliang Tang @ 2021-07-21 14:31 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch added the uncontinuous removing ids support in the removing
address testcases.
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
tools/testing/selftests/net/mptcp/mptcp_join.sh | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 823300986459..a1efba165e80 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -366,17 +366,18 @@ do_transfer()
let rm_nr_ns1=-addr_nr_ns1
if [ $rm_nr_ns1 -lt 8 ]; then
counter=1
+ pos=1
dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
if [ ${#dump[@]} -gt 0 ]; then
- id=${dump[1]}
sleep 1
while [ $counter -le $rm_nr_ns1 ]
do
+ id=${dump[$pos]}
ip netns exec ${listener_ns} ./pm_nl_ctl del $id
sleep 1
let counter+=1
- let id+=1
+ let pos+=5
done
fi
elif [ $rm_nr_ns1 -eq 8 ]; then
@@ -418,17 +419,18 @@ do_transfer()
let rm_nr_ns2=-addr_nr_ns2
if [ $rm_nr_ns2 -lt 8 ]; then
counter=1
+ pos=1
dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
if [ ${#dump[@]} -gt 0 ]; then
- id=${dump[1]}
sleep 1
while [ $counter -le $rm_nr_ns2 ]
do
+ id=${dump[$pos]}
ip netns exec ${connector_ns} ./pm_nl_ctl del $id
sleep 1
let counter+=1
- let id+=1
+ let pos+=5
done
fi
elif [ $rm_nr_ns2 -eq 8 ]; then
--
2.31.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 03/10] mptcp: register ipv6 " Geliang Tang
@ 2021-07-21 17:08 ` Paolo Abeni
2021-07-22 13:33 ` Matthieu Baerts
1 sibling, 1 reply; 18+ messages in thread
From: Paolo Abeni @ 2021-07-21 17:08 UTC (permalink / raw)
To: Geliang Tang, mptcp
On Wed, 2021-07-21 at 22:31 +0800, Geliang Tang wrote:
> This patch added a new file pm_fullmesh.c, and modify Makefile and
> Kconfig to support it.
>
> Implemented a new function mptcp_pm_fm_init(). In it registered a ipv4
> addr notifier, named mptcp_pm_addr4_notifier, to deal with the events
> of net device UP, DOWN and CHANGE, and skip the loopback device.
Do we absolutely need these notifiers? can we use instead e.g.
NetworkManager scrips to create/delete endpoints as needed ?!?
/P
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Geliang Tang
@ 2021-07-22 13:33 ` Matthieu Baerts
1 sibling, 0 replies; 18+ messages in thread
From: Matthieu Baerts @ 2021-07-22 13:33 UTC (permalink / raw)
To: Geliang Tang, mptcp
Hi Geliang,
Thank you for sharing this v2!
On 21/07/2021 16:31, Geliang Tang wrote:
> This patch added a new sysctl, named fullmesh_enabled, to control whether
> the fullmesh path manager mode can be enabled.
Should we not fully control the PM via Netlink?
I know it is easy to add sysctl knobs but mixing places for the
configuration might be confusing :-/
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier
2021-07-21 17:08 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Paolo Abeni
@ 2021-07-22 13:33 ` Matthieu Baerts
0 siblings, 0 replies; 18+ messages in thread
From: Matthieu Baerts @ 2021-07-22 13:33 UTC (permalink / raw)
To: Paolo Abeni, Geliang Tang; +Cc: mptcp
Hi Geliang, Paolo,
On 21/07/2021 19:08, Paolo Abeni wrote:
> On Wed, 2021-07-21 at 22:31 +0800, Geliang Tang wrote:
>> This patch added a new file pm_fullmesh.c, and modify Makefile and
>> Kconfig to support it.
>>
>> Implemented a new function mptcp_pm_fm_init(). In it registered a ipv4
>> addr notifier, named mptcp_pm_addr4_notifier, to deal with the events
>> of net device UP, DOWN and CHANGE, and skip the loopback device.
>
> Do we absolutely need these notifiers? can we use instead e.g.
> NetworkManager scrips to create/delete endpoints as needed ?!?
I understand it is convenient to have this code in the kernel but I
don't think it will be easy to manage all different cases: ignoring some
interfaces, specific IPs, all v6 or v4, sometimes loopback/link-local
are interesting to use, etc.
It looks like an easy job for a userspace daemon managing the
connections, no?
Is it not possible to have external hooks (shell scripts? an app with
extra rights?) with the daemon managing connections on Android?
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 05/10] mptcp: invoke mptcp_nl_remove_subflow_and_signal_addr in rcu_work Geliang Tang
@ 2021-07-22 13:33 ` Matthieu Baerts
1 sibling, 0 replies; 18+ messages in thread
From: Matthieu Baerts @ 2021-07-22 13:33 UTC (permalink / raw)
To: Geliang Tang, mptcp
Hi Geliang,
On 21/07/2021 16:31, Geliang Tang wrote:
> This patch added the net device UP event handler function named
> mptcp_fm_cmd_add_addr. In it, alloc an address entry, populate it, and
> append this entry to the local address list. Then invoke
> mptcp_nl_add_subflow_or_signal_addr to create the new subflows.
(...)
> diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h
> index 7b05f7102321..f66038b9551f 100644
> --- a/include/uapi/linux/mptcp.h
> +++ b/include/uapi/linux/mptcp.h
> @@ -73,6 +73,7 @@ enum {
> #define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0)
> #define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)
> #define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2)
> +#define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3)
Adding a new flag for the Netlink API seems to be the good direction to
take I think. But I think we should only set this flag using Netlink.
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index ac0aa6faacfa..3437de74f003 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
(...)
> @@ -1954,6 +1956,31 @@ static struct genl_family mptcp_genl_family __ro_after_init = {
> .n_mcgrps = ARRAY_SIZE(mptcp_pm_mcgrps),
> };
>
> +#if IS_ENABLED(CONFIG_MPTCP_FULLMESH)
> +
> +int mptcp_fm_cmd_add_addr(struct net *net, const struct mptcp_addr_info *addr)
Should it not be declared in fullmesh.c file? It is specific to FM.
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 08/10] selftests: mptcp: print the fullmesh flag Geliang Tang
@ 2021-07-22 13:33 ` Matthieu Baerts
1 sibling, 0 replies; 18+ messages in thread
From: Matthieu Baerts @ 2021-07-22 13:33 UTC (permalink / raw)
To: Geliang Tang, mptcp
Hi Geliang,
On 21/07/2021 16:31, Geliang Tang wrote:
> This patch added a proc file /proc/net/local_addr_list to show all
> the addresses on the local address list.
This looks like a very useful info and handy to read but I don't think
upstream -net maintainers will accept new entries in /proc/net.
Instead, a Netlink API should be used if I'm not mistaken.
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 10/10] selftests: mptcp: del uncontinuous removing ids
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 10/10] selftests: mptcp: del uncontinuous removing ids Geliang Tang
@ 2021-07-22 13:34 ` Matthieu Baerts
0 siblings, 0 replies; 18+ messages in thread
From: Matthieu Baerts @ 2021-07-22 13:34 UTC (permalink / raw)
To: Geliang Tang, mptcp
Hi Geliang,
On 21/07/2021 16:31, Geliang Tang wrote:
> This patch added the uncontinuous removing ids support in the removing
> address testcases.
Is it a fix for a previous modification? If yes, may you add a "Fixes"
tag please?
Or is it only visible with this series? What are the consequences
without this patch?
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support
2021-07-21 14:31 [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Geliang Tang
@ 2021-07-22 15:30 ` Matthieu Baerts
1 sibling, 0 replies; 18+ messages in thread
From: Matthieu Baerts @ 2021-07-22 15:30 UTC (permalink / raw)
To: Geliang Tang, mptcp
Hi Geliang,
On 21/07/2021 16:31, Geliang Tang wrote:
> Implement the in-kernel fullmesh path manager like on the mptcp.org
> kernel.
Thank you for the series!
Do not hesitate to share architecture design if you are unsure before
writing a lot of code ;-)
(But if it is easier for you to share code, that's not an issue for me :) )
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2021-07-22 15:31 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-21 14:31 [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 03/10] mptcp: register ipv6 " Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 05/10] mptcp: invoke mptcp_nl_remove_subflow_and_signal_addr in rcu_work Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 06/10] mptcp: add netdev down event handler Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 08/10] selftests: mptcp: print the fullmesh flag Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 09/10] selftests: mptcp: add fullmesh testcases Geliang Tang
2021-07-21 14:31 ` [MPTCP][PATCH v2 mptcp-next 10/10] selftests: mptcp: del uncontinuous removing ids Geliang Tang
2021-07-22 13:34 ` Matthieu Baerts
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 07/10] mptcp: add proc file local_addr_list Matthieu Baerts
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 04/10] mptcp: add netdev up event handler Matthieu Baerts
2021-07-21 17:08 ` [MPTCP][PATCH v2 mptcp-next 02/10] mptcp: register ipv4 addr notifier Paolo Abeni
2021-07-22 13:33 ` Matthieu Baerts
2021-07-22 13:33 ` [MPTCP][PATCH v2 mptcp-next 01/10] mptcp: add a new sysctl fullmesh_enabled Matthieu Baerts
2021-07-22 15:30 ` [MPTCP][PATCH v2 mptcp-next 00/10] fullmesh path manager support Matthieu Baerts
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).