bpf: add flags to bpf_skb_store_bytes for clearing hash
authorDaniel Borkmann <daniel@iogearbox.net>
Fri, 4 Mar 2016 14:15:03 +0000 (15:15 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Mar 2016 18:55:15 +0000 (13:55 -0500)
When overwriting parts of the packet with bpf_skb_store_bytes() that
were fed previously into skb->hash calculation, we should clear the
current hash with skb_clear_hash(), so that a next skb_get_hash() call
can determine the correct hash related to this skb.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/bpf.h
net/core/filter.c

index ee2193287cbe4a3e3e2bcb822b87cda97cf6f2d6..2e3e903099043e97669aff0a860c78711e46b61a 100644 (file)
@@ -305,6 +305,7 @@ enum bpf_func_id {
 
 /* BPF_FUNC_skb_store_bytes flags. */
 #define BPF_F_RECOMPUTE_CSUM           (1ULL << 0)
+#define BPF_F_INVALIDATE_HASH          (1ULL << 1)
 
 /* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags.
  * First 4 bits are for passing the header field size.
index 356a251657a5c14fe10fa8197397e70aad092063..a1fe246a61478d6ef57f773ecc926a2ed03d7227 100644 (file)
@@ -1353,7 +1353,7 @@ static u64 bpf_skb_store_bytes(u64 r1, u64 r2, u64 r3, u64 r4, u64 flags)
        unsigned int len = (unsigned int) r4;
        void *ptr;
 
-       if (unlikely(flags & ~(BPF_F_RECOMPUTE_CSUM)))
+       if (unlikely(flags & ~(BPF_F_RECOMPUTE_CSUM | BPF_F_INVALIDATE_HASH)))
                return -EINVAL;
 
        /* bpf verifier guarantees that:
@@ -1384,6 +1384,8 @@ static u64 bpf_skb_store_bytes(u64 r1, u64 r2, u64 r3, u64 r4, u64 flags)
 
        if (flags & BPF_F_RECOMPUTE_CSUM)
                skb_postpush_rcsum(skb, ptr, len);
+       if (flags & BPF_F_INVALIDATE_HASH)
+               skb_clear_hash(skb);
 
        return 0;
 }