knock frames should not contain any data, only headers

This commit is contained in:
Steven Polley 2024-04-13 21:50:20 -06:00
parent 0ad3e2b0d4
commit 2efe3344b4

View File

@ -37,6 +37,11 @@ int xdp_prog_func(struct xdp_md *ctx) {
void *data = (void *)(long)ctx->data; void *data = (void *)(long)ctx->data;
void *data_end = (void *)(long)ctx->data_end; void *data_end = (void *)(long)ctx->data_end;
// A knock should not contain any data
if (data_end - data > 60) {
goto done;
}
// parse ethernet header // parse ethernet header
struct ethhdr *eth = data; struct ethhdr *eth = data;
@ -50,15 +55,17 @@ int xdp_prog_func(struct xdp_md *ctx) {
if ((void *)udp + sizeof(*udp) <= data_end) if ((void *)udp + sizeof(*udp) <= data_end)
{ {
// pack into knock structure and send to userspace // pack into knock structure and send to userspace
struct knock_data knock; struct knock_data knock = {
knock.srcip = bpf_ntohl(ip->saddr); .srcip = bpf_ntohl(ip->saddr),
knock.dstport = bpf_htons(udp->dest); .dstport = bpf_htons(udp->dest),
knock.pad = 0; .pad = 0
};
bpf_ringbuf_output(&rb, &knock, sizeof(knock), BPF_RB_FORCE_WAKEUP); bpf_ringbuf_output(&rb, &knock, sizeof(knock), BPF_RB_FORCE_WAKEUP);
} }
} }
} }
} }
done:
// We send everything to XDP_PASS
return XDP_PASS; return XDP_PASS;
} }