[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