@@ -1419,6 +1419,12 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
14191419 switch (optname ) {
14201420 case IP_TOS :
14211421 return mptcp_put_int_option (msk , optval , optlen , READ_ONCE (inet_sk (sk )-> tos ));
1422+ case IP_FREEBIND :
1423+ return mptcp_put_int_option (msk , optval , optlen ,
1424+ inet_test_bit (FREEBIND , sk ));
1425+ case IP_TRANSPARENT :
1426+ return mptcp_put_int_option (msk , optval , optlen ,
1427+ inet_test_bit (TRANSPARENT , sk ));
14221428 case IP_BIND_ADDRESS_NO_PORT :
14231429 return mptcp_put_int_option (msk , optval , optlen ,
14241430 inet_test_bit (BIND_ADDRESS_NO_PORT , sk ));
@@ -1430,6 +1436,26 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
14301436 return - EOPNOTSUPP ;
14311437}
14321438
1439+ static int mptcp_getsockopt_v6 (struct mptcp_sock * msk , int optname ,
1440+ char __user * optval , int __user * optlen )
1441+ {
1442+ struct sock * sk = (void * )msk ;
1443+
1444+ switch (optname ) {
1445+ case IPV6_V6ONLY :
1446+ return mptcp_put_int_option (msk , optval , optlen ,
1447+ sk -> sk_ipv6only );
1448+ case IPV6_TRANSPARENT :
1449+ return mptcp_put_int_option (msk , optval , optlen ,
1450+ inet_test_bit (TRANSPARENT , sk ));
1451+ case IPV6_FREEBIND :
1452+ return mptcp_put_int_option (msk , optval , optlen ,
1453+ inet_test_bit (FREEBIND , sk ));
1454+ }
1455+
1456+ return - EOPNOTSUPP ;
1457+ }
1458+
14331459static int mptcp_getsockopt_sol_mptcp (struct mptcp_sock * msk , int optname ,
14341460 char __user * optval , int __user * optlen )
14351461{
@@ -1469,6 +1495,8 @@ int mptcp_getsockopt(struct sock *sk, int level, int optname,
14691495
14701496 if (level == SOL_IP )
14711497 return mptcp_getsockopt_v4 (msk , optname , optval , option );
1498+ if (level == SOL_IPV6 )
1499+ return mptcp_getsockopt_v6 (msk , optname , optval , option );
14721500 if (level == SOL_TCP )
14731501 return mptcp_getsockopt_sol_tcp (msk , optname , optval , option );
14741502 if (level == SOL_MPTCP )
0 commit comments