From 59c88686578d727ae06190f9478a8c253dc6c286 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 24 Nov 2024 18:03:32 +0000 Subject: [PATCH 1/3] ext/sockets: following-up on GH-16842, update FreeBSD TCP stack setting. - `TCP_FUNCTION_ALIAS`: fetches the function pointer name alias (>= 14.0 only tough). - `TCP_BBR_ALGORITHM`: set/get the underlying algorithm (0: netflix, 1: google) when the BBR's TCP stack is used. - `TCP_REUSPORT_LB_NUMA`: set/get a NUMA domain filter on the socket. --- .github/actions/freebsd/action.yml | 1 + ext/sockets/sockets.c | 6 +++- ext/sockets/sockets.stub.php | 31 ++++++++++++++++++++ ext/sockets/sockets_arginfo.h | 17 ++++++++++- ext/sockets/tests/socket_set_option_tsf.phpt | 19 ++++++++++-- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/.github/actions/freebsd/action.yml b/.github/actions/freebsd/action.yml index f7c89a6961eb4..5f43ba4e98f1f 100644 --- a/.github/actions/freebsd/action.yml +++ b/.github/actions/freebsd/action.yml @@ -13,6 +13,7 @@ runs: cd $GITHUB_WORKSPACE kldload accf_http + kldload tcp_bbr pkg install -y \ autoconf \ bison \ diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 08b8d8406daa7..dec5777b3ae3d 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1705,7 +1705,11 @@ PHP_FUNCTION(socket_get_option) #endif #ifdef TCP_FUNCTION_BLK - case TCP_FUNCTION_BLK: { + case TCP_FUNCTION_BLK: +#ifdef TCP_FUNCTION_ALIAS + case TCP_FUNCTION_ALIAS: +#endif + { struct tcp_function_set tsf = {0}; optlen = sizeof(tsf); diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php index 77efa04b99b5d..325ade65c9f88 100644 --- a/ext/sockets/sockets.stub.php +++ b/ext/sockets/sockets.stub.php @@ -647,6 +647,37 @@ */ const TCP_FUNCTION_BLK = UNKNOWN; #endif +#ifdef TCP_FUNCTION_ALIAS +/** + * @var int + * @cvalue TCP_FUNCTION_ALIAS + */ +const TCP_FUNCTION_ALIAS = UNKNOWN; +#endif +#ifdef TCP_REUSPORT_LB_NUMA +/** + * @var int + * @cvalue TCP_REUSPORT_LB_NUMA + */ +const TCP_REUSPORT_LB_NUMA = UNKNOWN; +/** + * @var int + * @cvalue TCP_REUSPORT_LB_NUMA_NODOM + */ +const TCP_REUSPORT_LB_NUMA_NODOM = UNKNOWN; +/** + * @var int + * @cvalue TCP_REUSPORT_LB_NUMA_CURDOM + */ +const TCP_REUSPORT_LB_NUMA_CURDOM = UNKNOWN; +#endif +#ifdef TCP_BBR_ALGORITHM +/** + * @var int + * @cvalue TCP_BBR_ALGORITHM + */ +const TCP_BBR_ALGORITHM = UNKNOWN; +#endif /** * @var int * @cvalue PHP_NORMAL_READ diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h index af247a17df16f..fdaa537b41daf 100644 --- a/ext/sockets/sockets_arginfo.h +++ b/ext/sockets/sockets_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 341bf3dfc486ca410cf1e15e1e22b0c60734277b */ + * Stub hash: 2c5f4685d5dab42426d4fe0553dd17cb9935a572 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) @@ -559,6 +559,21 @@ static void register_sockets_symbols(int module_number) #endif #if defined(TCP_FUNCTION_BLK) REGISTER_LONG_CONSTANT("TCP_FUNCTION_BLK", TCP_FUNCTION_BLK, CONST_PERSISTENT); +#endif +#if defined(TCP_FUNCTION_ALIAS) + REGISTER_LONG_CONSTANT("TCP_FUNCTION_ALIAS", TCP_FUNCTION_ALIAS, CONST_PERSISTENT); +#endif +#if defined(TCP_REUSPORT_LB_NUMA) + REGISTER_LONG_CONSTANT("TCP_REUSPORT_LB_NUMA", TCP_REUSPORT_LB_NUMA, CONST_PERSISTENT); +#endif +#if defined(TCP_REUSPORT_LB_NUMA) + REGISTER_LONG_CONSTANT("TCP_REUSPORT_LB_NUMA_NODOM", TCP_REUSPORT_LB_NUMA_NODOM, CONST_PERSISTENT); +#endif +#if defined(TCP_REUSPORT_LB_NUMA) + REGISTER_LONG_CONSTANT("TCP_REUSPORT_LB_NUMA_CURDOM", TCP_REUSPORT_LB_NUMA_CURDOM, CONST_PERSISTENT); +#endif +#if defined(TCP_BBR_ALGORITHM) + REGISTER_LONG_CONSTANT("TCP_BBR_ALGORITHM", TCP_BBR_ALGORITHM, CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("PHP_NORMAL_READ", PHP_NORMAL_READ, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_BINARY_READ", PHP_BINARY_READ, CONST_PERSISTENT); diff --git a/ext/sockets/tests/socket_set_option_tsf.phpt b/ext/sockets/tests/socket_set_option_tsf.phpt index 22745fb385c17..7536650b22b4e 100644 --- a/ext/sockets/tests/socket_set_option_tsf.phpt +++ b/ext/sockets/tests/socket_set_option_tsf.phpt @@ -17,17 +17,30 @@ if (!$socket) { die('Unable to create AF_INET socket [socket]'); } socket_set_option( $socket, SOL_TCP, TCP_FUNCTION_BLK, "nochancetoexist"); -// TCP/RACK and other alternate stacks are not present by default, at least `freebsd` is. -var_dump(socket_set_option( $socket, SOL_TCP, TCP_FUNCTION_BLK, "freebsd")); +// TCP/RACK and other alternate stacks are not present by default, BBR should be available. +var_dump(socket_set_option( $socket, SOL_TCP, TCP_FUNCTION_BLK, "bbr")); +$bef = socket_get_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM); +var_dump($bef); +// not failed, but unchanged +var_dump(socket_set_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM, 1024)); +$aft = socket_get_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM); +var_dump($bef === $aft); +var_dump(socket_set_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM, 0)); var_dump(socket_get_option( $socket, SOL_TCP, TCP_FUNCTION_BLK)); +var_dump(socket_get_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM)); socket_close($socket); ?> --EXPECTF-- Warning: socket_set_option(): Unable to set socket option [2]: No such file or directory in %s on line %d bool(true) +int(%d) +bool(true) +bool(true) +bool(true) array(2) { ["function_set_name"]=> - string(7) "freebsd" + string(3) "bbr" ["pcbcnt"]=> int(%d) } +int(%d) From ffb8cb7d1853a5c2fdea2db7b381f6ef1c3a7ac2 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 24 Nov 2024 18:34:44 +0000 Subject: [PATCH 2/3] try loading later these kernel modules --- .github/actions/freebsd/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/freebsd/action.yml b/.github/actions/freebsd/action.yml index 5f43ba4e98f1f..38c590f7ef2a2 100644 --- a/.github/actions/freebsd/action.yml +++ b/.github/actions/freebsd/action.yml @@ -12,8 +12,6 @@ runs: prepare: | cd $GITHUB_WORKSPACE - kldload accf_http - kldload tcp_bbr pkg install -y \ autoconf \ bison \ @@ -91,6 +89,8 @@ runs: run: | cd $GITHUB_WORKSPACE + kldload accf_http + kldload tcp_bbr export SKIP_IO_CAPTURE_TESTS=1 export CI_NO_IPV6=1 export STACK_LIMIT_DEFAULTS_CHECK=1 From 01cf47dd53721c50ecb5b05827299936445fe367 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 24 Nov 2024 19:40:37 +0000 Subject: [PATCH 3/3] well.. --- .github/actions/freebsd/action.yml | 3 +-- ext/sockets/tests/socket_set_option_tsf.phpt | 19 +++---------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/.github/actions/freebsd/action.yml b/.github/actions/freebsd/action.yml index 38c590f7ef2a2..f7c89a6961eb4 100644 --- a/.github/actions/freebsd/action.yml +++ b/.github/actions/freebsd/action.yml @@ -12,6 +12,7 @@ runs: prepare: | cd $GITHUB_WORKSPACE + kldload accf_http pkg install -y \ autoconf \ bison \ @@ -89,8 +90,6 @@ runs: run: | cd $GITHUB_WORKSPACE - kldload accf_http - kldload tcp_bbr export SKIP_IO_CAPTURE_TESTS=1 export CI_NO_IPV6=1 export STACK_LIMIT_DEFAULTS_CHECK=1 diff --git a/ext/sockets/tests/socket_set_option_tsf.phpt b/ext/sockets/tests/socket_set_option_tsf.phpt index 7536650b22b4e..22745fb385c17 100644 --- a/ext/sockets/tests/socket_set_option_tsf.phpt +++ b/ext/sockets/tests/socket_set_option_tsf.phpt @@ -17,30 +17,17 @@ if (!$socket) { die('Unable to create AF_INET socket [socket]'); } socket_set_option( $socket, SOL_TCP, TCP_FUNCTION_BLK, "nochancetoexist"); -// TCP/RACK and other alternate stacks are not present by default, BBR should be available. -var_dump(socket_set_option( $socket, SOL_TCP, TCP_FUNCTION_BLK, "bbr")); -$bef = socket_get_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM); -var_dump($bef); -// not failed, but unchanged -var_dump(socket_set_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM, 1024)); -$aft = socket_get_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM); -var_dump($bef === $aft); -var_dump(socket_set_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM, 0)); +// TCP/RACK and other alternate stacks are not present by default, at least `freebsd` is. +var_dump(socket_set_option( $socket, SOL_TCP, TCP_FUNCTION_BLK, "freebsd")); var_dump(socket_get_option( $socket, SOL_TCP, TCP_FUNCTION_BLK)); -var_dump(socket_get_option( $socket, SOL_TCP, TCP_BBR_ALGORITHM)); socket_close($socket); ?> --EXPECTF-- Warning: socket_set_option(): Unable to set socket option [2]: No such file or directory in %s on line %d bool(true) -int(%d) -bool(true) -bool(true) -bool(true) array(2) { ["function_set_name"]=> - string(3) "bbr" + string(7) "freebsd" ["pcbcnt"]=> int(%d) } -int(%d)