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 ---