diff options
| -rw-r--r-- | include/uapi/linux/bpf.h | 6 | ||||
| -rw-r--r-- | kernel/bpf/sockmap.c | 3 | ||||
| -rw-r--r-- | net/core/filter.c | 5 | ||||
| -rw-r--r-- | tools/include/uapi/linux/bpf.h | 4 |
4 files changed, 10 insertions, 8 deletions
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index f90860d1f897..0d7948ce2128 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h | |||
| @@ -575,7 +575,7 @@ union bpf_attr { | |||
| 575 | * @map: pointer to sockmap | 575 | * @map: pointer to sockmap |
| 576 | * @key: key to lookup sock in map | 576 | * @key: key to lookup sock in map |
| 577 | * @flags: reserved for future use | 577 | * @flags: reserved for future use |
| 578 | * Return: SK_REDIRECT | 578 | * Return: SK_PASS |
| 579 | * | 579 | * |
| 580 | * int bpf_sock_map_update(skops, map, key, flags) | 580 | * int bpf_sock_map_update(skops, map, key, flags) |
| 581 | * @skops: pointer to bpf_sock_ops | 581 | * @skops: pointer to bpf_sock_ops |
| @@ -786,8 +786,8 @@ struct xdp_md { | |||
| 786 | }; | 786 | }; |
| 787 | 787 | ||
| 788 | enum sk_action { | 788 | enum sk_action { |
| 789 | SK_ABORTED = 0, | 789 | SK_DROP = 0, |
| 790 | SK_DROP, | 790 | SK_PASS, |
| 791 | SK_REDIRECT, | 791 | SK_REDIRECT, |
| 792 | }; | 792 | }; |
| 793 | 793 | ||
diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c index 6778fb773934..66f00a2b27f4 100644 --- a/kernel/bpf/sockmap.c +++ b/kernel/bpf/sockmap.c | |||
| @@ -122,7 +122,8 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb) | |||
| 122 | preempt_enable(); | 122 | preempt_enable(); |
| 123 | skb->sk = NULL; | 123 | skb->sk = NULL; |
| 124 | 124 | ||
| 125 | return rc; | 125 | return rc == SK_PASS ? |
| 126 | (TCP_SKB_CB(skb)->bpf.map ? SK_REDIRECT : SK_PASS) : SK_DROP; | ||
| 126 | } | 127 | } |
| 127 | 128 | ||
| 128 | static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) | 129 | static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) |
diff --git a/net/core/filter.c b/net/core/filter.c index 68eaa2f81a8e..6ae94f825f72 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -1844,14 +1844,15 @@ BPF_CALL_4(bpf_sk_redirect_map, struct sk_buff *, skb, | |||
| 1844 | { | 1844 | { |
| 1845 | struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); | 1845 | struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); |
| 1846 | 1846 | ||
| 1847 | /* If user passes invalid input drop the packet. */ | ||
| 1847 | if (unlikely(flags)) | 1848 | if (unlikely(flags)) |
| 1848 | return SK_ABORTED; | 1849 | return SK_DROP; |
| 1849 | 1850 | ||
| 1850 | tcb->bpf.key = key; | 1851 | tcb->bpf.key = key; |
| 1851 | tcb->bpf.flags = flags; | 1852 | tcb->bpf.flags = flags; |
| 1852 | tcb->bpf.map = map; | 1853 | tcb->bpf.map = map; |
| 1853 | 1854 | ||
| 1854 | return SK_REDIRECT; | 1855 | return SK_PASS; |
| 1855 | } | 1856 | } |
| 1856 | 1857 | ||
| 1857 | struct sock *do_sk_redirect_map(struct sk_buff *skb) | 1858 | struct sock *do_sk_redirect_map(struct sk_buff *skb) |
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 24b35a1fd4d6..c174971afbe6 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h | |||
| @@ -787,8 +787,8 @@ struct xdp_md { | |||
| 787 | }; | 787 | }; |
| 788 | 788 | ||
| 789 | enum sk_action { | 789 | enum sk_action { |
| 790 | SK_ABORTED = 0, | 790 | SK_DROP = 0, |
| 791 | SK_DROP, | 791 | SK_PASS, |
| 792 | SK_REDIRECT, | 792 | SK_REDIRECT, |
| 793 | }; | 793 | }; |
| 794 | 794 | ||
