aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/uapi/linux/bpf.h6
-rw-r--r--kernel/bpf/sockmap.c3
-rw-r--r--net/core/filter.c5
-rw-r--r--tools/include/uapi/linux/bpf.h4
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
788enum sk_action { 788enum 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
128static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) 129static 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
1857struct sock *do_sk_redirect_map(struct sk_buff *skb) 1858struct 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
789enum sk_action { 789enum 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