0001
0002
0003
0004
0005
0006
0007 #define pr_fmt(fmt) "MPTCP: " fmt
0008
0009 #include <linux/kernel.h>
0010 #include <linux/module.h>
0011 #include <net/sock.h>
0012 #include <net/protocol.h>
0013 #include <net/tcp.h>
0014 #include <net/mptcp.h>
0015 #include "protocol.h"
0016
0017 #define MIN_INFO_OPTLEN_SIZE 16
0018
0019 static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk)
0020 {
0021 sock_owned_by_me((const struct sock *)msk);
0022
0023 if (likely(!__mptcp_check_fallback(msk)))
0024 return NULL;
0025
0026 return msk->first;
0027 }
0028
0029 static u32 sockopt_seq_reset(const struct sock *sk)
0030 {
0031 sock_owned_by_me(sk);
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 return (u32)sk->sk_state << 24u;
0048 }
0049
0050 static void sockopt_seq_inc(struct mptcp_sock *msk)
0051 {
0052 u32 seq = (msk->setsockopt_seq + 1) & 0x00ffffff;
0053
0054 msk->setsockopt_seq = sockopt_seq_reset((struct sock *)msk) + seq;
0055 }
0056
0057 static int mptcp_get_int_option(struct mptcp_sock *msk, sockptr_t optval,
0058 unsigned int optlen, int *val)
0059 {
0060 if (optlen < sizeof(int))
0061 return -EINVAL;
0062
0063 if (copy_from_sockptr(val, optval, sizeof(*val)))
0064 return -EFAULT;
0065
0066 return 0;
0067 }
0068
0069 static void mptcp_sol_socket_sync_intval(struct mptcp_sock *msk, int optname, int val)
0070 {
0071 struct mptcp_subflow_context *subflow;
0072 struct sock *sk = (struct sock *)msk;
0073
0074 lock_sock(sk);
0075 sockopt_seq_inc(msk);
0076
0077 mptcp_for_each_subflow(msk, subflow) {
0078 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0079 bool slow = lock_sock_fast(ssk);
0080
0081 switch (optname) {
0082 case SO_DEBUG:
0083 sock_valbool_flag(ssk, SOCK_DBG, !!val);
0084 break;
0085 case SO_KEEPALIVE:
0086 if (ssk->sk_prot->keepalive)
0087 ssk->sk_prot->keepalive(ssk, !!val);
0088 sock_valbool_flag(ssk, SOCK_KEEPOPEN, !!val);
0089 break;
0090 case SO_PRIORITY:
0091 ssk->sk_priority = val;
0092 break;
0093 case SO_SNDBUF:
0094 case SO_SNDBUFFORCE:
0095 ssk->sk_userlocks |= SOCK_SNDBUF_LOCK;
0096 WRITE_ONCE(ssk->sk_sndbuf, sk->sk_sndbuf);
0097 break;
0098 case SO_RCVBUF:
0099 case SO_RCVBUFFORCE:
0100 ssk->sk_userlocks |= SOCK_RCVBUF_LOCK;
0101 WRITE_ONCE(ssk->sk_rcvbuf, sk->sk_rcvbuf);
0102 break;
0103 case SO_MARK:
0104 if (READ_ONCE(ssk->sk_mark) != sk->sk_mark) {
0105 ssk->sk_mark = sk->sk_mark;
0106 sk_dst_reset(ssk);
0107 }
0108 break;
0109 case SO_INCOMING_CPU:
0110 WRITE_ONCE(ssk->sk_incoming_cpu, val);
0111 break;
0112 }
0113
0114 subflow->setsockopt_seq = msk->setsockopt_seq;
0115 unlock_sock_fast(ssk, slow);
0116 }
0117
0118 release_sock(sk);
0119 }
0120
0121 static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, int val)
0122 {
0123 sockptr_t optval = KERNEL_SOCKPTR(&val);
0124 struct sock *sk = (struct sock *)msk;
0125 int ret;
0126
0127 ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
0128 optval, sizeof(val));
0129 if (ret)
0130 return ret;
0131
0132 mptcp_sol_socket_sync_intval(msk, optname, val);
0133 return 0;
0134 }
0135
0136 static void mptcp_so_incoming_cpu(struct mptcp_sock *msk, int val)
0137 {
0138 struct sock *sk = (struct sock *)msk;
0139
0140 WRITE_ONCE(sk->sk_incoming_cpu, val);
0141
0142 mptcp_sol_socket_sync_intval(msk, SO_INCOMING_CPU, val);
0143 }
0144
0145 static int mptcp_setsockopt_sol_socket_tstamp(struct mptcp_sock *msk, int optname, int val)
0146 {
0147 sockptr_t optval = KERNEL_SOCKPTR(&val);
0148 struct mptcp_subflow_context *subflow;
0149 struct sock *sk = (struct sock *)msk;
0150 int ret;
0151
0152 ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
0153 optval, sizeof(val));
0154 if (ret)
0155 return ret;
0156
0157 lock_sock(sk);
0158 mptcp_for_each_subflow(msk, subflow) {
0159 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0160 bool slow = lock_sock_fast(ssk);
0161
0162 sock_set_timestamp(sk, optname, !!val);
0163 unlock_sock_fast(ssk, slow);
0164 }
0165
0166 release_sock(sk);
0167 return 0;
0168 }
0169
0170 static int mptcp_setsockopt_sol_socket_int(struct mptcp_sock *msk, int optname,
0171 sockptr_t optval,
0172 unsigned int optlen)
0173 {
0174 int val, ret;
0175
0176 ret = mptcp_get_int_option(msk, optval, optlen, &val);
0177 if (ret)
0178 return ret;
0179
0180 switch (optname) {
0181 case SO_KEEPALIVE:
0182 mptcp_sol_socket_sync_intval(msk, optname, val);
0183 return 0;
0184 case SO_DEBUG:
0185 case SO_MARK:
0186 case SO_PRIORITY:
0187 case SO_SNDBUF:
0188 case SO_SNDBUFFORCE:
0189 case SO_RCVBUF:
0190 case SO_RCVBUFFORCE:
0191 return mptcp_sol_socket_intval(msk, optname, val);
0192 case SO_INCOMING_CPU:
0193 mptcp_so_incoming_cpu(msk, val);
0194 return 0;
0195 case SO_TIMESTAMP_OLD:
0196 case SO_TIMESTAMP_NEW:
0197 case SO_TIMESTAMPNS_OLD:
0198 case SO_TIMESTAMPNS_NEW:
0199 return mptcp_setsockopt_sol_socket_tstamp(msk, optname, val);
0200 }
0201
0202 return -ENOPROTOOPT;
0203 }
0204
0205 static int mptcp_setsockopt_sol_socket_timestamping(struct mptcp_sock *msk,
0206 int optname,
0207 sockptr_t optval,
0208 unsigned int optlen)
0209 {
0210 struct mptcp_subflow_context *subflow;
0211 struct sock *sk = (struct sock *)msk;
0212 struct so_timestamping timestamping;
0213 int ret;
0214
0215 if (optlen == sizeof(timestamping)) {
0216 if (copy_from_sockptr(×tamping, optval,
0217 sizeof(timestamping)))
0218 return -EFAULT;
0219 } else if (optlen == sizeof(int)) {
0220 memset(×tamping, 0, sizeof(timestamping));
0221
0222 if (copy_from_sockptr(×tamping.flags, optval, sizeof(int)))
0223 return -EFAULT;
0224 } else {
0225 return -EINVAL;
0226 }
0227
0228 ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
0229 KERNEL_SOCKPTR(×tamping),
0230 sizeof(timestamping));
0231 if (ret)
0232 return ret;
0233
0234 lock_sock(sk);
0235
0236 mptcp_for_each_subflow(msk, subflow) {
0237 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0238 bool slow = lock_sock_fast(ssk);
0239
0240 sock_set_timestamping(sk, optname, timestamping);
0241 unlock_sock_fast(ssk, slow);
0242 }
0243
0244 release_sock(sk);
0245
0246 return 0;
0247 }
0248
0249 static int mptcp_setsockopt_sol_socket_linger(struct mptcp_sock *msk, sockptr_t optval,
0250 unsigned int optlen)
0251 {
0252 struct mptcp_subflow_context *subflow;
0253 struct sock *sk = (struct sock *)msk;
0254 struct linger ling;
0255 sockptr_t kopt;
0256 int ret;
0257
0258 if (optlen < sizeof(ling))
0259 return -EINVAL;
0260
0261 if (copy_from_sockptr(&ling, optval, sizeof(ling)))
0262 return -EFAULT;
0263
0264 kopt = KERNEL_SOCKPTR(&ling);
0265 ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, SO_LINGER, kopt, sizeof(ling));
0266 if (ret)
0267 return ret;
0268
0269 lock_sock(sk);
0270 sockopt_seq_inc(msk);
0271 mptcp_for_each_subflow(msk, subflow) {
0272 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0273 bool slow = lock_sock_fast(ssk);
0274
0275 if (!ling.l_onoff) {
0276 sock_reset_flag(ssk, SOCK_LINGER);
0277 } else {
0278 ssk->sk_lingertime = sk->sk_lingertime;
0279 sock_set_flag(ssk, SOCK_LINGER);
0280 }
0281
0282 subflow->setsockopt_seq = msk->setsockopt_seq;
0283 unlock_sock_fast(ssk, slow);
0284 }
0285
0286 release_sock(sk);
0287 return 0;
0288 }
0289
0290 static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
0291 sockptr_t optval, unsigned int optlen)
0292 {
0293 struct sock *sk = (struct sock *)msk;
0294 struct socket *ssock;
0295 int ret;
0296
0297 switch (optname) {
0298 case SO_REUSEPORT:
0299 case SO_REUSEADDR:
0300 case SO_BINDTODEVICE:
0301 case SO_BINDTOIFINDEX:
0302 lock_sock(sk);
0303 ssock = __mptcp_nmpc_socket(msk);
0304 if (!ssock) {
0305 release_sock(sk);
0306 return -EINVAL;
0307 }
0308
0309 ret = sock_setsockopt(ssock, SOL_SOCKET, optname, optval, optlen);
0310 if (ret == 0) {
0311 if (optname == SO_REUSEPORT)
0312 sk->sk_reuseport = ssock->sk->sk_reuseport;
0313 else if (optname == SO_REUSEADDR)
0314 sk->sk_reuse = ssock->sk->sk_reuse;
0315 else if (optname == SO_BINDTODEVICE)
0316 sk->sk_bound_dev_if = ssock->sk->sk_bound_dev_if;
0317 else if (optname == SO_BINDTOIFINDEX)
0318 sk->sk_bound_dev_if = ssock->sk->sk_bound_dev_if;
0319 }
0320 release_sock(sk);
0321 return ret;
0322 case SO_KEEPALIVE:
0323 case SO_PRIORITY:
0324 case SO_SNDBUF:
0325 case SO_SNDBUFFORCE:
0326 case SO_RCVBUF:
0327 case SO_RCVBUFFORCE:
0328 case SO_MARK:
0329 case SO_INCOMING_CPU:
0330 case SO_DEBUG:
0331 case SO_TIMESTAMP_OLD:
0332 case SO_TIMESTAMP_NEW:
0333 case SO_TIMESTAMPNS_OLD:
0334 case SO_TIMESTAMPNS_NEW:
0335 return mptcp_setsockopt_sol_socket_int(msk, optname, optval,
0336 optlen);
0337 case SO_TIMESTAMPING_OLD:
0338 case SO_TIMESTAMPING_NEW:
0339 return mptcp_setsockopt_sol_socket_timestamping(msk, optname,
0340 optval, optlen);
0341 case SO_LINGER:
0342 return mptcp_setsockopt_sol_socket_linger(msk, optval, optlen);
0343 case SO_RCVLOWAT:
0344 case SO_RCVTIMEO_OLD:
0345 case SO_RCVTIMEO_NEW:
0346 case SO_SNDTIMEO_OLD:
0347 case SO_SNDTIMEO_NEW:
0348 case SO_BUSY_POLL:
0349 case SO_PREFER_BUSY_POLL:
0350 case SO_BUSY_POLL_BUDGET:
0351
0352 return sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname, optval, optlen);
0353 case SO_NO_CHECK:
0354 case SO_DONTROUTE:
0355 case SO_BROADCAST:
0356 case SO_BSDCOMPAT:
0357 case SO_PASSCRED:
0358 case SO_PASSSEC:
0359 case SO_RXQ_OVFL:
0360 case SO_WIFI_STATUS:
0361 case SO_NOFCS:
0362 case SO_SELECT_ERR_QUEUE:
0363 return 0;
0364 }
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383 return -EOPNOTSUPP;
0384 }
0385
0386 static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
0387 sockptr_t optval, unsigned int optlen)
0388 {
0389 struct sock *sk = (struct sock *)msk;
0390 int ret = -EOPNOTSUPP;
0391 struct socket *ssock;
0392
0393 switch (optname) {
0394 case IPV6_V6ONLY:
0395 case IPV6_TRANSPARENT:
0396 case IPV6_FREEBIND:
0397 lock_sock(sk);
0398 ssock = __mptcp_nmpc_socket(msk);
0399 if (!ssock) {
0400 release_sock(sk);
0401 return -EINVAL;
0402 }
0403
0404 ret = tcp_setsockopt(ssock->sk, SOL_IPV6, optname, optval, optlen);
0405 if (ret != 0) {
0406 release_sock(sk);
0407 return ret;
0408 }
0409
0410 sockopt_seq_inc(msk);
0411
0412 switch (optname) {
0413 case IPV6_V6ONLY:
0414 sk->sk_ipv6only = ssock->sk->sk_ipv6only;
0415 break;
0416 case IPV6_TRANSPARENT:
0417 inet_sk(sk)->transparent = inet_sk(ssock->sk)->transparent;
0418 break;
0419 case IPV6_FREEBIND:
0420 inet_sk(sk)->freebind = inet_sk(ssock->sk)->freebind;
0421 break;
0422 }
0423
0424 release_sock(sk);
0425 break;
0426 }
0427
0428 return ret;
0429 }
0430
0431 static bool mptcp_supported_sockopt(int level, int optname)
0432 {
0433 if (level == SOL_IP) {
0434 switch (optname) {
0435
0436 case IP_FREEBIND:
0437 case IP_TRANSPARENT:
0438
0439
0440 case IP_PKTINFO:
0441 case IP_RECVTTL:
0442 case IP_RECVTOS:
0443 case IP_RECVOPTS:
0444 case IP_RETOPTS:
0445 case IP_PASSSEC:
0446 case IP_RECVORIGDSTADDR:
0447 case IP_CHECKSUM:
0448 case IP_RECVFRAGSIZE:
0449
0450
0451 case IP_TOS:
0452 case IP_TTL:
0453 case IP_BIND_ADDRESS_NO_PORT:
0454 case IP_MTU_DISCOVER:
0455 case IP_RECVERR:
0456
0457
0458 case IP_MINTTL:
0459
0460
0461 case IP_RECVERR_RFC4884:
0462 return true;
0463 }
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476 return false;
0477 }
0478 if (level == SOL_IPV6) {
0479 switch (optname) {
0480 case IPV6_V6ONLY:
0481
0482
0483 case IPV6_RECVPKTINFO:
0484 case IPV6_2292PKTINFO:
0485 case IPV6_RECVHOPLIMIT:
0486 case IPV6_2292HOPLIMIT:
0487 case IPV6_RECVRTHDR:
0488 case IPV6_2292RTHDR:
0489 case IPV6_RECVHOPOPTS:
0490 case IPV6_2292HOPOPTS:
0491 case IPV6_RECVDSTOPTS:
0492 case IPV6_2292DSTOPTS:
0493 case IPV6_RECVTCLASS:
0494 case IPV6_FLOWINFO:
0495 case IPV6_RECVPATHMTU:
0496 case IPV6_RECVORIGDSTADDR:
0497 case IPV6_RECVFRAGSIZE:
0498
0499
0500 case IPV6_TCLASS:
0501 case IPV6_TRANSPARENT:
0502 case IPV6_FREEBIND:
0503 case IPV6_PKTINFO:
0504 case IPV6_2292PKTOPTIONS:
0505 case IPV6_UNICAST_HOPS:
0506 case IPV6_MTU_DISCOVER:
0507 case IPV6_MTU:
0508 case IPV6_RECVERR:
0509 case IPV6_FLOWINFO_SEND:
0510 case IPV6_FLOWLABEL_MGR:
0511 case IPV6_MINHOPCOUNT:
0512 case IPV6_DONTFRAG:
0513 case IPV6_AUTOFLOWLABEL:
0514
0515
0516 case IPV6_RECVERR_RFC4884:
0517 return true;
0518 }
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 return false;
0536 }
0537 if (level == SOL_TCP) {
0538 switch (optname) {
0539
0540 case TCP_THIN_DUPACK:
0541 case TCP_DEFER_ACCEPT:
0542
0543
0544 case TCP_MAXSEG:
0545 case TCP_NODELAY:
0546 case TCP_THIN_LINEAR_TIMEOUTS:
0547 case TCP_CONGESTION:
0548 case TCP_CORK:
0549 case TCP_KEEPIDLE:
0550 case TCP_KEEPINTVL:
0551 case TCP_KEEPCNT:
0552 case TCP_SYNCNT:
0553 case TCP_SAVE_SYN:
0554 case TCP_LINGER2:
0555 case TCP_WINDOW_CLAMP:
0556 case TCP_QUICKACK:
0557 case TCP_USER_TIMEOUT:
0558 case TCP_TIMESTAMP:
0559 case TCP_NOTSENT_LOWAT:
0560 case TCP_TX_DELAY:
0561 case TCP_INQ:
0562 return true;
0563 }
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573 }
0574 return false;
0575 }
0576
0577 static int mptcp_setsockopt_sol_tcp_congestion(struct mptcp_sock *msk, sockptr_t optval,
0578 unsigned int optlen)
0579 {
0580 struct mptcp_subflow_context *subflow;
0581 struct sock *sk = (struct sock *)msk;
0582 char name[TCP_CA_NAME_MAX];
0583 bool cap_net_admin;
0584 int ret;
0585
0586 if (optlen < 1)
0587 return -EINVAL;
0588
0589 ret = strncpy_from_sockptr(name, optval,
0590 min_t(long, TCP_CA_NAME_MAX - 1, optlen));
0591 if (ret < 0)
0592 return -EFAULT;
0593
0594 name[ret] = 0;
0595
0596 cap_net_admin = ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN);
0597
0598 ret = 0;
0599 lock_sock(sk);
0600 sockopt_seq_inc(msk);
0601 mptcp_for_each_subflow(msk, subflow) {
0602 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0603 int err;
0604
0605 lock_sock(ssk);
0606 err = tcp_set_congestion_control(ssk, name, true, cap_net_admin);
0607 if (err < 0 && ret == 0)
0608 ret = err;
0609 subflow->setsockopt_seq = msk->setsockopt_seq;
0610 release_sock(ssk);
0611 }
0612
0613 if (ret == 0)
0614 strcpy(msk->ca_name, name);
0615
0616 release_sock(sk);
0617 return ret;
0618 }
0619
0620 static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optval,
0621 unsigned int optlen)
0622 {
0623 struct mptcp_subflow_context *subflow;
0624 struct sock *sk = (struct sock *)msk;
0625 int val;
0626
0627 if (optlen < sizeof(int))
0628 return -EINVAL;
0629
0630 if (copy_from_sockptr(&val, optval, sizeof(val)))
0631 return -EFAULT;
0632
0633 lock_sock(sk);
0634 sockopt_seq_inc(msk);
0635 msk->cork = !!val;
0636 mptcp_for_each_subflow(msk, subflow) {
0637 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0638
0639 lock_sock(ssk);
0640 __tcp_sock_set_cork(ssk, !!val);
0641 release_sock(ssk);
0642 }
0643 if (!val)
0644 mptcp_check_and_set_pending(sk);
0645 release_sock(sk);
0646
0647 return 0;
0648 }
0649
0650 static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t optval,
0651 unsigned int optlen)
0652 {
0653 struct mptcp_subflow_context *subflow;
0654 struct sock *sk = (struct sock *)msk;
0655 int val;
0656
0657 if (optlen < sizeof(int))
0658 return -EINVAL;
0659
0660 if (copy_from_sockptr(&val, optval, sizeof(val)))
0661 return -EFAULT;
0662
0663 lock_sock(sk);
0664 sockopt_seq_inc(msk);
0665 msk->nodelay = !!val;
0666 mptcp_for_each_subflow(msk, subflow) {
0667 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0668
0669 lock_sock(ssk);
0670 __tcp_sock_set_nodelay(ssk, !!val);
0671 release_sock(ssk);
0672 }
0673 if (val)
0674 mptcp_check_and_set_pending(sk);
0675 release_sock(sk);
0676
0677 return 0;
0678 }
0679
0680 static int mptcp_setsockopt_sol_ip_set_transparent(struct mptcp_sock *msk, int optname,
0681 sockptr_t optval, unsigned int optlen)
0682 {
0683 struct sock *sk = (struct sock *)msk;
0684 struct inet_sock *issk;
0685 struct socket *ssock;
0686 int err;
0687
0688 err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
0689 if (err != 0)
0690 return err;
0691
0692 lock_sock(sk);
0693
0694 ssock = __mptcp_nmpc_socket(msk);
0695 if (!ssock) {
0696 release_sock(sk);
0697 return -EINVAL;
0698 }
0699
0700 issk = inet_sk(ssock->sk);
0701
0702 switch (optname) {
0703 case IP_FREEBIND:
0704 issk->freebind = inet_sk(sk)->freebind;
0705 break;
0706 case IP_TRANSPARENT:
0707 issk->transparent = inet_sk(sk)->transparent;
0708 break;
0709 default:
0710 release_sock(sk);
0711 WARN_ON_ONCE(1);
0712 return -EOPNOTSUPP;
0713 }
0714
0715 sockopt_seq_inc(msk);
0716 release_sock(sk);
0717 return 0;
0718 }
0719
0720 static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname,
0721 sockptr_t optval, unsigned int optlen)
0722 {
0723 struct mptcp_subflow_context *subflow;
0724 struct sock *sk = (struct sock *)msk;
0725 int err, val;
0726
0727 err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
0728
0729 if (err != 0)
0730 return err;
0731
0732 lock_sock(sk);
0733 sockopt_seq_inc(msk);
0734 val = inet_sk(sk)->tos;
0735 mptcp_for_each_subflow(msk, subflow) {
0736 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
0737
0738 __ip_sock_set_tos(ssk, val);
0739 }
0740 release_sock(sk);
0741
0742 return err;
0743 }
0744
0745 static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
0746 sockptr_t optval, unsigned int optlen)
0747 {
0748 switch (optname) {
0749 case IP_FREEBIND:
0750 case IP_TRANSPARENT:
0751 return mptcp_setsockopt_sol_ip_set_transparent(msk, optname, optval, optlen);
0752 case IP_TOS:
0753 return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen);
0754 }
0755
0756 return -EOPNOTSUPP;
0757 }
0758
0759 static int mptcp_setsockopt_sol_tcp_defer(struct mptcp_sock *msk, sockptr_t optval,
0760 unsigned int optlen)
0761 {
0762 struct socket *listener;
0763
0764 listener = __mptcp_nmpc_socket(msk);
0765 if (!listener)
0766 return 0;
0767
0768 return tcp_setsockopt(listener->sk, SOL_TCP, TCP_DEFER_ACCEPT, optval, optlen);
0769 }
0770
0771 static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
0772 sockptr_t optval, unsigned int optlen)
0773 {
0774 struct sock *sk = (void *)msk;
0775 int ret, val;
0776
0777 switch (optname) {
0778 case TCP_INQ:
0779 ret = mptcp_get_int_option(msk, optval, optlen, &val);
0780 if (ret)
0781 return ret;
0782 if (val < 0 || val > 1)
0783 return -EINVAL;
0784
0785 lock_sock(sk);
0786 msk->recvmsg_inq = !!val;
0787 release_sock(sk);
0788 return 0;
0789 case TCP_ULP:
0790 return -EOPNOTSUPP;
0791 case TCP_CONGESTION:
0792 return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen);
0793 case TCP_CORK:
0794 return mptcp_setsockopt_sol_tcp_cork(msk, optval, optlen);
0795 case TCP_NODELAY:
0796 return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen);
0797 case TCP_DEFER_ACCEPT:
0798 return mptcp_setsockopt_sol_tcp_defer(msk, optval, optlen);
0799 }
0800
0801 return -EOPNOTSUPP;
0802 }
0803
0804 int mptcp_setsockopt(struct sock *sk, int level, int optname,
0805 sockptr_t optval, unsigned int optlen)
0806 {
0807 struct mptcp_sock *msk = mptcp_sk(sk);
0808 struct sock *ssk;
0809
0810 pr_debug("msk=%p", msk);
0811
0812 if (level == SOL_SOCKET)
0813 return mptcp_setsockopt_sol_socket(msk, optname, optval, optlen);
0814
0815 if (!mptcp_supported_sockopt(level, optname))
0816 return -ENOPROTOOPT;
0817
0818
0819
0820
0821
0822
0823
0824 lock_sock(sk);
0825 ssk = __mptcp_tcp_fallback(msk);
0826 release_sock(sk);
0827 if (ssk)
0828 return tcp_setsockopt(ssk, level, optname, optval, optlen);
0829
0830 if (level == SOL_IP)
0831 return mptcp_setsockopt_v4(msk, optname, optval, optlen);
0832
0833 if (level == SOL_IPV6)
0834 return mptcp_setsockopt_v6(msk, optname, optval, optlen);
0835
0836 if (level == SOL_TCP)
0837 return mptcp_setsockopt_sol_tcp(msk, optname, optval, optlen);
0838
0839 return -EOPNOTSUPP;
0840 }
0841
0842 static int mptcp_getsockopt_first_sf_only(struct mptcp_sock *msk, int level, int optname,
0843 char __user *optval, int __user *optlen)
0844 {
0845 struct sock *sk = (struct sock *)msk;
0846 struct socket *ssock;
0847 int ret = -EINVAL;
0848 struct sock *ssk;
0849
0850 lock_sock(sk);
0851 ssk = msk->first;
0852 if (ssk) {
0853 ret = tcp_getsockopt(ssk, level, optname, optval, optlen);
0854 goto out;
0855 }
0856
0857 ssock = __mptcp_nmpc_socket(msk);
0858 if (!ssock)
0859 goto out;
0860
0861 ret = tcp_getsockopt(ssock->sk, level, optname, optval, optlen);
0862
0863 out:
0864 release_sock(sk);
0865 return ret;
0866 }
0867
0868 void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
0869 {
0870 u32 flags = 0;
0871 u8 val;
0872
0873 memset(info, 0, sizeof(*info));
0874
0875 info->mptcpi_subflows = READ_ONCE(msk->pm.subflows);
0876 info->mptcpi_add_addr_signal = READ_ONCE(msk->pm.add_addr_signaled);
0877 info->mptcpi_add_addr_accepted = READ_ONCE(msk->pm.add_addr_accepted);
0878 info->mptcpi_local_addr_used = READ_ONCE(msk->pm.local_addr_used);
0879 info->mptcpi_subflows_max = mptcp_pm_get_subflows_max(msk);
0880 val = mptcp_pm_get_add_addr_signal_max(msk);
0881 info->mptcpi_add_addr_signal_max = val;
0882 val = mptcp_pm_get_add_addr_accept_max(msk);
0883 info->mptcpi_add_addr_accepted_max = val;
0884 info->mptcpi_local_addr_max = mptcp_pm_get_local_addr_max(msk);
0885 if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags))
0886 flags |= MPTCP_INFO_FLAG_FALLBACK;
0887 if (READ_ONCE(msk->can_ack))
0888 flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED;
0889 info->mptcpi_flags = flags;
0890 info->mptcpi_token = READ_ONCE(msk->token);
0891 info->mptcpi_write_seq = READ_ONCE(msk->write_seq);
0892 info->mptcpi_snd_una = READ_ONCE(msk->snd_una);
0893 info->mptcpi_rcv_nxt = READ_ONCE(msk->ack_seq);
0894 info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled);
0895 }
0896 EXPORT_SYMBOL_GPL(mptcp_diag_fill_info);
0897
0898 static int mptcp_getsockopt_info(struct mptcp_sock *msk, char __user *optval, int __user *optlen)
0899 {
0900 struct mptcp_info m_info;
0901 int len;
0902
0903 if (get_user(len, optlen))
0904 return -EFAULT;
0905
0906 len = min_t(unsigned int, len, sizeof(struct mptcp_info));
0907
0908 mptcp_diag_fill_info(msk, &m_info);
0909
0910 if (put_user(len, optlen))
0911 return -EFAULT;
0912
0913 if (copy_to_user(optval, &m_info, len))
0914 return -EFAULT;
0915
0916 return 0;
0917 }
0918
0919 static int mptcp_put_subflow_data(struct mptcp_subflow_data *sfd,
0920 char __user *optval,
0921 u32 copied,
0922 int __user *optlen)
0923 {
0924 u32 copylen = min_t(u32, sfd->size_subflow_data, sizeof(*sfd));
0925
0926 if (copied)
0927 copied += sfd->size_subflow_data;
0928 else
0929 copied = copylen;
0930
0931 if (put_user(copied, optlen))
0932 return -EFAULT;
0933
0934 if (copy_to_user(optval, sfd, copylen))
0935 return -EFAULT;
0936
0937 return 0;
0938 }
0939
0940 static int mptcp_get_subflow_data(struct mptcp_subflow_data *sfd,
0941 char __user *optval, int __user *optlen)
0942 {
0943 int len, copylen;
0944
0945 if (get_user(len, optlen))
0946 return -EFAULT;
0947
0948
0949
0950
0951 BUILD_BUG_ON(sizeof(*sfd) != MIN_INFO_OPTLEN_SIZE);
0952
0953 if (len < MIN_INFO_OPTLEN_SIZE)
0954 return -EINVAL;
0955
0956 memset(sfd, 0, sizeof(*sfd));
0957
0958 copylen = min_t(unsigned int, len, sizeof(*sfd));
0959 if (copy_from_user(sfd, optval, copylen))
0960 return -EFAULT;
0961
0962
0963 if (sfd->size_subflow_data > INT_MAX ||
0964 sfd->size_user > INT_MAX)
0965 return -EINVAL;
0966
0967 if (sfd->size_subflow_data < MIN_INFO_OPTLEN_SIZE ||
0968 sfd->size_subflow_data > len)
0969 return -EINVAL;
0970
0971 if (sfd->num_subflows || sfd->size_kernel)
0972 return -EINVAL;
0973
0974 return len - sfd->size_subflow_data;
0975 }
0976
0977 static int mptcp_getsockopt_tcpinfo(struct mptcp_sock *msk, char __user *optval,
0978 int __user *optlen)
0979 {
0980 struct mptcp_subflow_context *subflow;
0981 struct sock *sk = &msk->sk.icsk_inet.sk;
0982 unsigned int sfcount = 0, copied = 0;
0983 struct mptcp_subflow_data sfd;
0984 char __user *infoptr;
0985 int len;
0986
0987 len = mptcp_get_subflow_data(&sfd, optval, optlen);
0988 if (len < 0)
0989 return len;
0990
0991 sfd.size_kernel = sizeof(struct tcp_info);
0992 sfd.size_user = min_t(unsigned int, sfd.size_user,
0993 sizeof(struct tcp_info));
0994
0995 infoptr = optval + sfd.size_subflow_data;
0996
0997 lock_sock(sk);
0998
0999 mptcp_for_each_subflow(msk, subflow) {
1000 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
1001
1002 ++sfcount;
1003
1004 if (len && len >= sfd.size_user) {
1005 struct tcp_info info;
1006
1007 tcp_get_info(ssk, &info);
1008
1009 if (copy_to_user(infoptr, &info, sfd.size_user)) {
1010 release_sock(sk);
1011 return -EFAULT;
1012 }
1013
1014 infoptr += sfd.size_user;
1015 copied += sfd.size_user;
1016 len -= sfd.size_user;
1017 }
1018 }
1019
1020 release_sock(sk);
1021
1022 sfd.num_subflows = sfcount;
1023
1024 if (mptcp_put_subflow_data(&sfd, optval, copied, optlen))
1025 return -EFAULT;
1026
1027 return 0;
1028 }
1029
1030 static void mptcp_get_sub_addrs(const struct sock *sk, struct mptcp_subflow_addrs *a)
1031 {
1032 struct inet_sock *inet = inet_sk(sk);
1033
1034 memset(a, 0, sizeof(*a));
1035
1036 if (sk->sk_family == AF_INET) {
1037 a->sin_local.sin_family = AF_INET;
1038 a->sin_local.sin_port = inet->inet_sport;
1039 a->sin_local.sin_addr.s_addr = inet->inet_rcv_saddr;
1040
1041 if (!a->sin_local.sin_addr.s_addr)
1042 a->sin_local.sin_addr.s_addr = inet->inet_saddr;
1043
1044 a->sin_remote.sin_family = AF_INET;
1045 a->sin_remote.sin_port = inet->inet_dport;
1046 a->sin_remote.sin_addr.s_addr = inet->inet_daddr;
1047 #if IS_ENABLED(CONFIG_IPV6)
1048 } else if (sk->sk_family == AF_INET6) {
1049 const struct ipv6_pinfo *np = inet6_sk(sk);
1050
1051 if (WARN_ON_ONCE(!np))
1052 return;
1053
1054 a->sin6_local.sin6_family = AF_INET6;
1055 a->sin6_local.sin6_port = inet->inet_sport;
1056
1057 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr))
1058 a->sin6_local.sin6_addr = np->saddr;
1059 else
1060 a->sin6_local.sin6_addr = sk->sk_v6_rcv_saddr;
1061
1062 a->sin6_remote.sin6_family = AF_INET6;
1063 a->sin6_remote.sin6_port = inet->inet_dport;
1064 a->sin6_remote.sin6_addr = sk->sk_v6_daddr;
1065 #endif
1066 }
1067 }
1068
1069 static int mptcp_getsockopt_subflow_addrs(struct mptcp_sock *msk, char __user *optval,
1070 int __user *optlen)
1071 {
1072 struct sock *sk = &msk->sk.icsk_inet.sk;
1073 struct mptcp_subflow_context *subflow;
1074 unsigned int sfcount = 0, copied = 0;
1075 struct mptcp_subflow_data sfd;
1076 char __user *addrptr;
1077 int len;
1078
1079 len = mptcp_get_subflow_data(&sfd, optval, optlen);
1080 if (len < 0)
1081 return len;
1082
1083 sfd.size_kernel = sizeof(struct mptcp_subflow_addrs);
1084 sfd.size_user = min_t(unsigned int, sfd.size_user,
1085 sizeof(struct mptcp_subflow_addrs));
1086
1087 addrptr = optval + sfd.size_subflow_data;
1088
1089 lock_sock(sk);
1090
1091 mptcp_for_each_subflow(msk, subflow) {
1092 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
1093
1094 ++sfcount;
1095
1096 if (len && len >= sfd.size_user) {
1097 struct mptcp_subflow_addrs a;
1098
1099 mptcp_get_sub_addrs(ssk, &a);
1100
1101 if (copy_to_user(addrptr, &a, sfd.size_user)) {
1102 release_sock(sk);
1103 return -EFAULT;
1104 }
1105
1106 addrptr += sfd.size_user;
1107 copied += sfd.size_user;
1108 len -= sfd.size_user;
1109 }
1110 }
1111
1112 release_sock(sk);
1113
1114 sfd.num_subflows = sfcount;
1115
1116 if (mptcp_put_subflow_data(&sfd, optval, copied, optlen))
1117 return -EFAULT;
1118
1119 return 0;
1120 }
1121
1122 static int mptcp_put_int_option(struct mptcp_sock *msk, char __user *optval,
1123 int __user *optlen, int val)
1124 {
1125 int len;
1126
1127 if (get_user(len, optlen))
1128 return -EFAULT;
1129 if (len < 0)
1130 return -EINVAL;
1131
1132 if (len < sizeof(int) && len > 0 && val >= 0 && val <= 255) {
1133 unsigned char ucval = (unsigned char)val;
1134
1135 len = 1;
1136 if (put_user(len, optlen))
1137 return -EFAULT;
1138 if (copy_to_user(optval, &ucval, 1))
1139 return -EFAULT;
1140 } else {
1141 len = min_t(unsigned int, len, sizeof(int));
1142 if (put_user(len, optlen))
1143 return -EFAULT;
1144 if (copy_to_user(optval, &val, len))
1145 return -EFAULT;
1146 }
1147
1148 return 0;
1149 }
1150
1151 static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
1152 char __user *optval, int __user *optlen)
1153 {
1154 switch (optname) {
1155 case TCP_ULP:
1156 case TCP_CONGESTION:
1157 case TCP_INFO:
1158 case TCP_CC_INFO:
1159 case TCP_DEFER_ACCEPT:
1160 return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname,
1161 optval, optlen);
1162 case TCP_INQ:
1163 return mptcp_put_int_option(msk, optval, optlen, msk->recvmsg_inq);
1164 case TCP_CORK:
1165 return mptcp_put_int_option(msk, optval, optlen, msk->cork);
1166 case TCP_NODELAY:
1167 return mptcp_put_int_option(msk, optval, optlen, msk->nodelay);
1168 }
1169 return -EOPNOTSUPP;
1170 }
1171
1172 static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
1173 char __user *optval, int __user *optlen)
1174 {
1175 struct sock *sk = (void *)msk;
1176
1177 switch (optname) {
1178 case IP_TOS:
1179 return mptcp_put_int_option(msk, optval, optlen, inet_sk(sk)->tos);
1180 }
1181
1182 return -EOPNOTSUPP;
1183 }
1184
1185 static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname,
1186 char __user *optval, int __user *optlen)
1187 {
1188 switch (optname) {
1189 case MPTCP_INFO:
1190 return mptcp_getsockopt_info(msk, optval, optlen);
1191 case MPTCP_TCPINFO:
1192 return mptcp_getsockopt_tcpinfo(msk, optval, optlen);
1193 case MPTCP_SUBFLOW_ADDRS:
1194 return mptcp_getsockopt_subflow_addrs(msk, optval, optlen);
1195 }
1196
1197 return -EOPNOTSUPP;
1198 }
1199
1200 int mptcp_getsockopt(struct sock *sk, int level, int optname,
1201 char __user *optval, int __user *option)
1202 {
1203 struct mptcp_sock *msk = mptcp_sk(sk);
1204 struct sock *ssk;
1205
1206 pr_debug("msk=%p", msk);
1207
1208
1209
1210
1211
1212
1213
1214 lock_sock(sk);
1215 ssk = __mptcp_tcp_fallback(msk);
1216 release_sock(sk);
1217 if (ssk)
1218 return tcp_getsockopt(ssk, level, optname, optval, option);
1219
1220 if (level == SOL_IP)
1221 return mptcp_getsockopt_v4(msk, optname, optval, option);
1222 if (level == SOL_TCP)
1223 return mptcp_getsockopt_sol_tcp(msk, optname, optval, option);
1224 if (level == SOL_MPTCP)
1225 return mptcp_getsockopt_sol_mptcp(msk, optname, optval, option);
1226 return -EOPNOTSUPP;
1227 }
1228
1229 static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
1230 {
1231 static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK;
1232 struct sock *sk = (struct sock *)msk;
1233
1234 if (ssk->sk_prot->keepalive) {
1235 if (sock_flag(sk, SOCK_KEEPOPEN))
1236 ssk->sk_prot->keepalive(ssk, 1);
1237 else
1238 ssk->sk_prot->keepalive(ssk, 0);
1239 }
1240
1241 ssk->sk_priority = sk->sk_priority;
1242 ssk->sk_bound_dev_if = sk->sk_bound_dev_if;
1243 ssk->sk_incoming_cpu = sk->sk_incoming_cpu;
1244 __ip_sock_set_tos(ssk, inet_sk(sk)->tos);
1245
1246 if (sk->sk_userlocks & tx_rx_locks) {
1247 ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;
1248 if (sk->sk_userlocks & SOCK_SNDBUF_LOCK)
1249 WRITE_ONCE(ssk->sk_sndbuf, sk->sk_sndbuf);
1250 if (sk->sk_userlocks & SOCK_RCVBUF_LOCK)
1251 WRITE_ONCE(ssk->sk_rcvbuf, sk->sk_rcvbuf);
1252 }
1253
1254 if (sock_flag(sk, SOCK_LINGER)) {
1255 ssk->sk_lingertime = sk->sk_lingertime;
1256 sock_set_flag(ssk, SOCK_LINGER);
1257 } else {
1258 sock_reset_flag(ssk, SOCK_LINGER);
1259 }
1260
1261 if (sk->sk_mark != ssk->sk_mark) {
1262 ssk->sk_mark = sk->sk_mark;
1263 sk_dst_reset(ssk);
1264 }
1265
1266 sock_valbool_flag(ssk, SOCK_DBG, sock_flag(sk, SOCK_DBG));
1267
1268 if (inet_csk(sk)->icsk_ca_ops != inet_csk(ssk)->icsk_ca_ops)
1269 tcp_set_congestion_control(ssk, msk->ca_name, false, true);
1270 __tcp_sock_set_cork(ssk, !!msk->cork);
1271 __tcp_sock_set_nodelay(ssk, !!msk->nodelay);
1272
1273 inet_sk(ssk)->transparent = inet_sk(sk)->transparent;
1274 inet_sk(ssk)->freebind = inet_sk(sk)->freebind;
1275 }
1276
1277 static void __mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
1278 {
1279 bool slow = lock_sock_fast(ssk);
1280
1281 sync_socket_options(msk, ssk);
1282
1283 unlock_sock_fast(ssk, slow);
1284 }
1285
1286 void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
1287 {
1288 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
1289
1290 msk_owned_by_me(msk);
1291
1292 if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) {
1293 __mptcp_sockopt_sync(msk, ssk);
1294
1295 subflow->setsockopt_seq = msk->setsockopt_seq;
1296 }
1297 }
1298
1299 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk)
1300 {
1301 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
1302
1303 msk_owned_by_me(msk);
1304
1305 if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) {
1306 sync_socket_options(msk, ssk);
1307
1308 subflow->setsockopt_seq = msk->setsockopt_seq;
1309 }
1310 }