|
24 | 24 |
|
25 | 25 | #define MPTCP_SAME_STATE TCP_MAX_STATES |
26 | 26 |
|
| 27 | +#if IS_ENABLED(CONFIG_MPTCP_IPV6) |
| 28 | +struct mptcp6_sock { |
| 29 | + struct mptcp_sock msk; |
| 30 | + struct ipv6_pinfo np; |
| 31 | +}; |
| 32 | +#endif |
| 33 | + |
27 | 34 | /* If msk has an initial subflow socket, and the MP_CAPABLE handshake has not |
28 | 35 | * completed yet or has failed, return the subflow socket. |
29 | 36 | * Otherwise return NULL. |
@@ -627,6 +634,30 @@ static void mptcp_copy_inaddrs(struct sock *msk, const struct sock *ssk) |
627 | 634 | inet_sk(msk)->inet_rcv_saddr = inet_sk(ssk)->inet_rcv_saddr; |
628 | 635 | } |
629 | 636 |
|
| 637 | +#if IS_ENABLED(CONFIG_MPTCP_IPV6) |
| 638 | +static struct ipv6_pinfo *mptcp_inet6_sk(const struct sock *sk) |
| 639 | +{ |
| 640 | + unsigned int offset = sizeof(struct mptcp6_sock) - sizeof(struct ipv6_pinfo); |
| 641 | + |
| 642 | + return (struct ipv6_pinfo *)(((u8 *)sk) + offset); |
| 643 | +} |
| 644 | +#endif |
| 645 | + |
| 646 | +struct sock *mptcp_sk_clone_lock(const struct sock *sk) |
| 647 | +{ |
| 648 | + struct sock *nsk = sk_clone_lock(sk, GFP_ATOMIC); |
| 649 | + |
| 650 | + if (!nsk) |
| 651 | + return NULL; |
| 652 | + |
| 653 | +#if IS_ENABLED(CONFIG_MPTCP_IPV6) |
| 654 | + if (nsk->sk_family == AF_INET6) |
| 655 | + inet_sk(nsk)->pinet6 = mptcp_inet6_sk(nsk); |
| 656 | +#endif |
| 657 | + |
| 658 | + return nsk; |
| 659 | +} |
| 660 | + |
630 | 661 | static struct sock *mptcp_accept(struct sock *sk, int flags, int *err, |
631 | 662 | bool kern) |
632 | 663 | { |
@@ -657,7 +688,7 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err, |
657 | 688 | lock_sock(sk); |
658 | 689 |
|
659 | 690 | local_bh_disable(); |
660 | | - new_mptcp_sock = sk_clone_lock(sk, GFP_ATOMIC); |
| 691 | + new_mptcp_sock = mptcp_sk_clone_lock(sk); |
661 | 692 | if (!new_mptcp_sock) { |
662 | 693 | *err = -ENOBUFS; |
663 | 694 | local_bh_enable(); |
@@ -1206,8 +1237,7 @@ int mptcp_proto_v6_init(void) |
1206 | 1237 | strcpy(mptcp_v6_prot.name, "MPTCPv6"); |
1207 | 1238 | mptcp_v6_prot.slab = NULL; |
1208 | 1239 | mptcp_v6_prot.destroy = mptcp_v6_destroy; |
1209 | | - mptcp_v6_prot.obj_size = sizeof(struct mptcp_sock) + |
1210 | | - sizeof(struct ipv6_pinfo); |
| 1240 | + mptcp_v6_prot.obj_size = sizeof(struct mptcp6_sock); |
1211 | 1241 |
|
1212 | 1242 | err = proto_register(&mptcp_v6_prot, 1); |
1213 | 1243 | if (err) |
|
0 commit comments