Skip to content

Commit d677cc1

Browse files
committed
Add SO_BPF_EXTENSIONS flag to socket.
Returns the supported bpf extensions from the kernel. Linux only. Closes GH-8713.
1 parent ed6dab2 commit d677cc1

File tree

5 files changed

+89
-0
lines changed

5 files changed

+89
-0
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ PHP NEWS
7474
options. (David Carlier)
7575
. Added ancillary data support for FreeBSD. (David Carlier)
7676
. Added ancillary data support for NetBSD. (David Carlier)
77+
. Added SO_BPF_EXTENSIONS socket option. (David Carlier)
7778

7879
- Sodium:
7980
. Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott)

UPGRADING

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ PHP 8.2 UPGRADE NOTES
249249
. LOCAL_CREDS_PERSISTENT (FreeBSD)
250250
. SCM_CREDS2 (FreeBSD)
251251
. LOCAL_CREDS (NetBSD)
252+
. SO_BPF_EXTENSIONS
252253

253254
========================================
254255
11. Changes to INI File Handling

configure.ac

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ fcntl.h \
395395
grp.h \
396396
ieeefp.h \
397397
langinfo.h \
398+
linux/filter.h \
398399
linux/sock_diag.h \
399400
malloc.h \
400401
poll.h \

ext/sockets/sockets.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@
6060
# else
6161
# undef SO_MEMINFO
6262
# endif
63+
# if defined(HAVE_LINUX_FILTER_H)
64+
# include <linux/filter.h>
65+
# else
66+
# undef SO_BPF_EXTENSIONS
67+
# endif
6368
#endif
6469

6570
#include <stddef.h>
@@ -561,6 +566,64 @@ static PHP_MINIT_FUNCTION(sockets)
561566
#ifdef SO_MEMINFO
562567
REGISTER_LONG_CONSTANT("SO_MEMINFO", SO_MEMINFO, CONST_CS | CONST_PERSISTENT);
563568
#endif
569+
#ifdef SO_BPF_EXTENSIONS
570+
REGISTER_LONG_CONSTANT("SO_BPF_EXTENSIONS", SO_BPF_EXTENSIONS, CONST_CS | CONST_PERSISTENT);
571+
#endif
572+
#ifdef SKF_AD_OFF
573+
REGISTER_LONG_CONSTANT("SKF_AD_OFF", SKF_AD_OFF, CONST_CS | CONST_PERSISTENT);
574+
#endif
575+
#ifdef SKF_AD_PROTOCOL
576+
REGISTER_LONG_CONSTANT("SKF_AD_PROTOCOL", SKF_AD_PROTOCOL, CONST_CS | CONST_PERSISTENT);
577+
#endif
578+
#ifdef SKF_AD_PKTTYPE
579+
REGISTER_LONG_CONSTANT("SKF_AD_PKTTYPE", SKF_AD_PKTTYPE, CONST_CS | CONST_PERSISTENT);
580+
#endif
581+
#ifdef SKF_AD_IFINDEX
582+
REGISTER_LONG_CONSTANT("SKF_AD_IFINDEX", SKF_AD_IFINDEX, CONST_CS | CONST_PERSISTENT);
583+
#endif
584+
#ifdef SKF_AD_NLATTR
585+
REGISTER_LONG_CONSTANT("SKF_AD_NLATTR", SKF_AD_NLATTR, CONST_CS | CONST_PERSISTENT);
586+
#endif
587+
#ifdef SKF_AD_NLATTR_NEST
588+
REGISTER_LONG_CONSTANT("SKF_AD_NLATTR_NEST", SKF_AD_NLATTR_NEST, CONST_CS | CONST_PERSISTENT);
589+
#endif
590+
#ifdef SKF_AD_MARK
591+
REGISTER_LONG_CONSTANT("SKF_AD_MARK", SKF_AD_MARK, CONST_CS | CONST_PERSISTENT);
592+
#endif
593+
#ifdef SKF_AD_QUEUE
594+
REGISTER_LONG_CONSTANT("SKF_AD_QUEUE", SKF_AD_QUEUE, CONST_CS | CONST_PERSISTENT);
595+
#endif
596+
#ifdef SKF_AD_HATYPE
597+
REGISTER_LONG_CONSTANT("SKF_AD_HATYPE", SKF_AD_HATYPE, CONST_CS | CONST_PERSISTENT);
598+
#endif
599+
#ifdef SKF_AD_RXHASH
600+
REGISTER_LONG_CONSTANT("SKF_AD_RXHASH", SKF_AD_RXHASH, CONST_CS | CONST_PERSISTENT);
601+
#endif
602+
#ifdef SKF_AD_CPU
603+
REGISTER_LONG_CONSTANT("SKF_AD_CPU", SKF_AD_CPU, CONST_CS | CONST_PERSISTENT);
604+
#endif
605+
#ifdef SKF_AD_ALU_XOR_X
606+
REGISTER_LONG_CONSTANT("SKF_AD_ALU_XOR_X", SKF_AD_ALU_XOR_X, CONST_CS | CONST_PERSISTENT);
607+
#endif
608+
#ifdef SKF_AD_VLAN_TAG
609+
REGISTER_LONG_CONSTANT("SKF_AD_VLAN_TAG", SKF_AD_VLAN_TAG, CONST_CS | CONST_PERSISTENT);
610+
#endif
611+
#ifdef SKF_AD_VLAN_TAG_PRESENT
612+
REGISTER_LONG_CONSTANT("SKF_AD_VLAN_TAG_PRESENT", SKF_AD_VLAN_TAG_PRESENT, CONST_CS | CONST_PERSISTENT);
613+
#endif
614+
#ifdef SKF_AD_PAY_OFFSET
615+
REGISTER_LONG_CONSTANT("SKF_AD_PAY_OFFSET", SKF_AD_PAY_OFFSET, CONST_CS | CONST_PERSISTENT);
616+
#endif
617+
#ifdef SKF_AD_RANDOM
618+
REGISTER_LONG_CONSTANT("SKF_AD_RANDOM", SKF_AD_RANDOM, CONST_CS | CONST_PERSISTENT);
619+
#endif
620+
#ifdef SKF_AD_VLAN_TPID
621+
REGISTER_LONG_CONSTANT("SKF_AD_VLAN_TPID", SKF_AD_VLAN_TPID, CONST_CS | CONST_PERSISTENT);
622+
#endif
623+
#ifdef SKF_AD_MAX
624+
REGISTER_LONG_CONSTANT("SKF_AD_MAX", SKF_AD_MAX, CONST_CS | CONST_PERSISTENT);
625+
#endif
626+
564627
#ifdef TCP_NODELAY
565628
REGISTER_LONG_CONSTANT("TCP_NODELAY", TCP_NODELAY, CONST_CS | CONST_PERSISTENT);
566629
#endif
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
SO_BPF_EXTENSIONS socket_getopt test
3+
--EXTENSIONS--
4+
sockets
5+
--SKIPIF--
6+
<?php
7+
if (!defined("SO_BPF_EXTENSIONS")) {
8+
die("skip SO_BOF_EXTENSIONS");
9+
}
10+
?>
11+
--FILE--
12+
<?php
13+
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
14+
if (!$socket) {
15+
die('Unable to create AF_INET socket [socket]');
16+
}
17+
$flags = socket_getopt( $socket, SOL_SOCKET, SO_BPF_EXTENSIONS);
18+
if ($flags == false) die("socket_getopt");
19+
echo "extensions supported flag $flags";
20+
socket_close($socket);
21+
?>
22+
--EXPECTF--
23+
extensions supported flag %d

0 commit comments

Comments
 (0)