ioam6.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
  2. /*
  3. * IPv6 IOAM implementation
  4. *
  5. * Author:
  6. * Justin Iurman <[email protected]>
  7. */
  8. #ifndef _UAPI_LINUX_IOAM6_H
  9. #define _UAPI_LINUX_IOAM6_H
  10. #include <asm/byteorder.h>
  11. #include <linux/types.h>
  12. #define IOAM6_U16_UNAVAILABLE U16_MAX
  13. #define IOAM6_U32_UNAVAILABLE U32_MAX
  14. #define IOAM6_U64_UNAVAILABLE U64_MAX
  15. #define IOAM6_DEFAULT_ID (IOAM6_U32_UNAVAILABLE >> 8)
  16. #define IOAM6_DEFAULT_ID_WIDE (IOAM6_U64_UNAVAILABLE >> 8)
  17. #define IOAM6_DEFAULT_IF_ID IOAM6_U16_UNAVAILABLE
  18. #define IOAM6_DEFAULT_IF_ID_WIDE IOAM6_U32_UNAVAILABLE
  19. /*
  20. * IPv6 IOAM Option Header
  21. */
  22. struct ioam6_hdr {
  23. __u8 opt_type;
  24. __u8 opt_len;
  25. __u8 :8; /* reserved */
  26. #define IOAM6_TYPE_PREALLOC 0
  27. __u8 type;
  28. } __attribute__((packed));
  29. /*
  30. * IOAM Trace Header
  31. */
  32. struct ioam6_trace_hdr {
  33. __be16 namespace_id;
  34. #if defined(__LITTLE_ENDIAN_BITFIELD)
  35. __u8 :1, /* unused */
  36. :1, /* unused */
  37. overflow:1,
  38. nodelen:5;
  39. __u8 remlen:7,
  40. :1; /* unused */
  41. union {
  42. __be32 type_be32;
  43. struct {
  44. __u32 bit7:1,
  45. bit6:1,
  46. bit5:1,
  47. bit4:1,
  48. bit3:1,
  49. bit2:1,
  50. bit1:1,
  51. bit0:1,
  52. bit15:1, /* unused */
  53. bit14:1, /* unused */
  54. bit13:1, /* unused */
  55. bit12:1, /* unused */
  56. bit11:1,
  57. bit10:1,
  58. bit9:1,
  59. bit8:1,
  60. bit23:1, /* reserved */
  61. bit22:1,
  62. bit21:1, /* unused */
  63. bit20:1, /* unused */
  64. bit19:1, /* unused */
  65. bit18:1, /* unused */
  66. bit17:1, /* unused */
  67. bit16:1, /* unused */
  68. :8; /* reserved */
  69. } type;
  70. };
  71. #elif defined(__BIG_ENDIAN_BITFIELD)
  72. __u8 nodelen:5,
  73. overflow:1,
  74. :1, /* unused */
  75. :1; /* unused */
  76. __u8 :1, /* unused */
  77. remlen:7;
  78. union {
  79. __be32 type_be32;
  80. struct {
  81. __u32 bit0:1,
  82. bit1:1,
  83. bit2:1,
  84. bit3:1,
  85. bit4:1,
  86. bit5:1,
  87. bit6:1,
  88. bit7:1,
  89. bit8:1,
  90. bit9:1,
  91. bit10:1,
  92. bit11:1,
  93. bit12:1, /* unused */
  94. bit13:1, /* unused */
  95. bit14:1, /* unused */
  96. bit15:1, /* unused */
  97. bit16:1, /* unused */
  98. bit17:1, /* unused */
  99. bit18:1, /* unused */
  100. bit19:1, /* unused */
  101. bit20:1, /* unused */
  102. bit21:1, /* unused */
  103. bit22:1,
  104. bit23:1, /* reserved */
  105. :8; /* reserved */
  106. } type;
  107. };
  108. #else
  109. #error "Please fix <asm/byteorder.h>"
  110. #endif
  111. #define IOAM6_TRACE_DATA_SIZE_MAX 244
  112. __u8 data[0];
  113. } __attribute__((packed));
  114. #endif /* _UAPI_LINUX_IOAM6_H */