@@ -132,6 +132,10 @@ struct mptcp_pm_ops {
bool (*allow_new_subflow)(struct mptcp_sock *msk);
bool (*accept_new_subflow)(const struct mptcp_sock *msk);
+ /* optional */
+ int (*add_addr_received)(struct mptcp_sock *msk,
+ const struct mptcp_addr_info *addr);
+
char name[MPTCP_PM_NAME_MAX];
struct module *owner;
struct list_head list;
@@ -559,6 +559,11 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
spin_unlock_bh(&pm->lock);
}
+bool mptcp_pm_add_addr_recv(struct mptcp_sock *msk)
+{
+ return mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED);
+}
+
void mptcp_pm_add_addr_received(const struct sock *ssk,
const struct mptcp_addr_info *addr)
{
@@ -586,10 +591,9 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
(addr->id > 0 && !READ_ONCE(pm->accept_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 {
- ret = -EINVAL;
+ ret = pm->ops->add_addr_received ?
+ pm->ops->add_addr_received(msk, addr) : -EINVAL;
}
if (ret)
@@ -1422,6 +1422,17 @@ static bool mptcp_pm_kernel_accept_new_subflow(const struct mptcp_sock *msk)
return READ_ONCE(msk->pm.accept_subflow);
}
+static int mptcp_pm_kernel_add_addr_received(struct mptcp_sock *msk,
+ const struct mptcp_addr_info *addr)
+{
+ if (mptcp_pm_add_addr_recv(msk)) {
+ msk->pm.remote = *addr;
+ return 0;
+ }
+
+ return -EINVAL;
+}
+
static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
{
bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
@@ -1449,6 +1460,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = {
.subflow_established = mptcp_pm_kernel_subflow_established,
.allow_new_subflow = mptcp_pm_kernel_allow_new_subflow,
.accept_new_subflow = mptcp_pm_kernel_accept_new_subflow,
+ .add_addr_received = mptcp_pm_kernel_add_addr_received,
.init = mptcp_pm_kernel_init,
.name = "kernel",
.owner = THIS_MODULE,
@@ -1013,6 +1013,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk);
bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk);
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
const struct mptcp_subflow_context *subflow);
+bool mptcp_pm_add_addr_recv(struct mptcp_sock *msk);
void mptcp_pm_add_addr_received(const struct sock *ssk,
const struct mptcp_addr_info *addr);
void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,