Skip to content

Commit

Permalink
mptcp: add rm_list_tx in mptcp_pm_data
Browse files Browse the repository at this point in the history
This patch added a new member rm_list_tx for struct mptcp_pm_data as the
removing address list on the outgoing direction. Initialize its nr field
to zero in mptcp_pm_data_init.

In mptcp_pm_remove_anno_addr, put the single address id into an removing
list, and passed it to mptcp_pm_remove_addr.

In mptcp_pm_remove_addr, save the input rm_list to rm_list_tx in struct
mptcp_pm_data.

Reviewed-by: Mat Martineau <[email protected]>
Signed-off-by: Geliang Tang <[email protected]>
  • Loading branch information
geliangtang authored and jenkins-tessares committed Feb 18, 2021
1 parent 783bf0f commit ad2399b
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 8 deletions.
11 changes: 5 additions & 6 deletions net/mptcp/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, struct mptcp_rm_list rm_list)
{
u8 rm_addr = READ_ONCE(msk->pm.addr_signal);

pr_debug("msk=%p, local_id=%d", msk, local_id);
pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list.nr);

if (rm_addr) {
pr_warn("addr_signal error, rm_addr=%d", rm_addr);
return -EINVAL;
}

msk->pm.rm_id = local_id;
msk->pm.rm_list_tx = rm_list;
rm_addr |= BIT(MPTCP_RM_ADDR_SIGNAL);
WRITE_ONCE(msk->pm.addr_signal, rm_addr);
return 0;
Expand Down Expand Up @@ -270,8 +270,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_list->ids[0] = msk->pm.rm_id;
rm_list->nr = 1;
*rm_list = msk->pm.rm_list_tx;
WRITE_ONCE(msk->pm.addr_signal, 0);
ret = true;

Expand All @@ -291,7 +290,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;
msk->pm.rm_list_tx.nr = 0;
WRITE_ONCE(msk->pm.work_pending, false);
WRITE_ONCE(msk->pm.addr_signal, 0);
WRITE_ONCE(msk->pm.accept_addr, false);
Expand Down
5 changes: 4 additions & 1 deletion net/mptcp/pm_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -1071,12 +1071,15 @@ static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
struct mptcp_addr_info *addr,
bool force)
{
struct mptcp_rm_list list = { .nr = 0 };
bool ret;

list.ids[list.nr++] = 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, list);
spin_unlock_bh(&msk->pm.lock);
}
return ret;
Expand Down
3 changes: 2 additions & 1 deletion net/mptcp/protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ struct mptcp_pm_data {
u8 local_addr_used;
u8 subflows;
u8 status;
struct mptcp_rm_list rm_list_tx;
u8 rm_id;
};

Expand Down Expand Up @@ -660,7 +661,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, struct mptcp_rm_list rm_list);
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,
Expand Down

0 comments on commit ad2399b

Please sign in to comment.