Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04686ef2 authored by John Fastabend's avatar John Fastabend Committed by David S. Miller
Browse files

bpf: remove SK_REDIRECT from UAPI



Now that SK_REDIRECT is no longer a valid return code. Remove it
from the UAPI completely. Then do a namespace remapping internal
to sockmap so SK_REDIRECT is no longer externally visible.

Patchs primary change is to do a namechange from SK_REDIRECT to
__SK_REDIRECT

Reported-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 14fc0aba
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -788,7 +788,6 @@ struct xdp_md {
enum sk_action {
	SK_DROP = 0,
	SK_PASS,
	SK_REDIRECT,
};

#define BPF_TAG_SIZE	8
+12 −4
Original line number Diff line number Diff line
@@ -101,13 +101,19 @@ static inline void bpf_compute_data_end_sk_skb(struct sk_buff *skb)
	TCP_SKB_CB(skb)->bpf.data_end = skb->data + skb_headlen(skb);
}

enum __sk_action {
	__SK_DROP = 0,
	__SK_PASS,
	__SK_REDIRECT,
};

static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
{
	struct bpf_prog *prog = READ_ONCE(psock->bpf_verdict);
	int rc;

	if (unlikely(!prog))
		return SK_DROP;
		return __SK_DROP;

	skb_orphan(skb);
	/* We need to ensure that BPF metadata for maps is also cleared
@@ -122,8 +128,10 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
	preempt_enable();
	skb->sk = NULL;

	/* Moving return codes from UAPI namespace into internal namespace */
	return rc == SK_PASS ?
		(TCP_SKB_CB(skb)->bpf.map ? SK_REDIRECT : SK_PASS) : SK_DROP;
		(TCP_SKB_CB(skb)->bpf.map ? __SK_REDIRECT : __SK_PASS) :
		__SK_DROP;
}

static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)
@@ -133,7 +141,7 @@ static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)

	rc = smap_verdict_func(psock, skb);
	switch (rc) {
	case SK_REDIRECT:
	case __SK_REDIRECT:
		sk = do_sk_redirect_map(skb);
		if (likely(sk)) {
			struct smap_psock *peer = smap_psock_sk(sk);
@@ -149,7 +157,7 @@ static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)
			}
		}
	/* Fall through and free skb otherwise */
	case SK_DROP:
	case __SK_DROP:
	default:
		kfree_skb(skb);
	}
+1 −2
Original line number Diff line number Diff line
@@ -576,7 +576,7 @@ union bpf_attr {
 *     @map: pointer to sockmap
 *     @key: key to lookup sock in map
 *     @flags: reserved for future use
 *     Return: SK_REDIRECT
 *     Return: SK_PASS
 *
 * int bpf_sock_map_update(skops, map, key, flags)
 *	@skops: pointer to bpf_sock_ops
@@ -789,7 +789,6 @@ struct xdp_md {
enum sk_action {
	SK_DROP = 0,
	SK_PASS,
	SK_REDIRECT,
};

#define BPF_TAG_SIZE	8