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