protocol.c (68f0f2690e183306b52671a9ad09fb31808b0500) | protocol.c (64d950ae0b01eae96eb668b789c6d145c38ac41c) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* Multipath TCP 3 * 4 * Copyright (c) 2017 - 2019, Intel Corporation. 5 */ 6 7#define pr_fmt(fmt) "MPTCP: " fmt 8 --- 1302 unchanged lines hidden (view full) --- 1311 inet_sk(msk)->inet_sport = inet_sk(ssk)->inet_sport; 1312 inet_sk(msk)->inet_daddr = inet_sk(ssk)->inet_daddr; 1313 inet_sk(msk)->inet_saddr = inet_sk(ssk)->inet_saddr; 1314 inet_sk(msk)->inet_rcv_saddr = inet_sk(ssk)->inet_rcv_saddr; 1315} 1316 1317static int mptcp_disconnect(struct sock *sk, int flags) 1318{ | 1// SPDX-License-Identifier: GPL-2.0 2/* Multipath TCP 3 * 4 * Copyright (c) 2017 - 2019, Intel Corporation. 5 */ 6 7#define pr_fmt(fmt) "MPTCP: " fmt 8 --- 1302 unchanged lines hidden (view full) --- 1311 inet_sk(msk)->inet_sport = inet_sk(ssk)->inet_sport; 1312 inet_sk(msk)->inet_daddr = inet_sk(ssk)->inet_daddr; 1313 inet_sk(msk)->inet_saddr = inet_sk(ssk)->inet_saddr; 1314 inet_sk(msk)->inet_rcv_saddr = inet_sk(ssk)->inet_rcv_saddr; 1315} 1316 1317static int mptcp_disconnect(struct sock *sk, int flags) 1318{ |
1319 lock_sock(sk); 1320 __mptcp_clear_xmit(sk); 1321 release_sock(sk); 1322 mptcp_cancel_work(sk); 1323 return tcp_disconnect(sk, flags); | 1319 /* Should never be called. 1320 * inet_stream_connect() calls ->disconnect, but that 1321 * refers to the subflow socket, not the mptcp one. 1322 */ 1323 WARN_ON_ONCE(1); 1324 return 0; |
1324} 1325 1326#if IS_ENABLED(CONFIG_MPTCP_IPV6) 1327static struct ipv6_pinfo *mptcp_inet6_sk(const struct sock *sk) 1328{ 1329 unsigned int offset = sizeof(struct mptcp6_sock) - sizeof(struct ipv6_pinfo); 1330 1331 return (struct ipv6_pinfo *)(((u8 *)sk) + offset); 1332} 1333#endif 1334 | 1325} 1326 1327#if IS_ENABLED(CONFIG_MPTCP_IPV6) 1328static struct ipv6_pinfo *mptcp_inet6_sk(const struct sock *sk) 1329{ 1330 unsigned int offset = sizeof(struct mptcp6_sock) - sizeof(struct ipv6_pinfo); 1331 1332 return (struct ipv6_pinfo *)(((u8 *)sk) + offset); 1333} 1334#endif 1335 |
1335struct sock *mptcp_sk_clone(const struct sock *sk, struct request_sock *req) | 1336struct sock *mptcp_sk_clone(const struct sock *sk, 1337 const struct mptcp_options_received *mp_opt, 1338 struct request_sock *req) |
1336{ 1337 struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req); 1338 struct sock *nsk = sk_clone_lock(sk, GFP_ATOMIC); 1339 struct mptcp_sock *msk; 1340 u64 ack_seq; 1341 1342 if (!nsk) 1343 return NULL; --- 6 unchanged lines hidden (view full) --- 1350 __mptcp_init_sock(nsk); 1351 1352 msk = mptcp_sk(nsk); 1353 msk->local_key = subflow_req->local_key; 1354 msk->token = subflow_req->token; 1355 msk->subflow = NULL; 1356 1357 if (unlikely(mptcp_token_new_accept(subflow_req->token, nsk))) { | 1339{ 1340 struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req); 1341 struct sock *nsk = sk_clone_lock(sk, GFP_ATOMIC); 1342 struct mptcp_sock *msk; 1343 u64 ack_seq; 1344 1345 if (!nsk) 1346 return NULL; --- 6 unchanged lines hidden (view full) --- 1353 __mptcp_init_sock(nsk); 1354 1355 msk = mptcp_sk(nsk); 1356 msk->local_key = subflow_req->local_key; 1357 msk->token = subflow_req->token; 1358 msk->subflow = NULL; 1359 1360 if (unlikely(mptcp_token_new_accept(subflow_req->token, nsk))) { |
1361 nsk->sk_state = TCP_CLOSE; |
|
1358 bh_unlock_sock(nsk); 1359 1360 /* we can't call into mptcp_close() here - possible BH context | 1362 bh_unlock_sock(nsk); 1363 1364 /* we can't call into mptcp_close() here - possible BH context |
1361 * free the sock directly | 1365 * free the sock directly. 1366 * sk_clone_lock() sets nsk refcnt to two, hence call sk_free() 1367 * too. |
1362 */ | 1368 */ |
1363 nsk->sk_prot->destroy(nsk); | 1369 sk_common_release(nsk); |
1364 sk_free(nsk); 1365 return NULL; 1366 } 1367 1368 msk->write_seq = subflow_req->idsn + 1; 1369 atomic64_set(&msk->snd_una, msk->write_seq); | 1370 sk_free(nsk); 1371 return NULL; 1372 } 1373 1374 msk->write_seq = subflow_req->idsn + 1; 1375 atomic64_set(&msk->snd_una, msk->write_seq); |
1370 if (subflow_req->remote_key_valid) { | 1376 if (mp_opt->mp_capable) { |
1371 msk->can_ack = true; | 1377 msk->can_ack = true; |
1372 msk->remote_key = subflow_req->remote_key; | 1378 msk->remote_key = mp_opt->sndr_key; |
1373 mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq); 1374 ack_seq++; 1375 msk->ack_seq = ack_seq; 1376 } 1377 | 1379 mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq); 1380 ack_seq++; 1381 msk->ack_seq = ack_seq; 1382 } 1383 |
1384 sock_reset_flag(nsk, SOCK_RCU_FREE); |
|
1378 /* will be fully established after successful MPC subflow creation */ 1379 inet_sk_state_store(nsk, TCP_SYN_RECV); 1380 bh_unlock_sock(nsk); 1381 1382 /* keep a single reference */ 1383 __sock_put(nsk); 1384 return nsk; 1385} --- 40 unchanged lines hidden (view full) --- 1426 local_bh_disable(); 1427 bh_lock_sock(new_mptcp_sock); 1428 msk = mptcp_sk(new_mptcp_sock); 1429 msk->first = newsk; 1430 1431 newsk = new_mptcp_sock; 1432 mptcp_copy_inaddrs(newsk, ssk); 1433 list_add(&subflow->node, &msk->conn_list); | 1385 /* will be fully established after successful MPC subflow creation */ 1386 inet_sk_state_store(nsk, TCP_SYN_RECV); 1387 bh_unlock_sock(nsk); 1388 1389 /* keep a single reference */ 1390 __sock_put(nsk); 1391 return nsk; 1392} --- 40 unchanged lines hidden (view full) --- 1433 local_bh_disable(); 1434 bh_lock_sock(new_mptcp_sock); 1435 msk = mptcp_sk(new_mptcp_sock); 1436 msk->first = newsk; 1437 1438 newsk = new_mptcp_sock; 1439 mptcp_copy_inaddrs(newsk, ssk); 1440 list_add(&subflow->node, &msk->conn_list); |
1441 inet_sk_state_store(newsk, TCP_ESTABLISHED); |
|
1434 1435 bh_unlock_sock(new_mptcp_sock); 1436 1437 __MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEPASSIVEACK); 1438 local_bh_enable(); 1439 } else { 1440 MPTCP_INC_STATS(sock_net(sk), 1441 MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK); --- 174 unchanged lines hidden (view full) --- 1616 1617 /* passive connection, attach to msk socket */ 1618 parent_sock = READ_ONCE(parent->sk_socket); 1619 if (parent_sock && !sk->sk_socket) 1620 mptcp_sock_graft(sk, parent_sock); 1621 1622 ret = mptcp_pm_allow_new_subflow(msk); 1623 if (ret) { | 1442 1443 bh_unlock_sock(new_mptcp_sock); 1444 1445 __MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEPASSIVEACK); 1446 local_bh_enable(); 1447 } else { 1448 MPTCP_INC_STATS(sock_net(sk), 1449 MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK); --- 174 unchanged lines hidden (view full) --- 1624 1625 /* passive connection, attach to msk socket */ 1626 parent_sock = READ_ONCE(parent->sk_socket); 1627 if (parent_sock && !sk->sk_socket) 1628 mptcp_sock_graft(sk, parent_sock); 1629 1630 ret = mptcp_pm_allow_new_subflow(msk); 1631 if (ret) { |
1632 subflow->map_seq = msk->ack_seq; 1633 |
|
1624 /* active connections are already on conn_list */ 1625 spin_lock_bh(&msk->join_list_lock); 1626 if (!WARN_ON_ONCE(!list_empty(&subflow->node))) 1627 list_add_tail(&subflow->node, &msk->join_list); 1628 spin_unlock_bh(&msk->join_list_lock); 1629 } 1630 return ret; 1631} --- 138 unchanged lines hidden (view full) --- 1770 1771 lock_sock(sock->sk); 1772 ssock = __mptcp_socket_create(msk, TCP_LISTEN); 1773 if (IS_ERR(ssock)) { 1774 err = PTR_ERR(ssock); 1775 goto unlock; 1776 } 1777 | 1634 /* active connections are already on conn_list */ 1635 spin_lock_bh(&msk->join_list_lock); 1636 if (!WARN_ON_ONCE(!list_empty(&subflow->node))) 1637 list_add_tail(&subflow->node, &msk->join_list); 1638 spin_unlock_bh(&msk->join_list_lock); 1639 } 1640 return ret; 1641} --- 138 unchanged lines hidden (view full) --- 1780 1781 lock_sock(sock->sk); 1782 ssock = __mptcp_socket_create(msk, TCP_LISTEN); 1783 if (IS_ERR(ssock)) { 1784 err = PTR_ERR(ssock); 1785 goto unlock; 1786 } 1787 |
1788 sock_set_flag(sock->sk, SOCK_RCU_FREE); 1789 |
|
1778 err = ssock->ops->listen(ssock, backlog); 1779 inet_sk_state_store(sock->sk, inet_sk_state_load(ssock->sk)); 1780 if (!err) 1781 mptcp_copy_inaddrs(sock->sk, ssock->sk); 1782 1783unlock: 1784 release_sock(sock->sk); 1785 return err; --- 255 unchanged lines hidden --- | 1790 err = ssock->ops->listen(ssock, backlog); 1791 inet_sk_state_store(sock->sk, inet_sk_state_load(ssock->sk)); 1792 if (!err) 1793 mptcp_copy_inaddrs(sock->sk, ssock->sk); 1794 1795unlock: 1796 release_sock(sock->sk); 1797 return err; --- 255 unchanged lines hidden --- |