[prev in list] [next in list] [prev in thread] [next in thread]
List: php-cvs
Subject: [PHP-CVS] [php-src] master: socket module add SO_ATTACH_REUSEPORT_CPBF for Linux.
From: David Carlier <noreply () php ! net>
Date: 2022-09-29 22:42:22
Message-ID: 2VrXE3bNDLgX28vzuiVGX6zusszU3ee7gBHftMRxL8 () main ! php ! net
[Download RAW message or body]
Author: David Carlier (devnexen)
Date: 2022-09-29T23:32:39+01:00
Commit: https://github.com/php/php-src/commit/615b8006c42715b5ea9ec61f9368582eeef8467f
Raw diff: https://github.com/php/php-src/commit/615b8006c42715b5ea9ec61f9368582eeef8467f.diff
socket module add SO_ATTACH_REUSEPORT_CPBF for Linux.
to be used in conjunction with SO_REUSPORT, giving a greater control
over how we bind a socket instead of the round robin workflow, we do
instead attach to the processor id as :
- we assign the processor_id to A in the BPF filter.
- then returns A.
in other words, a more modern version of SO_INCOMING_CPU (ie can have a per
worker notion we do not use here).
Closes #8062
Changed paths:
A ext/sockets/tests/socket_reuseport_cbpf.phpt
M NEWS
M UPGRADING
M ext/sockets/config.m4
M ext/sockets/sockets.c
M ext/sockets/sockets.stub.php
M ext/sockets/sockets_arginfo.h
Diff:
diff --git a/NEWS b/NEWS
index 6432c90ddde7..0801660b5896 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 8.3.0alpha1
+- CLI:
+ . Added pdeathsig to builtin server to terminate workers when the master
+ process is killed. (ilutov)
+
- Core:
. Fixed bug GH-9388 (Improve unset property and __get type incompatibility
error message). (ilutov)
@@ -17,9 +21,8 @@ PHP NEWS
- Posix:
. Added posix_sysconf. (David Carlier)
-- CLI:
- . Added pdeathsig to builtin server to terminate workers when the master
- process is killed. (ilutov)
-
+- Sockets:
+ . Added SO_ATTACH_REUSEPORT_CBPF socket option, to give tighter control
+ over socket binding for a cpu core. (David Carlier)
<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/UPGRADING b/UPGRADING
index e44936416e2c..222912963b9d 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -64,6 +64,9 @@ PHP 8.3 UPGRADE NOTES
. POSIX_SC_NPROCESSORS_CONF
. POSIX_SC_NPROCESSORS_ONLN
+- Sockets:
+ . SO_ATTACH_REUSEPORT_CBPF (Linux only).
+
========================================
11. Changes to INI File Handling
========================================
diff --git a/ext/sockets/config.m4 b/ext/sockets/config.m4
index aafedcb99ddd..d7eb86d986fb 100644
--- a/ext/sockets/config.m4
+++ b/ext/sockets/config.m4
@@ -5,7 +5,7 @@ PHP_ARG_ENABLE([sockets],
if test "$PHP_SOCKETS" != "no"; then
AC_CHECK_FUNCS([hstrerror if_nametoindex if_indextoname])
- AC_CHECK_HEADERS([netinet/tcp.h sys/un.h sys/sockio.h])
+ AC_CHECK_HEADERS([netinet/tcp.h sys/un.h sys/sockio.h linux/filter.h])
AC_DEFINE([HAVE_SOCKETS], 1, [ ])
dnl Check for fied ss_family in sockaddr_storage (missing in AIX until 5.3)
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 2a55a72432e5..0f008419562e 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -1741,6 +1741,7 @@ PHP_FUNCTION(socket_get_option)
return;
}
#endif
+
}
}
@@ -1960,6 +1961,40 @@ PHP_FUNCTION(socket_set_option)
}
#endif
+#ifdef SO_ATTACH_REUSEPORT_CBPF
+ case SO_ATTACH_REUSEPORT_CBPF: {
+ convert_to_long(arg4);
+
+ if (!Z_LVAL_P(arg4)) {
+ ov = 1;
+ optlen = sizeof(ov);
+ opt_ptr = &ov;
+ optname = SO_DETACH_BPF;
+ } else {
+ uint32_t k = (uint32_t)Z_LVAL_P(arg4);
+ static struct sock_filter cbpf[8] = {0};
+ static struct sock_fprog bpfprog;
+
+ switch (k) {
+ case SKF_AD_CPU:
+ cbpf[0].code = (BPF_LD|BPF_W|BPF_ABS);
+ cbpf[0].k = (uint32_t)(SKF_AD_OFF + k);
+ cbpf[1].code = (BPF_RET|BPF_A);
+ bpfprog.len = 2;
+ break;
+ default:
+ php_error_docref(NULL, E_WARNING, "Unsupported CBPF filter");
+ RETURN_FALSE;
+ }
+
+ bpfprog.filter = cbpf;
+ optlen = sizeof(bpfprog);
+ opt_ptr = &bpfprog;
+ }
+ break;
+ }
+#endif
+
default:
default_case:
convert_to_long(arg4);
diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php
index 9e4664d04513..410d9f0e7e6d 100644
--- a/ext/sockets/sockets.stub.php
+++ b/ext/sockets/sockets.stub.php
@@ -1678,6 +1678,27 @@
*/
const LOCAL_CREDS = UNKNOWN;
#endif
+#if defined(SO_ATTACH_REUSEPORT_CBPF)
+/**
+ * @var int
+ * @cvalue SO_ATTACH_REUSEPORT_CBPF
+ */
+const SO_ATTACH_REUSEPORT_CBPF = UNKNOWN;
+#endif
+#if defined(SO_DETACH_FILTER)
+/**
+ * @var int
+ * @cvalue SO_DETACH_FILTER
+ */
+const SO_DETACH_FILTER = UNKNOWN;
+#endif
+#if defined(SO_DETACH_BPF)
+/**
+ * @var int
+ * @cvalue SO_DETACH_BPF
+ */
+const SO_DETACH_BPF = UNKNOWN;
+#endif
/**
* @strict-properties
diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h
index c2e3c18b2cd6..a59373e8babd 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: d28c6b566f4739b1eaefb82032e620aeb59728dc */
+ * Stub hash: 546bd6fd43a68c8b6a95b4145afa94c04e36364a */
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)
@@ -967,6 +967,15 @@ static void register_sockets_symbols(int module_number)
#if (!defined(LOCAL_CREDS_PERSISTENT) && defined(LOCAL_CREDS))
REGISTER_LONG_CONSTANT("LOCAL_CREDS", LOCAL_CREDS, CONST_PERSISTENT);
#endif
+#if defined(SO_ATTACH_REUSEPORT_CBPF)
+ REGISTER_LONG_CONSTANT("SO_ATTACH_REUSEPORT_CBPF", SO_ATTACH_REUSEPORT_CBPF, CONST_PERSISTENT);
+#endif
+#if defined(SO_DETACH_FILTER)
+ REGISTER_LONG_CONSTANT("SO_DETACH_FILTER", SO_DETACH_FILTER, CONST_PERSISTENT);
+#endif
+#if defined(SO_DETACH_BPF)
+ REGISTER_LONG_CONSTANT("SO_DETACH_BPF", SO_DETACH_BPF, CONST_PERSISTENT);
+#endif
}
static zend_class_entry *register_class_Socket(void)
diff --git a/ext/sockets/tests/socket_reuseport_cbpf.phpt b/ext/sockets/tests/socket_reuseport_cbpf.phpt
new file mode 100644
index 000000000000..1d4824dca1c8
--- /dev/null
+++ b/ext/sockets/tests/socket_reuseport_cbpf.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Test if socket_set_option() works, option:SO_ATTACH_REUSEPORT_CBPF
+--EXTENSIONS--
+sockets
+--SKIPIF--
+<?php
+
+if (!defined("SO_ATTACH_REUSEPORT_CBPF")) {
+ die('SKIP on platforms not supporting SO_ATTACH_REUSEPORT_CBPF');
+}
+?>
+--FILE--
+<?php
+$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+
+if (!$socket) {
+ die('Unable to create AF_INET socket [socket]');
+}
+var_dump(socket_set_option( $socket, SOL_SOCKET, SO_REUSEADDR, true));
+var_dump(socket_set_option( $socket, SOL_SOCKET, SO_REUSEPORT, true));
+var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, SKF_AD_CPU));
+var_dump(socket_bind($socket, '0.0.0.0'));
+socket_listen($socket);
+socket_close($socket);
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic