parse_ldabs.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. #define DEFAULT_PKTGEN_UDP_PORT 9
  17. #define IP_MF 0x2000
  18. #define IP_OFFSET 0x1FFF
  19. static inline int ip_is_fragment(struct __sk_buff *ctx, __u64 nhoff)
  20. {
  21. return load_half(ctx, nhoff + offsetof(struct iphdr, frag_off))
  22. & (IP_MF | IP_OFFSET);
  23. }
  24. SEC("ldabs")
  25. int handle_ingress(struct __sk_buff *skb)
  26. {
  27. __u64 troff = ETH_HLEN + sizeof(struct iphdr);
  28. if (load_half(skb, offsetof(struct ethhdr, h_proto)) != ETH_P_IP)
  29. return 0;
  30. if (load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol)) != IPPROTO_UDP ||
  31. load_byte(skb, ETH_HLEN) != 0x45)
  32. return 0;
  33. if (ip_is_fragment(skb, ETH_HLEN))
  34. return 0;
  35. if (load_half(skb, troff + offsetof(struct udphdr, dest)) == DEFAULT_PKTGEN_UDP_PORT)
  36. return TC_ACT_SHOT;
  37. return 0;
  38. }
  39. char _license[] SEC("license") = "GPL";