KFunc bpf_xdp_get_xfrm_state
Get XFRM state
Definition
A struct xfrm_state *, if found, must be released with a corresponding bpf_xdp_xfrm_state_release.
Parameters
ctx - Pointer to ctx (xdp_md) in XDP program. Cannot be NULL
opts - Options for lookup. Cannot be NULL
Members
opts.error - Out parameter, set for any errors encountered, Values:
-EINVAL- netns_id is less than -1-EINVAL- opts__sz isn'tBPF_XFRM_STATE_OPTS_SZ-ENONET- No network namespace found for netns_id-ENOENT- No xfrm_state found
opts.netns_id - Specify the network namespace for lookup, Values:
BPF_F_CURRENT_NETNS- (-1) Use namespace associated with ctx[0, S32_MAX]- Network Namespace ID
opts.mark - XFRM mark to match on
opts.daddr - Destination address to match on
opts.spi - Security parameter index to match on
opts.proto - IP protocol to match on (eg. IPPROTO_ESP)
opts.family - Protocol family to match on (AF_INET/AF_INET6)
opts__sz - Length of the bpf_xfrm_state_opts structure. Must be BPF_XFRM_STATE_OPTS_SZ
Signature
struct xfrm_state *bpf_xdp_get_xfrm_state(struct xdp_md *ctx, struct bpf_xfrm_state_opts *opts, u32 opts__sz)
Note
The pointer returned by the kfunc may be NULL. Hence, it forces the user to do a NULL check on the pointer returned from the kfunc before making use of it (dereferencing or passing to another helper).
Note
This kfunc returns a pointer to a refcounted object. The verifier will then ensure that the pointer to the object
is eventually released using a release kfunc, or transferred to a map using a referenced kptr
(by invoking bpf_kptr_xchg). If not, the verifier fails the
loading of the BPF program until no lingering references remain in all possible explored states of the program.
Usage
This kfunc helper accesses internal xfrm_state associated with an SA(Security Association). This is intended to be used for the assigning of special per-CPU
Program types
The following program types can make use of this kfunc:
Example
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2016 VMware
* Copyright (c) 2016 Facebook
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation.
*/
volatile int xfrm_replay_window = 0;
SEC("xdp")
int xfrm_get_state_xdp(struct xdp_md *xdp)
{
struct bpf_xfrm_state_opts opts = {};
struct xfrm_state *x = NULL;
struct ip_esp_hdr *esph;
struct bpf_dynptr ptr;
u8 esph_buf[8] = {};
u8 iph_buf[20] = {};
struct iphdr *iph;
u32 off;
if (bpf_dynptr_from_xdp(xdp, 0, &ptr))
goto out;
off = sizeof(struct ethhdr);
iph = bpf_dynptr_slice(&ptr, off, iph_buf, sizeof(iph_buf));
if (!iph || iph->protocol != IPPROTO_ESP)
goto out;
off += sizeof(struct iphdr);
esph = bpf_dynptr_slice(&ptr, off, esph_buf, sizeof(esph_buf));
if (!esph)
goto out;
opts.netns_id = BPF_F_CURRENT_NETNS;
opts.daddr.a4 = iph->daddr;
opts.spi = esph->spi;
opts.proto = IPPROTO_ESP;
opts.family = AF_INET;
x = bpf_xdp_get_xfrm_state(xdp, &opts, sizeof(opts));
if (!x)
goto out;
if (!x->replay_esn)
goto out;
xfrm_replay_window = x->replay_esn->replay_window;
out:
if (x)
bpf_xdp_xfrm_state_release(x);
return XDP_PASS;
}
char _license[] SEC("license") = "GPL";