in katran/lib/bpf/pckt_parsing.h [144:197]
int parse_hdr_opt(const struct xdp_md *xdp, struct hdr_opt_state *state)
{
const void* data = (void*)(long)xdp->data;
const void* data_end = (void*)(long)xdp->data_end;
__u8 *tcp_opt, kind, hdr_len;
// Need this check to satisify the verifier
if (!state) {
return -1;
}
tcp_opt = (__u8*)(data + state->byte_offset);
if (tcp_opt + 1 > data_end) {
return -1;
}
kind = tcp_opt[0];
if (kind == TCP_OPT_EOL) {
return -1;
}
if (kind == TCP_OPT_NOP) {
state->hdr_bytes_remaining--;
state->byte_offset++;
return 0;
}
if (state->hdr_bytes_remaining < 2 ||
tcp_opt + sizeof(__u8) + sizeof(__u8) > data_end) {
return -1;
}
hdr_len = tcp_opt[1];
if (hdr_len > state->hdr_bytes_remaining) {
return -1;
}
if (kind == TCP_HDR_OPT_KIND_TPR) {
if (hdr_len != TCP_HDR_OPT_LEN_TPR) {
return -1;
}
if (tcp_opt + TCP_HDR_OPT_LEN_TPR > data_end) {
return -1;
}
state->server_id = *(__u32*)&tcp_opt[2];
return 1;
}
state->hdr_bytes_remaining -= hdr_len;
state->byte_offset += hdr_len;
return 0;
}