Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/samples/bpf/parse_ldabs.c
25924 views
1
/* Copyright (c) 2016 Facebook
2
*
3
* This program is free software; you can redistribute it and/or
4
* modify it under the terms of version 2 of the GNU General Public
5
* License as published by the Free Software Foundation.
6
*/
7
#define KBUILD_MODNAME "foo"
8
#include <linux/ip.h>
9
#include <linux/ipv6.h>
10
#include <linux/in.h>
11
#include <linux/tcp.h>
12
#include <linux/udp.h>
13
#include <uapi/linux/bpf.h>
14
#include <bpf/bpf_helpers.h>
15
#include "bpf_legacy.h"
16
17
#define DEFAULT_PKTGEN_UDP_PORT 9
18
#define IP_MF 0x2000
19
#define IP_OFFSET 0x1FFF
20
21
static inline int ip_is_fragment(struct __sk_buff *ctx, __u64 nhoff)
22
{
23
return load_half(ctx, nhoff + offsetof(struct iphdr, frag_off))
24
& (IP_MF | IP_OFFSET);
25
}
26
27
SEC("ldabs")
28
int handle_ingress(struct __sk_buff *skb)
29
{
30
__u64 troff = ETH_HLEN + sizeof(struct iphdr);
31
32
if (load_half(skb, offsetof(struct ethhdr, h_proto)) != ETH_P_IP)
33
return 0;
34
if (load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol)) != IPPROTO_UDP ||
35
load_byte(skb, ETH_HLEN) != 0x45)
36
return 0;
37
if (ip_is_fragment(skb, ETH_HLEN))
38
return 0;
39
if (load_half(skb, troff + offsetof(struct udphdr, dest)) == DEFAULT_PKTGEN_UDP_PORT)
40
return TC_ACT_SHOT;
41
return 0;
42
}
43
char _license[] SEC("license") = "GPL";
44
45