Commit ca2f5f21 authored by John Fastabend's avatar John Fastabend Committed by Alexei Starovoitov

bpf: Refactor sockmap redirect code so its easy to reuse

We will need this block of code called from tls context shortly
lets refactor the redirect logic so its easy to use. This also
cleans up the switch stmt so we have fewer fallthrough cases.

No logic changes are intended.

Fixes: d829e9c4 ("tls: convert to generic sk_msg interface")
Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Reviewed-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
Acked-by: default avatarSong Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/159079360110.5745.7024009076049029819.stgit@john-Precision-5820-TowerSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent df8fe57c
...@@ -682,13 +682,43 @@ static struct sk_psock *sk_psock_from_strp(struct strparser *strp) ...@@ -682,13 +682,43 @@ static struct sk_psock *sk_psock_from_strp(struct strparser *strp)
return container_of(parser, struct sk_psock, parser); return container_of(parser, struct sk_psock, parser);
} }
static void sk_psock_verdict_apply(struct sk_psock *psock, static void sk_psock_skb_redirect(struct sk_psock *psock, struct sk_buff *skb)
struct sk_buff *skb, int verdict)
{ {
struct sk_psock *psock_other; struct sk_psock *psock_other;
struct sock *sk_other; struct sock *sk_other;
bool ingress; bool ingress;
sk_other = tcp_skb_bpf_redirect_fetch(skb);
if (unlikely(!sk_other)) {
kfree_skb(skb);
return;
}
psock_other = sk_psock(sk_other);
if (!psock_other || sock_flag(sk_other, SOCK_DEAD) ||
!sk_psock_test_state(psock_other, SK_PSOCK_TX_ENABLED)) {
kfree_skb(skb);
return;
}
ingress = tcp_skb_bpf_ingress(skb);
if ((!ingress && sock_writeable(sk_other)) ||
(ingress &&
atomic_read(&sk_other->sk_rmem_alloc) <=
sk_other->sk_rcvbuf)) {
if (!ingress)
skb_set_owner_w(skb, sk_other);
skb_queue_tail(&psock_other->ingress_skb, skb);
schedule_work(&psock_other->work);
} else {
kfree_skb(skb);
}
}
static void sk_psock_verdict_apply(struct sk_psock *psock,
struct sk_buff *skb, int verdict)
{
struct sock *sk_other;
switch (verdict) { switch (verdict) {
case __SK_PASS: case __SK_PASS:
sk_other = psock->sk; sk_other = psock->sk;
...@@ -707,25 +737,8 @@ static void sk_psock_verdict_apply(struct sk_psock *psock, ...@@ -707,25 +737,8 @@ static void sk_psock_verdict_apply(struct sk_psock *psock,
} }
goto out_free; goto out_free;
case __SK_REDIRECT: case __SK_REDIRECT:
sk_other = tcp_skb_bpf_redirect_fetch(skb); sk_psock_skb_redirect(psock, skb);
if (unlikely(!sk_other))
goto out_free;
psock_other = sk_psock(sk_other);
if (!psock_other || sock_flag(sk_other, SOCK_DEAD) ||
!sk_psock_test_state(psock_other, SK_PSOCK_TX_ENABLED))
goto out_free;
ingress = tcp_skb_bpf_ingress(skb);
if ((!ingress && sock_writeable(sk_other)) ||
(ingress &&
atomic_read(&sk_other->sk_rmem_alloc) <=
sk_other->sk_rcvbuf)) {
if (!ingress)
skb_set_owner_w(skb, sk_other);
skb_queue_tail(&psock_other->ingress_skb, skb);
schedule_work(&psock_other->work);
break; break;
}
/* fall-through */
case __SK_DROP: case __SK_DROP:
/* fall-through */ /* fall-through */
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment