diff mbox series

[3/7] Squash-to: "mptcp: Add handling of incoming MP_JOIN requests"

Message ID cc5924e84e416444c6f62d12d4c0fbaa200c9b68.1581963739.git.pabeni@redhat.com
State Superseded, archived
Delegated to: Paolo Abeni
Headers show
Series add locking to PM APis, implement PM netlink | expand

Commit Message

Paolo Abeni Feb. 17, 2020, 6:28 p.m. UTC
Update mptcp_pm_get_local_id() callers to new API.

Hook mptcp_pm_subflow_established() when MP_JOIN completes
successfully

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/mptcp/options.c | 7 +++++--
 net/mptcp/subflow.c | 5 ++++-
 2 files changed, 9 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 43bfeb3fa753..c2e0576065b6 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -128,7 +128,6 @@  void mptcp_parse_option(const struct sk_buff *skb, const unsigned char *ptr,
 		}
 		break;
 
-
 	case MPTCPOPT_DSS:
 		pr_debug("DSS");
 		ptr++;
@@ -565,8 +564,12 @@  static bool check_fourth_ack(struct mptcp_subflow_context *subflow,
 		   TCP_SKB_CB(skb)->seq != subflow->ssn_offset + 1))
 		return true;
 
-	if (mp_opt->use_ack)
+	if (mp_opt->use_ack) {
 		subflow->fourth_ack = 1;
+		if (subflow->mp_join)
+			mptcp_pm_subflow_established(mptcp_sk(subflow->conn),
+						     subflow);
+	}
 
 	if (subflow->can_ack)
 		return true;
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index a8dedbd8d458..5710b439e418 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -55,6 +55,7 @@  static bool subflow_token_join_request(struct request_sock *req,
 	struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
 	u8 hmac[MPTCPOPT_HMAC_LEN];
 	struct mptcp_sock *msk;
+	int local_id;
 
 	msk = mptcp_token_get_sock(subflow_req->token);
 	if (!msk) {
@@ -63,10 +64,12 @@  static bool subflow_token_join_request(struct request_sock *req,
 		return false;
 	}
 
-	if (mptcp_pm_get_local_id(req, (struct sock *)msk, skb)) {
+	local_id = mptcp_pm_get_local_id(msk, (struct sock_common *)req);
+	if (local_id < 0) {
 		sock_put((struct sock *)msk);
 		return false;
 	}
+	subflow_req->local_id = local_id;
 
 	get_random_bytes(&subflow_req->local_nonce, sizeof(u32));