From d677cc13ce9b23fdfacd812483d940fd3393b51c Mon Sep 17 00:00:00 2001 From: David Carlier Date: Mon, 6 Jun 2022 07:18:53 +0100 Subject: [PATCH] Add `SO_BPF_EXTENSIONS` flag to socket. Returns the supported bpf extensions from the kernel. Linux only. Closes GH-8713. --- NEWS | 1 + UPGRADING | 1 + configure.ac | 1 + ext/sockets/sockets.c | 63 ++++++++++++++++++++ ext/sockets/tests/socket_bpf_extensions.phpt | 23 +++++++ 5 files changed, 89 insertions(+) create mode 100644 ext/sockets/tests/socket_bpf_extensions.phpt diff --git a/NEWS b/NEWS index 01b477d8426..bfe40295083 100644 --- a/NEWS +++ b/NEWS @@ -74,6 +74,7 @@ PHP NEWS options. (David Carlier) . Added ancillary data support for FreeBSD. (David Carlier) . Added ancillary data support for NetBSD. (David Carlier) + . Added SO_BPF_EXTENSIONS socket option. (David Carlier) - Sodium: . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) diff --git a/UPGRADING b/UPGRADING index 512a78f9f7e..a690ffd3c79 100644 --- a/UPGRADING +++ b/UPGRADING @@ -249,6 +249,7 @@ PHP 8.2 UPGRADE NOTES . LOCAL_CREDS_PERSISTENT (FreeBSD) . SCM_CREDS2 (FreeBSD) . LOCAL_CREDS (NetBSD) + . SO_BPF_EXTENSIONS ======================================== 11. Changes to INI File Handling diff --git a/configure.ac b/configure.ac index bed4b063bcc..73c7edeae3d 100644 --- a/configure.ac +++ b/configure.ac @@ -395,6 +395,7 @@ fcntl.h \ grp.h \ ieeefp.h \ langinfo.h \ +linux/filter.h \ linux/sock_diag.h \ malloc.h \ poll.h \ diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 67c2038324a..07d44b4d2db 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -60,6 +60,11 @@ # else # undef SO_MEMINFO # endif +# if defined(HAVE_LINUX_FILTER_H) +# include +# else +# undef SO_BPF_EXTENSIONS +# endif #endif #include @@ -561,6 +566,64 @@ static PHP_MINIT_FUNCTION(sockets) #ifdef SO_MEMINFO REGISTER_LONG_CONSTANT("SO_MEMINFO", SO_MEMINFO, CONST_CS | CONST_PERSISTENT); #endif +#ifdef SO_BPF_EXTENSIONS + REGISTER_LONG_CONSTANT("SO_BPF_EXTENSIONS", SO_BPF_EXTENSIONS, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_OFF + REGISTER_LONG_CONSTANT("SKF_AD_OFF", SKF_AD_OFF, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_PROTOCOL + REGISTER_LONG_CONSTANT("SKF_AD_PROTOCOL", SKF_AD_PROTOCOL, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_PKTTYPE + REGISTER_LONG_CONSTANT("SKF_AD_PKTTYPE", SKF_AD_PKTTYPE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_IFINDEX + REGISTER_LONG_CONSTANT("SKF_AD_IFINDEX", SKF_AD_IFINDEX, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_NLATTR + REGISTER_LONG_CONSTANT("SKF_AD_NLATTR", SKF_AD_NLATTR, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_NLATTR_NEST + REGISTER_LONG_CONSTANT("SKF_AD_NLATTR_NEST", SKF_AD_NLATTR_NEST, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_MARK + REGISTER_LONG_CONSTANT("SKF_AD_MARK", SKF_AD_MARK, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_QUEUE + REGISTER_LONG_CONSTANT("SKF_AD_QUEUE", SKF_AD_QUEUE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_HATYPE + REGISTER_LONG_CONSTANT("SKF_AD_HATYPE", SKF_AD_HATYPE, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_RXHASH + REGISTER_LONG_CONSTANT("SKF_AD_RXHASH", SKF_AD_RXHASH, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_CPU + REGISTER_LONG_CONSTANT("SKF_AD_CPU", SKF_AD_CPU, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_ALU_XOR_X + REGISTER_LONG_CONSTANT("SKF_AD_ALU_XOR_X", SKF_AD_ALU_XOR_X, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_VLAN_TAG + REGISTER_LONG_CONSTANT("SKF_AD_VLAN_TAG", SKF_AD_VLAN_TAG, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_VLAN_TAG_PRESENT + REGISTER_LONG_CONSTANT("SKF_AD_VLAN_TAG_PRESENT", SKF_AD_VLAN_TAG_PRESENT, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_PAY_OFFSET + REGISTER_LONG_CONSTANT("SKF_AD_PAY_OFFSET", SKF_AD_PAY_OFFSET, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_RANDOM + REGISTER_LONG_CONSTANT("SKF_AD_RANDOM", SKF_AD_RANDOM, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_VLAN_TPID + REGISTER_LONG_CONSTANT("SKF_AD_VLAN_TPID", SKF_AD_VLAN_TPID, CONST_CS | CONST_PERSISTENT); +#endif +#ifdef SKF_AD_MAX + REGISTER_LONG_CONSTANT("SKF_AD_MAX", SKF_AD_MAX, CONST_CS | CONST_PERSISTENT); +#endif + #ifdef TCP_NODELAY REGISTER_LONG_CONSTANT("TCP_NODELAY", TCP_NODELAY, CONST_CS | CONST_PERSISTENT); #endif diff --git a/ext/sockets/tests/socket_bpf_extensions.phpt b/ext/sockets/tests/socket_bpf_extensions.phpt new file mode 100644 index 00000000000..a9f97dfd181 --- /dev/null +++ b/ext/sockets/tests/socket_bpf_extensions.phpt @@ -0,0 +1,23 @@ +--TEST-- +SO_BPF_EXTENSIONS socket_getopt test +--EXTENSIONS-- +sockets +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +extensions supported flag %d