sockopt.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Multipath TCP
  3. *
  4. * Copyright (c) 2021, Red Hat.
  5. */
  6. #define pr_fmt(fmt) "MPTCP: " fmt
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <net/sock.h>
  10. #include <net/protocol.h>
  11. #include <net/tcp.h>
  12. #include <net/mptcp.h>
  13. #include "protocol.h"
  14. #define MIN_INFO_OPTLEN_SIZE 16
  15. static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk)
  16. {
  17. sock_owned_by_me((const struct sock *)msk);
  18. if (likely(!__mptcp_check_fallback(msk)))
  19. return NULL;
  20. return msk->first;
  21. }
  22. static u32 sockopt_seq_reset(const struct sock *sk)
  23. {
  24. sock_owned_by_me(sk);
  25. /* Highbits contain state. Allows to distinguish sockopt_seq
  26. * of listener and established:
  27. * s0 = new_listener()
  28. * sockopt(s0) - seq is 1
  29. * s1 = accept(s0) - s1 inherits seq 1 if listener sk (s0)
  30. * sockopt(s0) - seq increments to 2 on s0
  31. * sockopt(s1) // seq increments to 2 on s1 (different option)
  32. * new ssk completes join, inherits options from s0 // seq 2
  33. * Needs sync from mptcp join logic, but ssk->seq == msk->seq
  34. *
  35. * Set High order bits to sk_state so ssk->seq == msk->seq test
  36. * will fail.
  37. */
  38. return (u32)sk->sk_state << 24u;
  39. }
  40. static void sockopt_seq_inc(struct mptcp_sock *msk)
  41. {
  42. u32 seq = (msk->setsockopt_seq + 1) & 0x00ffffff;
  43. msk->setsockopt_seq = sockopt_seq_reset((struct sock *)msk) + seq;
  44. }
  45. static int mptcp_get_int_option(struct mptcp_sock *msk, sockptr_t optval,
  46. unsigned int optlen, int *val)
  47. {
  48. if (optlen < sizeof(int))
  49. return -EINVAL;
  50. if (copy_from_sockptr(val, optval, sizeof(*val)))
  51. return -EFAULT;
  52. return 0;
  53. }
  54. static void mptcp_sol_socket_sync_intval(struct mptcp_sock *msk, int optname, int val)
  55. {
  56. struct mptcp_subflow_context *subflow;
  57. struct sock *sk = (struct sock *)msk;
  58. lock_sock(sk);
  59. sockopt_seq_inc(msk);
  60. mptcp_for_each_subflow(msk, subflow) {
  61. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  62. bool slow = lock_sock_fast(ssk);
  63. switch (optname) {
  64. case SO_DEBUG:
  65. sock_valbool_flag(ssk, SOCK_DBG, !!val);
  66. break;
  67. case SO_KEEPALIVE:
  68. if (ssk->sk_prot->keepalive)
  69. ssk->sk_prot->keepalive(ssk, !!val);
  70. sock_valbool_flag(ssk, SOCK_KEEPOPEN, !!val);
  71. break;
  72. case SO_PRIORITY:
  73. ssk->sk_priority = val;
  74. break;
  75. case SO_SNDBUF:
  76. case SO_SNDBUFFORCE:
  77. ssk->sk_userlocks |= SOCK_SNDBUF_LOCK;
  78. WRITE_ONCE(ssk->sk_sndbuf, sk->sk_sndbuf);
  79. break;
  80. case SO_RCVBUF:
  81. case SO_RCVBUFFORCE:
  82. ssk->sk_userlocks |= SOCK_RCVBUF_LOCK;
  83. WRITE_ONCE(ssk->sk_rcvbuf, sk->sk_rcvbuf);
  84. break;
  85. case SO_MARK:
  86. if (READ_ONCE(ssk->sk_mark) != sk->sk_mark) {
  87. WRITE_ONCE(ssk->sk_mark, sk->sk_mark);
  88. sk_dst_reset(ssk);
  89. }
  90. break;
  91. case SO_INCOMING_CPU:
  92. WRITE_ONCE(ssk->sk_incoming_cpu, val);
  93. break;
  94. }
  95. subflow->setsockopt_seq = msk->setsockopt_seq;
  96. unlock_sock_fast(ssk, slow);
  97. }
  98. release_sock(sk);
  99. }
  100. static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, int val)
  101. {
  102. sockptr_t optval = KERNEL_SOCKPTR(&val);
  103. struct sock *sk = (struct sock *)msk;
  104. int ret;
  105. ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
  106. optval, sizeof(val));
  107. if (ret)
  108. return ret;
  109. mptcp_sol_socket_sync_intval(msk, optname, val);
  110. return 0;
  111. }
  112. static void mptcp_so_incoming_cpu(struct mptcp_sock *msk, int val)
  113. {
  114. struct sock *sk = (struct sock *)msk;
  115. WRITE_ONCE(sk->sk_incoming_cpu, val);
  116. mptcp_sol_socket_sync_intval(msk, SO_INCOMING_CPU, val);
  117. }
  118. static int mptcp_setsockopt_sol_socket_tstamp(struct mptcp_sock *msk, int optname, int val)
  119. {
  120. sockptr_t optval = KERNEL_SOCKPTR(&val);
  121. struct mptcp_subflow_context *subflow;
  122. struct sock *sk = (struct sock *)msk;
  123. int ret;
  124. ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
  125. optval, sizeof(val));
  126. if (ret)
  127. return ret;
  128. lock_sock(sk);
  129. mptcp_for_each_subflow(msk, subflow) {
  130. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  131. bool slow = lock_sock_fast(ssk);
  132. sock_set_timestamp(sk, optname, !!val);
  133. unlock_sock_fast(ssk, slow);
  134. }
  135. release_sock(sk);
  136. return 0;
  137. }
  138. static int mptcp_setsockopt_sol_socket_int(struct mptcp_sock *msk, int optname,
  139. sockptr_t optval,
  140. unsigned int optlen)
  141. {
  142. int val, ret;
  143. ret = mptcp_get_int_option(msk, optval, optlen, &val);
  144. if (ret)
  145. return ret;
  146. switch (optname) {
  147. case SO_KEEPALIVE:
  148. mptcp_sol_socket_sync_intval(msk, optname, val);
  149. return 0;
  150. case SO_DEBUG:
  151. case SO_MARK:
  152. case SO_PRIORITY:
  153. case SO_SNDBUF:
  154. case SO_SNDBUFFORCE:
  155. case SO_RCVBUF:
  156. case SO_RCVBUFFORCE:
  157. return mptcp_sol_socket_intval(msk, optname, val);
  158. case SO_INCOMING_CPU:
  159. mptcp_so_incoming_cpu(msk, val);
  160. return 0;
  161. case SO_TIMESTAMP_OLD:
  162. case SO_TIMESTAMP_NEW:
  163. case SO_TIMESTAMPNS_OLD:
  164. case SO_TIMESTAMPNS_NEW:
  165. return mptcp_setsockopt_sol_socket_tstamp(msk, optname, val);
  166. }
  167. return -ENOPROTOOPT;
  168. }
  169. static int mptcp_setsockopt_sol_socket_timestamping(struct mptcp_sock *msk,
  170. int optname,
  171. sockptr_t optval,
  172. unsigned int optlen)
  173. {
  174. struct mptcp_subflow_context *subflow;
  175. struct sock *sk = (struct sock *)msk;
  176. struct so_timestamping timestamping;
  177. int ret;
  178. if (optlen == sizeof(timestamping)) {
  179. if (copy_from_sockptr(&timestamping, optval,
  180. sizeof(timestamping)))
  181. return -EFAULT;
  182. } else if (optlen == sizeof(int)) {
  183. memset(&timestamping, 0, sizeof(timestamping));
  184. if (copy_from_sockptr(&timestamping.flags, optval, sizeof(int)))
  185. return -EFAULT;
  186. } else {
  187. return -EINVAL;
  188. }
  189. ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
  190. KERNEL_SOCKPTR(&timestamping),
  191. sizeof(timestamping));
  192. if (ret)
  193. return ret;
  194. lock_sock(sk);
  195. mptcp_for_each_subflow(msk, subflow) {
  196. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  197. bool slow = lock_sock_fast(ssk);
  198. sock_set_timestamping(sk, optname, timestamping);
  199. unlock_sock_fast(ssk, slow);
  200. }
  201. release_sock(sk);
  202. return 0;
  203. }
  204. static int mptcp_setsockopt_sol_socket_linger(struct mptcp_sock *msk, sockptr_t optval,
  205. unsigned int optlen)
  206. {
  207. struct mptcp_subflow_context *subflow;
  208. struct sock *sk = (struct sock *)msk;
  209. struct linger ling;
  210. sockptr_t kopt;
  211. int ret;
  212. if (optlen < sizeof(ling))
  213. return -EINVAL;
  214. if (copy_from_sockptr(&ling, optval, sizeof(ling)))
  215. return -EFAULT;
  216. kopt = KERNEL_SOCKPTR(&ling);
  217. ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, SO_LINGER, kopt, sizeof(ling));
  218. if (ret)
  219. return ret;
  220. lock_sock(sk);
  221. sockopt_seq_inc(msk);
  222. mptcp_for_each_subflow(msk, subflow) {
  223. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  224. bool slow = lock_sock_fast(ssk);
  225. if (!ling.l_onoff) {
  226. sock_reset_flag(ssk, SOCK_LINGER);
  227. } else {
  228. ssk->sk_lingertime = sk->sk_lingertime;
  229. sock_set_flag(ssk, SOCK_LINGER);
  230. }
  231. subflow->setsockopt_seq = msk->setsockopt_seq;
  232. unlock_sock_fast(ssk, slow);
  233. }
  234. release_sock(sk);
  235. return 0;
  236. }
  237. static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
  238. sockptr_t optval, unsigned int optlen)
  239. {
  240. struct sock *sk = (struct sock *)msk;
  241. struct socket *ssock;
  242. int ret;
  243. switch (optname) {
  244. case SO_REUSEPORT:
  245. case SO_REUSEADDR:
  246. case SO_BINDTODEVICE:
  247. case SO_BINDTOIFINDEX:
  248. lock_sock(sk);
  249. ssock = __mptcp_nmpc_socket(msk);
  250. if (!ssock) {
  251. release_sock(sk);
  252. return -EINVAL;
  253. }
  254. ret = sock_setsockopt(ssock, SOL_SOCKET, optname, optval, optlen);
  255. if (ret == 0) {
  256. if (optname == SO_REUSEPORT)
  257. sk->sk_reuseport = ssock->sk->sk_reuseport;
  258. else if (optname == SO_REUSEADDR)
  259. sk->sk_reuse = ssock->sk->sk_reuse;
  260. else if (optname == SO_BINDTODEVICE)
  261. sk->sk_bound_dev_if = ssock->sk->sk_bound_dev_if;
  262. else if (optname == SO_BINDTOIFINDEX)
  263. sk->sk_bound_dev_if = ssock->sk->sk_bound_dev_if;
  264. }
  265. release_sock(sk);
  266. return ret;
  267. case SO_KEEPALIVE:
  268. case SO_PRIORITY:
  269. case SO_SNDBUF:
  270. case SO_SNDBUFFORCE:
  271. case SO_RCVBUF:
  272. case SO_RCVBUFFORCE:
  273. case SO_MARK:
  274. case SO_INCOMING_CPU:
  275. case SO_DEBUG:
  276. case SO_TIMESTAMP_OLD:
  277. case SO_TIMESTAMP_NEW:
  278. case SO_TIMESTAMPNS_OLD:
  279. case SO_TIMESTAMPNS_NEW:
  280. return mptcp_setsockopt_sol_socket_int(msk, optname, optval,
  281. optlen);
  282. case SO_TIMESTAMPING_OLD:
  283. case SO_TIMESTAMPING_NEW:
  284. return mptcp_setsockopt_sol_socket_timestamping(msk, optname,
  285. optval, optlen);
  286. case SO_LINGER:
  287. return mptcp_setsockopt_sol_socket_linger(msk, optval, optlen);
  288. case SO_RCVLOWAT:
  289. case SO_RCVTIMEO_OLD:
  290. case SO_RCVTIMEO_NEW:
  291. case SO_SNDTIMEO_OLD:
  292. case SO_SNDTIMEO_NEW:
  293. case SO_BUSY_POLL:
  294. case SO_PREFER_BUSY_POLL:
  295. case SO_BUSY_POLL_BUDGET:
  296. /* No need to copy: only relevant for msk */
  297. return sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname, optval, optlen);
  298. case SO_NO_CHECK:
  299. case SO_DONTROUTE:
  300. case SO_BROADCAST:
  301. case SO_BSDCOMPAT:
  302. case SO_PASSCRED:
  303. case SO_PASSSEC:
  304. case SO_RXQ_OVFL:
  305. case SO_WIFI_STATUS:
  306. case SO_NOFCS:
  307. case SO_SELECT_ERR_QUEUE:
  308. return 0;
  309. }
  310. /* SO_OOBINLINE is not supported, let's avoid the related mess
  311. * SO_ATTACH_FILTER, SO_ATTACH_BPF, SO_ATTACH_REUSEPORT_CBPF,
  312. * SO_DETACH_REUSEPORT_BPF, SO_DETACH_FILTER, SO_LOCK_FILTER,
  313. * we must be careful with subflows
  314. *
  315. * SO_ATTACH_REUSEPORT_EBPF is not supported, at it checks
  316. * explicitly the sk_protocol field
  317. *
  318. * SO_PEEK_OFF is unsupported, as it is for plain TCP
  319. * SO_MAX_PACING_RATE is unsupported, we must be careful with subflows
  320. * SO_CNX_ADVICE is currently unsupported, could possibly be relevant,
  321. * but likely needs careful design
  322. *
  323. * SO_ZEROCOPY is currently unsupported, TODO in sndmsg
  324. * SO_TXTIME is currently unsupported
  325. */
  326. return -EOPNOTSUPP;
  327. }
  328. static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
  329. sockptr_t optval, unsigned int optlen)
  330. {
  331. struct sock *sk = (struct sock *)msk;
  332. int ret = -EOPNOTSUPP;
  333. struct socket *ssock;
  334. switch (optname) {
  335. case IPV6_V6ONLY:
  336. case IPV6_TRANSPARENT:
  337. case IPV6_FREEBIND:
  338. lock_sock(sk);
  339. ssock = __mptcp_nmpc_socket(msk);
  340. if (!ssock) {
  341. release_sock(sk);
  342. return -EINVAL;
  343. }
  344. ret = tcp_setsockopt(ssock->sk, SOL_IPV6, optname, optval, optlen);
  345. if (ret != 0) {
  346. release_sock(sk);
  347. return ret;
  348. }
  349. sockopt_seq_inc(msk);
  350. switch (optname) {
  351. case IPV6_V6ONLY:
  352. sk->sk_ipv6only = ssock->sk->sk_ipv6only;
  353. break;
  354. case IPV6_TRANSPARENT:
  355. inet_sk(sk)->transparent = inet_sk(ssock->sk)->transparent;
  356. break;
  357. case IPV6_FREEBIND:
  358. inet_sk(sk)->freebind = inet_sk(ssock->sk)->freebind;
  359. break;
  360. }
  361. release_sock(sk);
  362. break;
  363. }
  364. return ret;
  365. }
  366. static bool mptcp_supported_sockopt(int level, int optname)
  367. {
  368. if (level == SOL_IP) {
  369. switch (optname) {
  370. /* should work fine */
  371. case IP_FREEBIND:
  372. case IP_TRANSPARENT:
  373. /* the following are control cmsg related */
  374. case IP_PKTINFO:
  375. case IP_RECVTTL:
  376. case IP_RECVTOS:
  377. case IP_RECVOPTS:
  378. case IP_RETOPTS:
  379. case IP_PASSSEC:
  380. case IP_RECVORIGDSTADDR:
  381. case IP_CHECKSUM:
  382. case IP_RECVFRAGSIZE:
  383. /* common stuff that need some love */
  384. case IP_TOS:
  385. case IP_TTL:
  386. case IP_BIND_ADDRESS_NO_PORT:
  387. case IP_MTU_DISCOVER:
  388. case IP_RECVERR:
  389. /* possibly less common may deserve some love */
  390. case IP_MINTTL:
  391. /* the following is apparently a no-op for plain TCP */
  392. case IP_RECVERR_RFC4884:
  393. return true;
  394. }
  395. /* IP_OPTIONS is not supported, needs subflow care */
  396. /* IP_HDRINCL, IP_NODEFRAG are not supported, RAW specific */
  397. /* IP_MULTICAST_TTL, IP_MULTICAST_LOOP, IP_UNICAST_IF,
  398. * IP_ADD_MEMBERSHIP, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_MEMBERSHIP,
  399. * IP_DROP_SOURCE_MEMBERSHIP, IP_BLOCK_SOURCE, IP_UNBLOCK_SOURCE,
  400. * MCAST_JOIN_GROUP, MCAST_LEAVE_GROUP MCAST_JOIN_SOURCE_GROUP,
  401. * MCAST_LEAVE_SOURCE_GROUP, MCAST_BLOCK_SOURCE, MCAST_UNBLOCK_SOURCE,
  402. * MCAST_MSFILTER, IP_MULTICAST_ALL are not supported, better not deal
  403. * with mcast stuff
  404. */
  405. /* IP_IPSEC_POLICY, IP_XFRM_POLICY are nut supported, unrelated here */
  406. return false;
  407. }
  408. if (level == SOL_IPV6) {
  409. switch (optname) {
  410. case IPV6_V6ONLY:
  411. /* the following are control cmsg related */
  412. case IPV6_RECVPKTINFO:
  413. case IPV6_2292PKTINFO:
  414. case IPV6_RECVHOPLIMIT:
  415. case IPV6_2292HOPLIMIT:
  416. case IPV6_RECVRTHDR:
  417. case IPV6_2292RTHDR:
  418. case IPV6_RECVHOPOPTS:
  419. case IPV6_2292HOPOPTS:
  420. case IPV6_RECVDSTOPTS:
  421. case IPV6_2292DSTOPTS:
  422. case IPV6_RECVTCLASS:
  423. case IPV6_FLOWINFO:
  424. case IPV6_RECVPATHMTU:
  425. case IPV6_RECVORIGDSTADDR:
  426. case IPV6_RECVFRAGSIZE:
  427. /* the following ones need some love but are quite common */
  428. case IPV6_TCLASS:
  429. case IPV6_TRANSPARENT:
  430. case IPV6_FREEBIND:
  431. case IPV6_PKTINFO:
  432. case IPV6_2292PKTOPTIONS:
  433. case IPV6_UNICAST_HOPS:
  434. case IPV6_MTU_DISCOVER:
  435. case IPV6_MTU:
  436. case IPV6_RECVERR:
  437. case IPV6_FLOWINFO_SEND:
  438. case IPV6_FLOWLABEL_MGR:
  439. case IPV6_MINHOPCOUNT:
  440. case IPV6_DONTFRAG:
  441. case IPV6_AUTOFLOWLABEL:
  442. /* the following one is a no-op for plain TCP */
  443. case IPV6_RECVERR_RFC4884:
  444. return true;
  445. }
  446. /* IPV6_HOPOPTS, IPV6_RTHDRDSTOPTS, IPV6_RTHDR, IPV6_DSTOPTS are
  447. * not supported
  448. */
  449. /* IPV6_MULTICAST_HOPS, IPV6_MULTICAST_LOOP, IPV6_UNICAST_IF,
  450. * IPV6_MULTICAST_IF, IPV6_ADDRFORM,
  451. * IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_JOIN_ANYCAST,
  452. * IPV6_LEAVE_ANYCAST, IPV6_MULTICAST_ALL, MCAST_JOIN_GROUP, MCAST_LEAVE_GROUP,
  453. * MCAST_JOIN_SOURCE_GROUP, MCAST_LEAVE_SOURCE_GROUP,
  454. * MCAST_BLOCK_SOURCE, MCAST_UNBLOCK_SOURCE, MCAST_MSFILTER
  455. * are not supported better not deal with mcast
  456. */
  457. /* IPV6_ROUTER_ALERT, IPV6_ROUTER_ALERT_ISOLATE are not supported, since are evil */
  458. /* IPV6_IPSEC_POLICY, IPV6_XFRM_POLICY are not supported */
  459. /* IPV6_ADDR_PREFERENCES is not supported, we must be careful with subflows */
  460. return false;
  461. }
  462. if (level == SOL_TCP) {
  463. switch (optname) {
  464. /* the following are no-op or should work just fine */
  465. case TCP_THIN_DUPACK:
  466. case TCP_DEFER_ACCEPT:
  467. /* the following need some love */
  468. case TCP_MAXSEG:
  469. case TCP_NODELAY:
  470. case TCP_THIN_LINEAR_TIMEOUTS:
  471. case TCP_CONGESTION:
  472. case TCP_CORK:
  473. case TCP_KEEPIDLE:
  474. case TCP_KEEPINTVL:
  475. case TCP_KEEPCNT:
  476. case TCP_SYNCNT:
  477. case TCP_SAVE_SYN:
  478. case TCP_LINGER2:
  479. case TCP_WINDOW_CLAMP:
  480. case TCP_QUICKACK:
  481. case TCP_USER_TIMEOUT:
  482. case TCP_TIMESTAMP:
  483. case TCP_NOTSENT_LOWAT:
  484. case TCP_TX_DELAY:
  485. case TCP_INQ:
  486. case TCP_FASTOPEN_CONNECT:
  487. return true;
  488. }
  489. /* TCP_MD5SIG, TCP_MD5SIG_EXT are not supported, MD5 is not compatible with MPTCP */
  490. /* TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS,
  491. * TCP_REPAIR_WINDOW are not supported, better avoid this mess
  492. */
  493. /* TCP_FASTOPEN_KEY, TCP_FASTOPEN, TCP_FASTOPEN_NO_COOKIE,
  494. * are not supported fastopen is currently unsupported
  495. */
  496. }
  497. return false;
  498. }
  499. static int mptcp_setsockopt_sol_tcp_congestion(struct mptcp_sock *msk, sockptr_t optval,
  500. unsigned int optlen)
  501. {
  502. struct mptcp_subflow_context *subflow;
  503. struct sock *sk = (struct sock *)msk;
  504. char name[TCP_CA_NAME_MAX];
  505. bool cap_net_admin;
  506. int ret;
  507. if (optlen < 1)
  508. return -EINVAL;
  509. ret = strncpy_from_sockptr(name, optval,
  510. min_t(long, TCP_CA_NAME_MAX - 1, optlen));
  511. if (ret < 0)
  512. return -EFAULT;
  513. name[ret] = 0;
  514. cap_net_admin = ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN);
  515. ret = 0;
  516. lock_sock(sk);
  517. sockopt_seq_inc(msk);
  518. mptcp_for_each_subflow(msk, subflow) {
  519. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  520. int err;
  521. lock_sock(ssk);
  522. err = tcp_set_congestion_control(ssk, name, true, cap_net_admin);
  523. if (err < 0 && ret == 0)
  524. ret = err;
  525. subflow->setsockopt_seq = msk->setsockopt_seq;
  526. release_sock(ssk);
  527. }
  528. if (ret == 0)
  529. strcpy(msk->ca_name, name);
  530. release_sock(sk);
  531. return ret;
  532. }
  533. static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optval,
  534. unsigned int optlen)
  535. {
  536. struct mptcp_subflow_context *subflow;
  537. struct sock *sk = (struct sock *)msk;
  538. int val;
  539. if (optlen < sizeof(int))
  540. return -EINVAL;
  541. if (copy_from_sockptr(&val, optval, sizeof(val)))
  542. return -EFAULT;
  543. lock_sock(sk);
  544. sockopt_seq_inc(msk);
  545. msk->cork = !!val;
  546. mptcp_for_each_subflow(msk, subflow) {
  547. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  548. lock_sock(ssk);
  549. __tcp_sock_set_cork(ssk, !!val);
  550. release_sock(ssk);
  551. }
  552. if (!val)
  553. mptcp_check_and_set_pending(sk);
  554. release_sock(sk);
  555. return 0;
  556. }
  557. static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t optval,
  558. unsigned int optlen)
  559. {
  560. struct mptcp_subflow_context *subflow;
  561. struct sock *sk = (struct sock *)msk;
  562. int val;
  563. if (optlen < sizeof(int))
  564. return -EINVAL;
  565. if (copy_from_sockptr(&val, optval, sizeof(val)))
  566. return -EFAULT;
  567. lock_sock(sk);
  568. sockopt_seq_inc(msk);
  569. msk->nodelay = !!val;
  570. mptcp_for_each_subflow(msk, subflow) {
  571. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  572. lock_sock(ssk);
  573. __tcp_sock_set_nodelay(ssk, !!val);
  574. release_sock(ssk);
  575. }
  576. if (val)
  577. mptcp_check_and_set_pending(sk);
  578. release_sock(sk);
  579. return 0;
  580. }
  581. static int mptcp_setsockopt_sol_ip_set_transparent(struct mptcp_sock *msk, int optname,
  582. sockptr_t optval, unsigned int optlen)
  583. {
  584. struct sock *sk = (struct sock *)msk;
  585. struct inet_sock *issk;
  586. struct socket *ssock;
  587. int err;
  588. err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
  589. if (err != 0)
  590. return err;
  591. lock_sock(sk);
  592. ssock = __mptcp_nmpc_socket(msk);
  593. if (!ssock) {
  594. release_sock(sk);
  595. return -EINVAL;
  596. }
  597. issk = inet_sk(ssock->sk);
  598. switch (optname) {
  599. case IP_FREEBIND:
  600. issk->freebind = inet_sk(sk)->freebind;
  601. break;
  602. case IP_TRANSPARENT:
  603. issk->transparent = inet_sk(sk)->transparent;
  604. break;
  605. default:
  606. release_sock(sk);
  607. WARN_ON_ONCE(1);
  608. return -EOPNOTSUPP;
  609. }
  610. sockopt_seq_inc(msk);
  611. release_sock(sk);
  612. return 0;
  613. }
  614. static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname,
  615. sockptr_t optval, unsigned int optlen)
  616. {
  617. struct mptcp_subflow_context *subflow;
  618. struct sock *sk = (struct sock *)msk;
  619. int err, val;
  620. err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
  621. if (err != 0)
  622. return err;
  623. lock_sock(sk);
  624. sockopt_seq_inc(msk);
  625. val = inet_sk(sk)->tos;
  626. mptcp_for_each_subflow(msk, subflow) {
  627. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  628. bool slow;
  629. slow = lock_sock_fast(ssk);
  630. __ip_sock_set_tos(ssk, val);
  631. unlock_sock_fast(ssk, slow);
  632. }
  633. release_sock(sk);
  634. return err;
  635. }
  636. static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
  637. sockptr_t optval, unsigned int optlen)
  638. {
  639. switch (optname) {
  640. case IP_FREEBIND:
  641. case IP_TRANSPARENT:
  642. return mptcp_setsockopt_sol_ip_set_transparent(msk, optname, optval, optlen);
  643. case IP_TOS:
  644. return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen);
  645. }
  646. return -EOPNOTSUPP;
  647. }
  648. static int mptcp_setsockopt_sol_tcp_defer(struct mptcp_sock *msk, sockptr_t optval,
  649. unsigned int optlen)
  650. {
  651. struct socket *listener;
  652. listener = __mptcp_nmpc_socket(msk);
  653. if (!listener)
  654. return 0; /* TCP_DEFER_ACCEPT does not fail */
  655. return tcp_setsockopt(listener->sk, SOL_TCP, TCP_DEFER_ACCEPT, optval, optlen);
  656. }
  657. static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, int optname,
  658. sockptr_t optval, unsigned int optlen)
  659. {
  660. struct sock *sk = (struct sock *)msk;
  661. struct socket *sock;
  662. int ret = -EINVAL;
  663. /* Limit to first subflow, before the connection establishment */
  664. lock_sock(sk);
  665. sock = __mptcp_nmpc_socket(msk);
  666. if (!sock)
  667. goto unlock;
  668. ret = tcp_setsockopt(sock->sk, level, optname, optval, optlen);
  669. unlock:
  670. release_sock(sk);
  671. return ret;
  672. }
  673. static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
  674. sockptr_t optval, unsigned int optlen)
  675. {
  676. struct sock *sk = (void *)msk;
  677. int ret, val;
  678. switch (optname) {
  679. case TCP_INQ:
  680. ret = mptcp_get_int_option(msk, optval, optlen, &val);
  681. if (ret)
  682. return ret;
  683. if (val < 0 || val > 1)
  684. return -EINVAL;
  685. lock_sock(sk);
  686. msk->recvmsg_inq = !!val;
  687. release_sock(sk);
  688. return 0;
  689. case TCP_ULP:
  690. return -EOPNOTSUPP;
  691. case TCP_CONGESTION:
  692. return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen);
  693. case TCP_CORK:
  694. return mptcp_setsockopt_sol_tcp_cork(msk, optval, optlen);
  695. case TCP_NODELAY:
  696. return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen);
  697. case TCP_DEFER_ACCEPT:
  698. return mptcp_setsockopt_sol_tcp_defer(msk, optval, optlen);
  699. case TCP_FASTOPEN_CONNECT:
  700. return mptcp_setsockopt_first_sf_only(msk, SOL_TCP, optname,
  701. optval, optlen);
  702. }
  703. return -EOPNOTSUPP;
  704. }
  705. int mptcp_setsockopt(struct sock *sk, int level, int optname,
  706. sockptr_t optval, unsigned int optlen)
  707. {
  708. struct mptcp_sock *msk = mptcp_sk(sk);
  709. struct sock *ssk;
  710. pr_debug("msk=%p", msk);
  711. if (level == SOL_SOCKET)
  712. return mptcp_setsockopt_sol_socket(msk, optname, optval, optlen);
  713. if (!mptcp_supported_sockopt(level, optname))
  714. return -ENOPROTOOPT;
  715. /* @@ the meaning of setsockopt() when the socket is connected and
  716. * there are multiple subflows is not yet defined. It is up to the
  717. * MPTCP-level socket to configure the subflows until the subflow
  718. * is in TCP fallback, when TCP socket options are passed through
  719. * to the one remaining subflow.
  720. */
  721. lock_sock(sk);
  722. ssk = __mptcp_tcp_fallback(msk);
  723. release_sock(sk);
  724. if (ssk)
  725. return tcp_setsockopt(ssk, level, optname, optval, optlen);
  726. if (level == SOL_IP)
  727. return mptcp_setsockopt_v4(msk, optname, optval, optlen);
  728. if (level == SOL_IPV6)
  729. return mptcp_setsockopt_v6(msk, optname, optval, optlen);
  730. if (level == SOL_TCP)
  731. return mptcp_setsockopt_sol_tcp(msk, optname, optval, optlen);
  732. return -EOPNOTSUPP;
  733. }
  734. static int mptcp_getsockopt_first_sf_only(struct mptcp_sock *msk, int level, int optname,
  735. char __user *optval, int __user *optlen)
  736. {
  737. struct sock *sk = (struct sock *)msk;
  738. struct socket *ssock;
  739. int ret = -EINVAL;
  740. struct sock *ssk;
  741. lock_sock(sk);
  742. ssk = msk->first;
  743. if (ssk) {
  744. ret = tcp_getsockopt(ssk, level, optname, optval, optlen);
  745. goto out;
  746. }
  747. ssock = __mptcp_nmpc_socket(msk);
  748. if (!ssock)
  749. goto out;
  750. ret = tcp_getsockopt(ssock->sk, level, optname, optval, optlen);
  751. out:
  752. release_sock(sk);
  753. return ret;
  754. }
  755. void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
  756. {
  757. u32 flags = 0;
  758. u8 val;
  759. memset(info, 0, sizeof(*info));
  760. info->mptcpi_subflows = READ_ONCE(msk->pm.subflows);
  761. info->mptcpi_add_addr_signal = READ_ONCE(msk->pm.add_addr_signaled);
  762. info->mptcpi_add_addr_accepted = READ_ONCE(msk->pm.add_addr_accepted);
  763. info->mptcpi_local_addr_used = READ_ONCE(msk->pm.local_addr_used);
  764. info->mptcpi_subflows_max = mptcp_pm_get_subflows_max(msk);
  765. val = mptcp_pm_get_add_addr_signal_max(msk);
  766. info->mptcpi_add_addr_signal_max = val;
  767. val = mptcp_pm_get_add_addr_accept_max(msk);
  768. info->mptcpi_add_addr_accepted_max = val;
  769. info->mptcpi_local_addr_max = mptcp_pm_get_local_addr_max(msk);
  770. if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags))
  771. flags |= MPTCP_INFO_FLAG_FALLBACK;
  772. if (READ_ONCE(msk->can_ack))
  773. flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED;
  774. info->mptcpi_flags = flags;
  775. info->mptcpi_token = READ_ONCE(msk->token);
  776. info->mptcpi_write_seq = READ_ONCE(msk->write_seq);
  777. info->mptcpi_snd_una = READ_ONCE(msk->snd_una);
  778. info->mptcpi_rcv_nxt = READ_ONCE(msk->ack_seq);
  779. info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled);
  780. }
  781. EXPORT_SYMBOL_GPL(mptcp_diag_fill_info);
  782. static int mptcp_getsockopt_info(struct mptcp_sock *msk, char __user *optval, int __user *optlen)
  783. {
  784. struct mptcp_info m_info;
  785. int len;
  786. if (get_user(len, optlen))
  787. return -EFAULT;
  788. len = min_t(unsigned int, len, sizeof(struct mptcp_info));
  789. mptcp_diag_fill_info(msk, &m_info);
  790. if (put_user(len, optlen))
  791. return -EFAULT;
  792. if (copy_to_user(optval, &m_info, len))
  793. return -EFAULT;
  794. return 0;
  795. }
  796. static int mptcp_put_subflow_data(struct mptcp_subflow_data *sfd,
  797. char __user *optval,
  798. u32 copied,
  799. int __user *optlen)
  800. {
  801. u32 copylen = min_t(u32, sfd->size_subflow_data, sizeof(*sfd));
  802. if (copied)
  803. copied += sfd->size_subflow_data;
  804. else
  805. copied = copylen;
  806. if (put_user(copied, optlen))
  807. return -EFAULT;
  808. if (copy_to_user(optval, sfd, copylen))
  809. return -EFAULT;
  810. return 0;
  811. }
  812. static int mptcp_get_subflow_data(struct mptcp_subflow_data *sfd,
  813. char __user *optval, int __user *optlen)
  814. {
  815. int len, copylen;
  816. if (get_user(len, optlen))
  817. return -EFAULT;
  818. /* if mptcp_subflow_data size is changed, need to adjust
  819. * this function to deal with programs using old version.
  820. */
  821. BUILD_BUG_ON(sizeof(*sfd) != MIN_INFO_OPTLEN_SIZE);
  822. if (len < MIN_INFO_OPTLEN_SIZE)
  823. return -EINVAL;
  824. memset(sfd, 0, sizeof(*sfd));
  825. copylen = min_t(unsigned int, len, sizeof(*sfd));
  826. if (copy_from_user(sfd, optval, copylen))
  827. return -EFAULT;
  828. /* size_subflow_data is u32, but len is signed */
  829. if (sfd->size_subflow_data > INT_MAX ||
  830. sfd->size_user > INT_MAX)
  831. return -EINVAL;
  832. if (sfd->size_subflow_data < MIN_INFO_OPTLEN_SIZE ||
  833. sfd->size_subflow_data > len)
  834. return -EINVAL;
  835. if (sfd->num_subflows || sfd->size_kernel)
  836. return -EINVAL;
  837. return len - sfd->size_subflow_data;
  838. }
  839. static int mptcp_getsockopt_tcpinfo(struct mptcp_sock *msk, char __user *optval,
  840. int __user *optlen)
  841. {
  842. struct mptcp_subflow_context *subflow;
  843. struct sock *sk = &msk->sk.icsk_inet.sk;
  844. unsigned int sfcount = 0, copied = 0;
  845. struct mptcp_subflow_data sfd;
  846. char __user *infoptr;
  847. int len;
  848. len = mptcp_get_subflow_data(&sfd, optval, optlen);
  849. if (len < 0)
  850. return len;
  851. sfd.size_kernel = sizeof(struct tcp_info);
  852. sfd.size_user = min_t(unsigned int, sfd.size_user,
  853. sizeof(struct tcp_info));
  854. infoptr = optval + sfd.size_subflow_data;
  855. lock_sock(sk);
  856. mptcp_for_each_subflow(msk, subflow) {
  857. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  858. ++sfcount;
  859. if (len && len >= sfd.size_user) {
  860. struct tcp_info info;
  861. tcp_get_info(ssk, &info);
  862. if (copy_to_user(infoptr, &info, sfd.size_user)) {
  863. release_sock(sk);
  864. return -EFAULT;
  865. }
  866. infoptr += sfd.size_user;
  867. copied += sfd.size_user;
  868. len -= sfd.size_user;
  869. }
  870. }
  871. release_sock(sk);
  872. sfd.num_subflows = sfcount;
  873. if (mptcp_put_subflow_data(&sfd, optval, copied, optlen))
  874. return -EFAULT;
  875. return 0;
  876. }
  877. static void mptcp_get_sub_addrs(const struct sock *sk, struct mptcp_subflow_addrs *a)
  878. {
  879. struct inet_sock *inet = inet_sk(sk);
  880. memset(a, 0, sizeof(*a));
  881. if (sk->sk_family == AF_INET) {
  882. a->sin_local.sin_family = AF_INET;
  883. a->sin_local.sin_port = inet->inet_sport;
  884. a->sin_local.sin_addr.s_addr = inet->inet_rcv_saddr;
  885. if (!a->sin_local.sin_addr.s_addr)
  886. a->sin_local.sin_addr.s_addr = inet->inet_saddr;
  887. a->sin_remote.sin_family = AF_INET;
  888. a->sin_remote.sin_port = inet->inet_dport;
  889. a->sin_remote.sin_addr.s_addr = inet->inet_daddr;
  890. #if IS_ENABLED(CONFIG_IPV6)
  891. } else if (sk->sk_family == AF_INET6) {
  892. const struct ipv6_pinfo *np = inet6_sk(sk);
  893. if (WARN_ON_ONCE(!np))
  894. return;
  895. a->sin6_local.sin6_family = AF_INET6;
  896. a->sin6_local.sin6_port = inet->inet_sport;
  897. if (ipv6_addr_any(&sk->sk_v6_rcv_saddr))
  898. a->sin6_local.sin6_addr = np->saddr;
  899. else
  900. a->sin6_local.sin6_addr = sk->sk_v6_rcv_saddr;
  901. a->sin6_remote.sin6_family = AF_INET6;
  902. a->sin6_remote.sin6_port = inet->inet_dport;
  903. a->sin6_remote.sin6_addr = sk->sk_v6_daddr;
  904. #endif
  905. }
  906. }
  907. static int mptcp_getsockopt_subflow_addrs(struct mptcp_sock *msk, char __user *optval,
  908. int __user *optlen)
  909. {
  910. struct sock *sk = &msk->sk.icsk_inet.sk;
  911. struct mptcp_subflow_context *subflow;
  912. unsigned int sfcount = 0, copied = 0;
  913. struct mptcp_subflow_data sfd;
  914. char __user *addrptr;
  915. int len;
  916. len = mptcp_get_subflow_data(&sfd, optval, optlen);
  917. if (len < 0)
  918. return len;
  919. sfd.size_kernel = sizeof(struct mptcp_subflow_addrs);
  920. sfd.size_user = min_t(unsigned int, sfd.size_user,
  921. sizeof(struct mptcp_subflow_addrs));
  922. addrptr = optval + sfd.size_subflow_data;
  923. lock_sock(sk);
  924. mptcp_for_each_subflow(msk, subflow) {
  925. struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
  926. ++sfcount;
  927. if (len && len >= sfd.size_user) {
  928. struct mptcp_subflow_addrs a;
  929. mptcp_get_sub_addrs(ssk, &a);
  930. if (copy_to_user(addrptr, &a, sfd.size_user)) {
  931. release_sock(sk);
  932. return -EFAULT;
  933. }
  934. addrptr += sfd.size_user;
  935. copied += sfd.size_user;
  936. len -= sfd.size_user;
  937. }
  938. }
  939. release_sock(sk);
  940. sfd.num_subflows = sfcount;
  941. if (mptcp_put_subflow_data(&sfd, optval, copied, optlen))
  942. return -EFAULT;
  943. return 0;
  944. }
  945. static int mptcp_put_int_option(struct mptcp_sock *msk, char __user *optval,
  946. int __user *optlen, int val)
  947. {
  948. int len;
  949. if (get_user(len, optlen))
  950. return -EFAULT;
  951. if (len < 0)
  952. return -EINVAL;
  953. if (len < sizeof(int) && len > 0 && val >= 0 && val <= 255) {
  954. unsigned char ucval = (unsigned char)val;
  955. len = 1;
  956. if (put_user(len, optlen))
  957. return -EFAULT;
  958. if (copy_to_user(optval, &ucval, 1))
  959. return -EFAULT;
  960. } else {
  961. len = min_t(unsigned int, len, sizeof(int));
  962. if (put_user(len, optlen))
  963. return -EFAULT;
  964. if (copy_to_user(optval, &val, len))
  965. return -EFAULT;
  966. }
  967. return 0;
  968. }
  969. static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
  970. char __user *optval, int __user *optlen)
  971. {
  972. switch (optname) {
  973. case TCP_ULP:
  974. case TCP_CONGESTION:
  975. case TCP_INFO:
  976. case TCP_CC_INFO:
  977. case TCP_DEFER_ACCEPT:
  978. case TCP_FASTOPEN_CONNECT:
  979. return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname,
  980. optval, optlen);
  981. case TCP_INQ:
  982. return mptcp_put_int_option(msk, optval, optlen, msk->recvmsg_inq);
  983. case TCP_CORK:
  984. return mptcp_put_int_option(msk, optval, optlen, msk->cork);
  985. case TCP_NODELAY:
  986. return mptcp_put_int_option(msk, optval, optlen, msk->nodelay);
  987. }
  988. return -EOPNOTSUPP;
  989. }
  990. static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
  991. char __user *optval, int __user *optlen)
  992. {
  993. struct sock *sk = (void *)msk;
  994. switch (optname) {
  995. case IP_TOS:
  996. return mptcp_put_int_option(msk, optval, optlen, inet_sk(sk)->tos);
  997. }
  998. return -EOPNOTSUPP;
  999. }
  1000. static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname,
  1001. char __user *optval, int __user *optlen)
  1002. {
  1003. switch (optname) {
  1004. case MPTCP_INFO:
  1005. return mptcp_getsockopt_info(msk, optval, optlen);
  1006. case MPTCP_TCPINFO:
  1007. return mptcp_getsockopt_tcpinfo(msk, optval, optlen);
  1008. case MPTCP_SUBFLOW_ADDRS:
  1009. return mptcp_getsockopt_subflow_addrs(msk, optval, optlen);
  1010. }
  1011. return -EOPNOTSUPP;
  1012. }
  1013. int mptcp_getsockopt(struct sock *sk, int level, int optname,
  1014. char __user *optval, int __user *option)
  1015. {
  1016. struct mptcp_sock *msk = mptcp_sk(sk);
  1017. struct sock *ssk;
  1018. pr_debug("msk=%p", msk);
  1019. /* @@ the meaning of setsockopt() when the socket is connected and
  1020. * there are multiple subflows is not yet defined. It is up to the
  1021. * MPTCP-level socket to configure the subflows until the subflow
  1022. * is in TCP fallback, when socket options are passed through
  1023. * to the one remaining subflow.
  1024. */
  1025. lock_sock(sk);
  1026. ssk = __mptcp_tcp_fallback(msk);
  1027. release_sock(sk);
  1028. if (ssk)
  1029. return tcp_getsockopt(ssk, level, optname, optval, option);
  1030. if (level == SOL_IP)
  1031. return mptcp_getsockopt_v4(msk, optname, optval, option);
  1032. if (level == SOL_TCP)
  1033. return mptcp_getsockopt_sol_tcp(msk, optname, optval, option);
  1034. if (level == SOL_MPTCP)
  1035. return mptcp_getsockopt_sol_mptcp(msk, optname, optval, option);
  1036. return -EOPNOTSUPP;
  1037. }
  1038. static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
  1039. {
  1040. static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK;
  1041. struct sock *sk = (struct sock *)msk;
  1042. if (ssk->sk_prot->keepalive) {
  1043. if (sock_flag(sk, SOCK_KEEPOPEN))
  1044. ssk->sk_prot->keepalive(ssk, 1);
  1045. else
  1046. ssk->sk_prot->keepalive(ssk, 0);
  1047. }
  1048. ssk->sk_priority = sk->sk_priority;
  1049. ssk->sk_bound_dev_if = sk->sk_bound_dev_if;
  1050. ssk->sk_incoming_cpu = sk->sk_incoming_cpu;
  1051. __ip_sock_set_tos(ssk, inet_sk(sk)->tos);
  1052. if (sk->sk_userlocks & tx_rx_locks) {
  1053. ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;
  1054. if (sk->sk_userlocks & SOCK_SNDBUF_LOCK)
  1055. WRITE_ONCE(ssk->sk_sndbuf, sk->sk_sndbuf);
  1056. if (sk->sk_userlocks & SOCK_RCVBUF_LOCK)
  1057. WRITE_ONCE(ssk->sk_rcvbuf, sk->sk_rcvbuf);
  1058. }
  1059. if (sock_flag(sk, SOCK_LINGER)) {
  1060. ssk->sk_lingertime = sk->sk_lingertime;
  1061. sock_set_flag(ssk, SOCK_LINGER);
  1062. } else {
  1063. sock_reset_flag(ssk, SOCK_LINGER);
  1064. }
  1065. if (sk->sk_mark != ssk->sk_mark) {
  1066. ssk->sk_mark = sk->sk_mark;
  1067. sk_dst_reset(ssk);
  1068. }
  1069. sock_valbool_flag(ssk, SOCK_DBG, sock_flag(sk, SOCK_DBG));
  1070. if (inet_csk(sk)->icsk_ca_ops != inet_csk(ssk)->icsk_ca_ops)
  1071. tcp_set_congestion_control(ssk, msk->ca_name, false, true);
  1072. __tcp_sock_set_cork(ssk, !!msk->cork);
  1073. __tcp_sock_set_nodelay(ssk, !!msk->nodelay);
  1074. inet_sk(ssk)->transparent = inet_sk(sk)->transparent;
  1075. inet_sk(ssk)->freebind = inet_sk(sk)->freebind;
  1076. }
  1077. static void __mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
  1078. {
  1079. bool slow = lock_sock_fast(ssk);
  1080. sync_socket_options(msk, ssk);
  1081. unlock_sock_fast(ssk, slow);
  1082. }
  1083. void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
  1084. {
  1085. struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
  1086. msk_owned_by_me(msk);
  1087. if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) {
  1088. __mptcp_sockopt_sync(msk, ssk);
  1089. subflow->setsockopt_seq = msk->setsockopt_seq;
  1090. }
  1091. }
  1092. void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk)
  1093. {
  1094. struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
  1095. msk_owned_by_me(msk);
  1096. if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) {
  1097. sync_socket_options(msk, ssk);
  1098. subflow->setsockopt_seq = msk->setsockopt_seq;
  1099. }
  1100. }