summaryrefslogtreecommitdiffstats
path: root/kernel/bpf/sockmap.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-10-30 01:10:01 -0400
committerDavid S. Miller <davem@davemloft.net>2017-10-30 08:09:24 -0400
commite1ea2f9856b765a2eaabb403a6751f70efc9ba4c (patch)
tree771f0f96fdab1b27757730e96d911c73f5499ee4 /kernel/bpf/sockmap.c
parentaad93c70b9a3b80dbc383a31e77a119f69bdd856 (diff)
parent0b07194bb55ed836c2cc7c22e866b87a14681984 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Several conflicts here. NFP driver bug fix adding nfp_netdev_is_nfp_repr() check to nfp_fl_output() needed some adjustments because the code block is in an else block now. Parallel additions to net/pkt_cls.h and net/sch_generic.h A bug fix in __tcp_retransmit_skb() conflicted with some of the rbtree changes in net-next. The tc action RCU callback fixes in 'net' had some overlap with some of the recent tcf_block reworking. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel/bpf/sockmap.c')
-rw-r--r--kernel/bpf/sockmap.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c
index eef843c3b419..de8f66cad882 100644
--- a/kernel/bpf/sockmap.c
+++ b/kernel/bpf/sockmap.c
@@ -96,6 +96,14 @@ static inline struct smap_psock *smap_psock_sk(const struct sock *sk)
96 return rcu_dereference_sk_user_data(sk); 96 return rcu_dereference_sk_user_data(sk);
97} 97}
98 98
99/* compute the linear packet data range [data, data_end) for skb when
100 * sk_skb type programs are in use.
101 */
102static inline void bpf_compute_data_end_sk_skb(struct sk_buff *skb)
103{
104 TCP_SKB_CB(skb)->bpf.data_end = skb->data + skb_headlen(skb);
105}
106
99static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb) 107static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
100{ 108{
101 struct bpf_prog *prog = READ_ONCE(psock->bpf_verdict); 109 struct bpf_prog *prog = READ_ONCE(psock->bpf_verdict);
@@ -117,7 +125,8 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
117 preempt_enable(); 125 preempt_enable();
118 skb->sk = NULL; 126 skb->sk = NULL;
119 127
120 return rc; 128 return rc == SK_PASS ?
129 (TCP_SKB_CB(skb)->bpf.map ? SK_REDIRECT : SK_PASS) : SK_DROP;
121} 130}
122 131
123static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) 132static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)