Skip to content

Commit 37cba3a

Browse files
committed
making it more flexible for future additions
1 parent 297d51e commit 37cba3a

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

ext/sockets/sockets.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1964,20 +1964,30 @@ PHP_FUNCTION(socket_set_option)
19641964
#ifdef SO_ATTACH_REUSEPORT_CBPF
19651965
case SO_ATTACH_REUSEPORT_CBPF: {
19661966
convert_to_long(arg4);
1967+
19671968
if (!Z_LVAL_P(arg4)) {
19681969
ov = 1;
19691970
optlen = sizeof(ov);
19701971
opt_ptr = &ov;
19711972
optname = SO_DETACH_BPF;
19721973
} else {
1973-
static struct sock_filter cbpf[] = {
1974-
BPF_STMT((BPF_LD|BPF_W|BPF_ABS), (uint32_t)(SKF_AD_OFF+SKF_AD_CPU)),
1975-
BPF_STMT((BPF_RET|BPF_A), 0),
1976-
};
1977-
static struct sock_fprog bpfprog = {
1978-
.len = (sizeof(cbpf) / sizeof(cbpf[0])),
1979-
.filter = cbpf,
1980-
};
1974+
uint32_t k = (uint32_t)Z_LVAL_P(arg4);
1975+
static struct sock_filter cbpf[8] = {0};
1976+
static struct sock_fprog bpfprog;
1977+
1978+
switch (k) {
1979+
case SKF_AD_CPU:
1980+
cbpf[0].code = (BPF_LD|BPF_W|BPF_ABS);
1981+
cbpf[0].k = (uint32_t)(SKF_AD_OFF + k);
1982+
cbpf[1].code = (BPF_RET|BPF_A);
1983+
bpfprog.len = 2;
1984+
break;
1985+
default:
1986+
php_error_docref(NULL, E_WARNING, "Unsupported CBPF filter");
1987+
RETURN_FALSE;
1988+
}
1989+
1990+
bpfprog.filter = cbpf;
19811991
optlen = sizeof(bpfprog);
19821992
opt_ptr = &bpfprog;
19831993
}

ext/sockets/tests/socket_reuseport_cbpf.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ if (!$socket) {
1818
}
1919
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_REUSEADDR, true));
2020
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_REUSEPORT, true));
21-
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, true));
21+
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, SKF_AD_CPU));
2222
var_dump(socket_bind($socket, '0.0.0.0'));
2323
socket_listen($socket);
2424
socket_close($socket);

0 commit comments

Comments
 (0)