parse_ldabs.c 1.1 KB

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