@@ -308,6 +308,7 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
308308
309309 ret = sk_setsockopt (ssk , SOL_SOCKET , optname , optval , optlen );
310310 if (ret == 0 ) {
311+ /* Record the option at the msk for subsequent subflows */
311312 if (optname == SO_REUSEPORT )
312313 sk -> sk_reuseport = ssk -> sk_reuseport ;
313314 else if (optname == SO_REUSEADDR )
@@ -340,6 +341,25 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
340341 optval , optlen );
341342 case SO_LINGER :
342343 return mptcp_setsockopt_sol_socket_linger (msk , optval , optlen );
344+ case SO_MAX_PACING_RATE : {
345+ struct mptcp_subflow_context * subflow ;
346+
347+ ret = sock_setsockopt (sk -> sk_socket , SOL_SOCKET , optname , optval , optlen );
348+ if (ret < 0 )
349+ return ret ;
350+
351+ lock_sock (sk );
352+ sockopt_seq_inc (msk );
353+
354+ mptcp_for_each_subflow (msk , subflow ) {
355+ struct sock * ssk = mptcp_subflow_tcp_sock (subflow );
356+
357+ sk_setsockopt (ssk , SOL_SOCKET , optname , optval , optlen );
358+ }
359+
360+ release_sock (sk );
361+ break ;
362+ }
343363 case SO_RCVLOWAT :
344364 case SO_RCVTIMEO_OLD :
345365 case SO_RCVTIMEO_NEW :
@@ -373,7 +393,6 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
373393 * explicitly the sk_protocol field
374394 *
375395 * SO_PEEK_OFF is unsupported, as it is for plain TCP
376- * SO_MAX_PACING_RATE is unsupported, we must be careful with subflows
377396 * SO_CNX_ADVICE is currently unsupported, could possibly be relevant,
378397 * but likely needs careful design
379398 *
@@ -1532,6 +1551,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
15321551{
15331552 static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK ;
15341553 struct sock * sk = (struct sock * )msk ;
1554+ unsigned long max_pacing_rate ;
15351555
15361556 if (ssk -> sk_prot -> keepalive ) {
15371557 if (sock_flag (sk , SOCK_KEEPOPEN ))
@@ -1579,6 +1599,15 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
15791599 tcp_sock_set_keepcnt (ssk , msk -> keepalive_cnt );
15801600 tcp_sock_set_maxseg (ssk , msk -> maxseg );
15811601
1602+ /* Keep pacing settings in sync as well. */
1603+ max_pacing_rate = READ_ONCE (sk -> sk_max_pacing_rate );
1604+
1605+ WRITE_ONCE (ssk -> sk_max_pacing_rate , max_pacing_rate );
1606+ if (max_pacing_rate != ~0UL )
1607+ cmpxchg (& ssk -> sk_pacing_status , SK_PACING_NONE , SK_PACING_NEEDED );
1608+ if (READ_ONCE (ssk -> sk_pacing_rate ) > max_pacing_rate )
1609+ WRITE_ONCE (ssk -> sk_pacing_rate , max_pacing_rate );
1610+
15821611 inet_assign_bit (TRANSPARENT , ssk , inet_test_bit (TRANSPARENT , sk ));
15831612 inet_assign_bit (FREEBIND , ssk , inet_test_bit (FREEBIND , sk ));
15841613 inet_assign_bit (BIND_ADDRESS_NO_PORT , ssk , inet_test_bit (BIND_ADDRESS_NO_PORT , sk ));
0 commit comments