@@ -129,6 +129,10 @@ struct mptcp_pm_ops {
void (*established)(struct mptcp_sock *msk);
void (*subflow_established)(struct mptcp_sock *msk);
+ /* required */
+ bool (*accept_new_address)(struct mptcp_sock *msk,
+ const struct mptcp_addr_info *addr);
+
char name[MPTCP_PM_NAME_MAX];
struct module *owner;
struct list_head list;
@@ -589,22 +589,21 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
mptcp_event_addr_announced(ssk, addr);
+ if (!pm->ops->accept_new_address(msk, addr)) {
+ MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_ADDADDRDROP);
+ return;
+ }
+
spin_lock_bh(&pm->lock);
if (mptcp_pm_is_userspace(msk)) {
- if (mptcp_userspace_pm_active(msk)) {
- mptcp_pm_announce_addr(msk, addr, true);
- mptcp_pm_add_addr_send_ack(msk);
- } else {
- __MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
- }
+ mptcp_pm_announce_addr(msk, addr, true);
+ mptcp_pm_add_addr_send_ack(msk);
} else if (!mptcp_pm_accept_address(msk, addr)) {
mptcp_pm_announce_addr(msk, addr, true);
mptcp_pm_add_addr_send_ack(msk);
} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
pm->remote = *addr;
- } else {
- __MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
}
spin_unlock_bh(&pm->lock);
@@ -1046,7 +1045,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name)
int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops)
{
if (!pm_ops->get_local_id || !pm_ops->get_priority ||
- !pm_ops->accept_new_subflow) {
+ !pm_ops->accept_new_subflow || !pm_ops->accept_new_address) {
pr_err("%s does not implement required ops\n", pm_ops->name);
return -EINVAL;
}
@@ -1413,6 +1413,13 @@ static bool mptcp_pm_kernel_accept_new_subflow(struct mptcp_sock *msk,
return ret;
}
+static bool mptcp_pm_kernel_accept_new_address(struct mptcp_sock *msk,
+ const struct mptcp_addr_info *addr)
+{
+ return !(mptcp_pm_accept_address(msk, addr) &&
+ msk->pm.status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED));
+}
+
static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
{
bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
@@ -1439,6 +1446,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = {
.accept_new_subflow = mptcp_pm_kernel_accept_new_subflow,
.established = mptcp_pm_kernel_established,
.subflow_established = mptcp_pm_kernel_subflow_established,
+ .accept_new_address = mptcp_pm_kernel_accept_new_address,
.init = mptcp_pm_kernel_init,
.name = "kernel",
.owner = THIS_MODULE,
@@ -689,6 +689,12 @@ static bool mptcp_pm_userspace_accept_new_subflow(struct mptcp_sock *msk,
return mptcp_userspace_pm_active(msk);
}
+static bool mptcp_pm_userspace_accept_new_address(struct mptcp_sock *msk,
+ const struct mptcp_addr_info *addr)
+{
+ return mptcp_userspace_pm_active(msk);
+}
+
static void mptcp_pm_userspace_release(struct mptcp_sock *msk)
{
mptcp_userspace_pm_free_local_addr_list(msk);
@@ -698,6 +704,7 @@ static struct mptcp_pm_ops mptcp_pm_userspace = {
.get_local_id = mptcp_pm_userspace_get_local_id,
.get_priority = mptcp_pm_userspace_get_priority,
.accept_new_subflow = mptcp_pm_userspace_accept_new_subflow,
+ .accept_new_address = mptcp_pm_userspace_accept_new_address,
.release = mptcp_pm_userspace_release,
.name = "userspace",
.owner = THIS_MODULE,