|
@@ -87,30 +87,6 @@ int sk_filter(struct sock *sk, struct sk_buff *skb)
|
|
|
}
|
|
|
EXPORT_SYMBOL(sk_filter);
|
|
|
|
|
|
-/* Helper to find the offset of pkt_type in sk_buff structure. We want
|
|
|
- * to make sure its still a 3bit field starting at a byte boundary;
|
|
|
- * taken from arch/x86/net/bpf_jit_comp.c.
|
|
|
- */
|
|
|
-#ifdef __BIG_ENDIAN_BITFIELD
|
|
|
-#define PKT_TYPE_MAX (7 << 5)
|
|
|
-#else
|
|
|
-#define PKT_TYPE_MAX 7
|
|
|
-#endif
|
|
|
-static unsigned int pkt_type_offset(void)
|
|
|
-{
|
|
|
- struct sk_buff skb_probe = { .pkt_type = ~0, };
|
|
|
- u8 *ct = (u8 *) &skb_probe;
|
|
|
- unsigned int off;
|
|
|
-
|
|
|
- for (off = 0; off < sizeof(struct sk_buff); off++) {
|
|
|
- if (ct[off] == PKT_TYPE_MAX)
|
|
|
- return off;
|
|
|
- }
|
|
|
-
|
|
|
- pr_err_once("Please fix %s, as pkt_type couldn't be found!\n", __func__);
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
static u64 __skb_get_pay_offset(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
|
|
|
{
|
|
|
return skb_get_poff((struct sk_buff *)(unsigned long) ctx);
|
|
@@ -190,11 +166,8 @@ static bool convert_bpf_extensions(struct sock_filter *fp,
|
|
|
break;
|
|
|
|
|
|
case SKF_AD_OFF + SKF_AD_PKTTYPE:
|
|
|
- *insn = BPF_LDX_MEM(BPF_B, BPF_REG_A, BPF_REG_CTX,
|
|
|
- pkt_type_offset());
|
|
|
- if (insn->off < 0)
|
|
|
- return false;
|
|
|
- insn++;
|
|
|
+ *insn++ = BPF_LDX_MEM(BPF_B, BPF_REG_A, BPF_REG_CTX,
|
|
|
+ PKT_TYPE_OFFSET());
|
|
|
*insn = BPF_ALU32_IMM(BPF_AND, BPF_REG_A, PKT_TYPE_MAX);
|
|
|
#ifdef __BIG_ENDIAN_BITFIELD
|
|
|
insn++;
|