Skip to content

Commit aec6bba

Browse files
committed
making it more flexible for future additions
1 parent 7ee377f commit aec6bba

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
@@ -1956,20 +1956,30 @@ PHP_FUNCTION(socket_set_option)
19561956
#ifdef SO_ATTACH_REUSEPORT_CBPF
19571957
case SO_ATTACH_REUSEPORT_CBPF: {
19581958
convert_to_long(arg4);
1959+
19591960
if (!Z_LVAL_P(arg4)) {
19601961
ov = 1;
19611962
optlen = sizeof(ov);
19621963
opt_ptr = &ov;
19631964
optname = SO_DETACH_BPF;
19641965
} else {
1965-
static struct sock_filter cbpf[] = {
1966-
BPF_STMT((BPF_LD|BPF_W|BPF_ABS), (uint32_t)(SKF_AD_OFF+SKF_AD_CPU)),
1967-
BPF_STMT((BPF_RET|BPF_A), 0),
1968-
};
1969-
static struct sock_fprog bpfprog = {
1970-
.len = (sizeof(cbpf) / sizeof(cbpf[0])),
1971-
.filter = cbpf,
1972-
};
1966+
uint32_t k = (uint32_t)Z_LVAL_P(arg4);
1967+
static struct sock_filter cbpf[8] = {0};
1968+
static struct sock_fprog bpfprog;
1969+
1970+
switch (k) {
1971+
case SKF_AD_CPU:
1972+
cbpf[0].code = (BPF_LD|BPF_W|BPF_ABS);
1973+
cbpf[0].k = (uint32_t)(SKF_AD_OFF+k);
1974+
cbpf[1].code = (BPF_RET|BPF_A);
1975+
bpfprog.len = 2;
1976+
break;
1977+
default:
1978+
php_error_docref(NULL, E_WARNING, "Unsupported CBPF filter");
1979+
RETURN_FALSE;
1980+
}
1981+
1982+
bpfprog.filter = cbpf;
19731983
optlen = sizeof(bpfprog);
19741984
opt_ptr = &bpfprog;
19751985
}

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)