Skip to content

Commit c85636a

Browse files
darkwratdavem330
authored andcommitted
mptcp: sockopt: support IP_LOCAL_PORT_RANGE and IP_BIND_ADDRESS_NO_PORT
Support for IP_BIND_ADDRESS_NO_PORT sockopt was introduced in [1]. Recently [2] allowed its value to be accessed without locking the socket. Support for (newer) IP_LOCAL_PORT_RANGE sockopt was introduced in [3]. In the same series a selftest was added in [4]. This selftest also covers the IP_BIND_ADDRESS_NO_PORT sockopt. This patch enables getsockopt()/setsockopt() on MPTCP sockets for these socket options, syncing set values to subflows in sync_socket_options(). Ephemeral port range is synced to subflows, enabling NAT usecase described in [3]. [1] commit 90c337d ("inet: add IP_BIND_ADDRESS_NO_PORT to overcome bind(0) limitations") [2] commit ca571e2 ("inet: move inet->bind_address_no_port to inet->inet_flags") [3] commit 91d0b78 ("inet: Add IP_LOCAL_PORT_RANGE socket option") [4] commit ae54396 ("selftests/net: Cover the IP_LOCAL_PORT_RANGE socket option") Signed-off-by: Maxim Galaganov <[email protected]> Reviewed-by: Mat Martineau <[email protected]> Signed-off-by: Matthieu Baerts <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 57d3117 commit c85636a

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

net/mptcp/sockopt.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,8 @@ static bool mptcp_supported_sockopt(int level, int optname)
440440
/* should work fine */
441441
case IP_FREEBIND:
442442
case IP_TRANSPARENT:
443+
case IP_BIND_ADDRESS_NO_PORT:
444+
case IP_LOCAL_PORT_RANGE:
443445

444446
/* the following are control cmsg related */
445447
case IP_PKTINFO:
@@ -455,7 +457,6 @@ static bool mptcp_supported_sockopt(int level, int optname)
455457
/* common stuff that need some love */
456458
case IP_TOS:
457459
case IP_TTL:
458-
case IP_BIND_ADDRESS_NO_PORT:
459460
case IP_MTU_DISCOVER:
460461
case IP_RECVERR:
461462

@@ -710,6 +711,14 @@ static int mptcp_setsockopt_sol_ip_set(struct mptcp_sock *msk, int optname,
710711
inet_assign_bit(TRANSPARENT, ssk,
711712
inet_test_bit(TRANSPARENT, sk));
712713
break;
714+
case IP_BIND_ADDRESS_NO_PORT:
715+
inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk,
716+
inet_test_bit(BIND_ADDRESS_NO_PORT, sk));
717+
break;
718+
case IP_LOCAL_PORT_RANGE:
719+
WRITE_ONCE(inet_sk(ssk)->local_port_range,
720+
READ_ONCE(inet_sk(sk)->local_port_range));
721+
break;
713722
default:
714723
release_sock(sk);
715724
WARN_ON_ONCE(1);
@@ -755,6 +764,8 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
755764
switch (optname) {
756765
case IP_FREEBIND:
757766
case IP_TRANSPARENT:
767+
case IP_BIND_ADDRESS_NO_PORT:
768+
case IP_LOCAL_PORT_RANGE:
758769
return mptcp_setsockopt_sol_ip_set(msk, optname, optval, optlen);
759770
case IP_TOS:
760771
return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen);
@@ -1350,6 +1361,12 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
13501361
switch (optname) {
13511362
case IP_TOS:
13521363
return mptcp_put_int_option(msk, optval, optlen, READ_ONCE(inet_sk(sk)->tos));
1364+
case IP_BIND_ADDRESS_NO_PORT:
1365+
return mptcp_put_int_option(msk, optval, optlen,
1366+
inet_test_bit(BIND_ADDRESS_NO_PORT, sk));
1367+
case IP_LOCAL_PORT_RANGE:
1368+
return mptcp_put_int_option(msk, optval, optlen,
1369+
READ_ONCE(inet_sk(sk)->local_port_range));
13531370
}
13541371

13551372
return -EOPNOTSUPP;
@@ -1450,6 +1467,8 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
14501467

14511468
inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk));
14521469
inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk));
1470+
inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk, inet_test_bit(BIND_ADDRESS_NO_PORT, sk));
1471+
WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_port_range));
14531472
}
14541473

14551474
void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk)

0 commit comments

Comments
 (0)