@@ -39,18 +39,18 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
return 0;
}
-int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id)
+int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_ids[])
{
u8 rm_addr = READ_ONCE(msk->pm.addr_signal);
- pr_debug("msk=%p, local_id=%d", msk, local_id);
+ pr_debug("msk=%p, local_ids_nr=%d", msk, mptcp_get_rm_ids_nr(local_ids));
if (rm_addr) {
pr_warn("addr_signal error, rm_addr=%d", rm_addr);
return -EINVAL;
}
- msk->pm.rm_id = local_id;
+ memcpy(msk->pm.rm_ids_tx, local_ids, MPTCP_RM_IDS_MAX);
rm_addr |= BIT(MPTCP_RM_ADDR_SIGNAL);
WRITE_ONCE(msk->pm.addr_signal, rm_addr);
return 0;
@@ -286,7 +286,7 @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
if (remaining < TCPOLEN_MPTCP_RM_ADDR_BASE)
goto out_unlock;
- rm_ids[0] = msk->pm.rm_id;
+ memcpy(rm_ids, msk->pm.rm_ids_tx, MPTCP_RM_IDS_MAX);
WRITE_ONCE(msk->pm.addr_signal, 0);
ret = true;
@@ -306,7 +306,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
msk->pm.add_addr_accepted = 0;
msk->pm.local_addr_used = 0;
msk->pm.subflows = 0;
- msk->pm.rm_id = 0;
+ memset(msk->pm.rm_ids_tx, MAX_ADDR_ID, MPTCP_RM_IDS_MAX);
WRITE_ONCE(msk->pm.work_pending, false);
WRITE_ONCE(msk->pm.addr_signal, 0);
WRITE_ONCE(msk->pm.accept_addr, false);
@@ -1079,12 +1079,16 @@ static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
struct mptcp_addr_info *addr,
bool force)
{
+ u8 ids[MPTCP_RM_IDS_MAX];
bool ret;
+ memset(ids, MAX_ADDR_ID, MPTCP_RM_IDS_MAX);
+ ids[0] = addr->id;
+
ret = remove_anno_list_by_saddr(msk, addr);
if (ret || force) {
spin_lock_bh(&msk->pm.lock);
- mptcp_pm_remove_addr(msk, addr->id);
+ mptcp_pm_remove_addr(msk, ids);
spin_unlock_bh(&msk->pm.lock);
}
return ret;
@@ -207,6 +207,7 @@ struct mptcp_pm_data {
u8 local_addr_used;
u8 subflows;
u8 status;
+ u8 rm_ids_tx[MPTCP_RM_IDS_MAX];
u8 rm_id;
};
@@ -686,7 +687,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr,
bool echo, bool port);
-int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
+int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_ids[]);
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id);
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
This patch added a new member rm_ids_tx for struct mptcp_pm_data as an array of the removing address ids on the outgoing direction. Used memset to initialize it, and memcpy to copy it. In mptcp_pm_remove_anno_addr, put the single address id into an ids array, and passed it to mptcp_pm_remove_addr. Signed-off-by: Geliang Tang <geliangtang@gmail.com> --- net/mptcp/pm.c | 10 +++++----- net/mptcp/pm_netlink.c | 6 +++++- net/mptcp/protocol.h | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-)