test_pkt_md_access.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /* Copyright (c) 2017 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 <stddef.h>
  8. #include <string.h>
  9. #include <linux/bpf.h>
  10. #include <linux/pkt_cls.h>
  11. #include "bpf_helpers.h"
  12. int _version SEC("version") = 1;
  13. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  14. #define TEST_FIELD(TYPE, FIELD, MASK) \
  15. { \
  16. TYPE tmp = *(volatile TYPE *)&skb->FIELD; \
  17. if (tmp != ((*(volatile __u32 *)&skb->FIELD) & MASK)) \
  18. return TC_ACT_SHOT; \
  19. }
  20. #else
  21. #define TEST_FIELD_OFFSET(a, b) ((sizeof(a) - sizeof(b)) / sizeof(b))
  22. #define TEST_FIELD(TYPE, FIELD, MASK) \
  23. { \
  24. TYPE tmp = *((volatile TYPE *)&skb->FIELD + \
  25. TEST_FIELD_OFFSET(skb->FIELD, TYPE)); \
  26. if (tmp != ((*(volatile __u32 *)&skb->FIELD) & MASK)) \
  27. return TC_ACT_SHOT; \
  28. }
  29. #endif
  30. SEC("test1")
  31. int process(struct __sk_buff *skb)
  32. {
  33. TEST_FIELD(__u8, len, 0xFF);
  34. TEST_FIELD(__u16, len, 0xFFFF);
  35. TEST_FIELD(__u32, len, 0xFFFFFFFF);
  36. TEST_FIELD(__u16, protocol, 0xFFFF);
  37. TEST_FIELD(__u32, protocol, 0xFFFFFFFF);
  38. TEST_FIELD(__u8, hash, 0xFF);
  39. TEST_FIELD(__u16, hash, 0xFFFF);
  40. TEST_FIELD(__u32, hash, 0xFFFFFFFF);
  41. return TC_ACT_OK;
  42. }