From 16bce08024cec0a5362ec20067e5b38ecec44641 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 27 Aug 2025 20:25:15 +0100 Subject: [PATCH 1/3] ext/sockets: raw sockets, adding options of how to scale them. - PACKET_FANOUT_HASH (default) distributes incoming raw packets to a group of processes (per-flow group). - PACKET_FANOUT_LB uses a round-robin algorithm. - PACKET_FANOUT_CPU decision based on a given cpu instead. - PACKET_FANOUT_RND uses a pseudo random generator. - PACKET_FANOUT_QM uses the queue mapping high performance (hardware based). --- ext/sockets/sockets.stub.php | 56 +++++++++++++++++++++++++++++++++++ ext/sockets/sockets_arginfo.h | 23 +++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php index 6050a89414565..12598f1b5932a 100644 --- a/ext/sockets/sockets.stub.php +++ b/ext/sockets/sockets.stub.php @@ -1783,6 +1783,62 @@ const SOL_LOCAL = UNKNOWN; #endif +#ifdef SOL_PACKET +/** + * @var int + * @cvalue SOL_PACKET + */ +const SOL_PACKET = UNKNOWN; +#endif + +#ifdef PACKET_FANOUT +/** + * @var int + * @cvalue PACKET_FANOUT + */ +const PACKET_FANOUT = UNKNOWN; +#endif + +#ifdef PACKET_FANOUT_HASH +/** + * @var int + * @cvalue PACKET_FANOUT_HASH + */ +const PACKET_FANOUT_HASH = UNKNOWN; +#endif + +#ifdef PACKET_FANOUT_CPU +/** + * @var int + * @cvalue PACKET_FANOUT_CPU + */ +const PACKET_FANOUT_CPU = UNKNOWN; +#endif + +#ifdef PACKET_FANOUT_ROLLOVER +/** + * @var int + * @cvalue PACKET_FANOUT_ROLLOVER + */ +const PACKET_FANOUT_ROLLOVER = UNKNOWN; +#endif + +#ifdef PACKET_FANOUT_RND +/** + * @var int + * @cvalue PACKET_FANOUT_RND + */ +const PACKET_FANOUT_RND = UNKNOWN; +#endif + +#ifdef PACKET_FANOUT_QM +/** + * @var int + * @cvalue PACKET_FANOUT_QM + */ +const PACKET_FANOUT_QM = UNKNOWN; +#endif + #if (defined(IPV6_RECVPKTINFO) && defined(HAVE_IPV6)) /** * IPv6 ancillary data diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h index b7af6eb6b89ac..f5cd397375937 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: 7b1baf47dce2fb08faa5616068238ea078d1609b */ + * Stub hash: ed71027bd233a3a7ca851a3b1285ec24ea1692f2 */ 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) @@ -944,6 +944,27 @@ static void register_sockets_symbols(int module_number) #if defined(SOL_LOCAL) REGISTER_LONG_CONSTANT("SOL_LOCAL", SOL_LOCAL, CONST_PERSISTENT); #endif +#if defined(SOL_PACKET) + REGISTER_LONG_CONSTANT("SOL_PACKET", SOL_PACKET, CONST_PERSISTENT); +#endif +#if defined(PACKET_FANOUT) + REGISTER_LONG_CONSTANT("PACKET_FANOUT", PACKET_FANOUT, CONST_PERSISTENT); +#endif +#if defined(PACKET_FANOUT_HASH) + REGISTER_LONG_CONSTANT("PACKET_FANOUT_HASH", PACKET_FANOUT_HASH, CONST_PERSISTENT); +#endif +#if defined(PACKET_FANOUT_CPU) + REGISTER_LONG_CONSTANT("PACKET_FANOUT_CPU", PACKET_FANOUT_CPU, CONST_PERSISTENT); +#endif +#if defined(PACKET_FANOUT_ROLLOVER) + REGISTER_LONG_CONSTANT("PACKET_FANOUT_ROLLOVER", PACKET_FANOUT_ROLLOVER, CONST_PERSISTENT); +#endif +#if defined(PACKET_FANOUT_RND) + REGISTER_LONG_CONSTANT("PACKET_FANOUT_RND", PACKET_FANOUT_RND, CONST_PERSISTENT); +#endif +#if defined(PACKET_FANOUT_QM) + REGISTER_LONG_CONSTANT("PACKET_FANOUT_QM", PACKET_FANOUT_QM, CONST_PERSISTENT); +#endif #if (defined(IPV6_RECVPKTINFO) && defined(HAVE_IPV6)) REGISTER_LONG_CONSTANT("IPV6_RECVPKTINFO", IPV6_RECVPKTINFO, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IPV6_PKTINFO", IPV6_PKTINFO, CONST_PERSISTENT); From 2ab89005dba97817bf1fcb82473ed970030b83a3 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Thu, 28 Aug 2025 22:19:59 +0100 Subject: [PATCH 2/3] forgotten constant --- ext/sockets/sockets.stub.php | 8 ++++++++ ext/sockets/sockets_arginfo.h | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php index 12598f1b5932a..5c239da7700a4 100644 --- a/ext/sockets/sockets.stub.php +++ b/ext/sockets/sockets.stub.php @@ -1807,6 +1807,14 @@ const PACKET_FANOUT_HASH = UNKNOWN; #endif +#ifdef PACKET_FANOUT_LB +/** + * @var int + * @cvalue PACKET_FANOUT_LB + */ +const PACKET_FANOUT_LB = UNKNOWN; +#endif + #ifdef PACKET_FANOUT_CPU /** * @var int diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h index f5cd397375937..923c5d9cd80c9 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: ed71027bd233a3a7ca851a3b1285ec24ea1692f2 */ + * Stub hash: f9a67a1fe953092e7091c0978174412f31f326ac */ 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) @@ -953,6 +953,9 @@ static void register_sockets_symbols(int module_number) #if defined(PACKET_FANOUT_HASH) REGISTER_LONG_CONSTANT("PACKET_FANOUT_HASH", PACKET_FANOUT_HASH, CONST_PERSISTENT); #endif +#if defined(PACKET_FANOUT_LB) + REGISTER_LONG_CONSTANT("PACKET_FANOUT_LB", PACKET_FANOUT_LB, CONST_PERSISTENT); +#endif #if defined(PACKET_FANOUT_CPU) REGISTER_LONG_CONSTANT("PACKET_FANOUT_CPU", PACKET_FANOUT_CPU, CONST_PERSISTENT); #endif From ff0eabeb2f6b0d9459bbe175a9790666305400de Mon Sep 17 00:00:00 2001 From: David Carlier Date: Thu, 28 Aug 2025 22:20:05 +0100 Subject: [PATCH 3/3] add basic test --- ext/sockets/tests/socket_sol_packet.phpt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 ext/sockets/tests/socket_sol_packet.phpt diff --git a/ext/sockets/tests/socket_sol_packet.phpt b/ext/sockets/tests/socket_sol_packet.phpt new file mode 100644 index 0000000000000..a5c5c2ed4b5fe --- /dev/null +++ b/ext/sockets/tests/socket_sol_packet.phpt @@ -0,0 +1,21 @@ +--TEST-- +socket_setopt() with SOL_PACKET +--EXTENSIONS-- +sockets +posix +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +object(Socket)#1 (0) { +} +bool(true) +