xref: /linux/include/uapi/linux/ioam6.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1db67f219SJustin Iurman /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2db67f219SJustin Iurman /*
3db67f219SJustin Iurman  *  IPv6 IOAM implementation
4db67f219SJustin Iurman  *
5db67f219SJustin Iurman  *  Author:
6db67f219SJustin Iurman  *  Justin Iurman <justin.iurman@uliege.be>
7db67f219SJustin Iurman  */
8db67f219SJustin Iurman 
9db67f219SJustin Iurman #ifndef _UAPI_LINUX_IOAM6_H
10db67f219SJustin Iurman #define _UAPI_LINUX_IOAM6_H
11db67f219SJustin Iurman 
12db67f219SJustin Iurman #include <asm/byteorder.h>
13db67f219SJustin Iurman #include <linux/types.h>
14db67f219SJustin Iurman 
159ee11f0fSJustin Iurman #define IOAM6_U16_UNAVAILABLE U16_MAX
169ee11f0fSJustin Iurman #define IOAM6_U32_UNAVAILABLE U32_MAX
179ee11f0fSJustin Iurman #define IOAM6_U64_UNAVAILABLE U64_MAX
189ee11f0fSJustin Iurman 
199ee11f0fSJustin Iurman #define IOAM6_DEFAULT_ID (IOAM6_U32_UNAVAILABLE >> 8)
209ee11f0fSJustin Iurman #define IOAM6_DEFAULT_ID_WIDE (IOAM6_U64_UNAVAILABLE >> 8)
219ee11f0fSJustin Iurman #define IOAM6_DEFAULT_IF_ID IOAM6_U16_UNAVAILABLE
229ee11f0fSJustin Iurman #define IOAM6_DEFAULT_IF_ID_WIDE IOAM6_U32_UNAVAILABLE
239ee11f0fSJustin Iurman 
24db67f219SJustin Iurman /*
25db67f219SJustin Iurman  * IPv6 IOAM Option Header
26db67f219SJustin Iurman  */
27db67f219SJustin Iurman struct ioam6_hdr {
28db67f219SJustin Iurman 	__u8 opt_type;
29db67f219SJustin Iurman 	__u8 opt_len;
30db67f219SJustin Iurman 	__u8 :8;				/* reserved */
31db67f219SJustin Iurman #define IOAM6_TYPE_PREALLOC 0
32db67f219SJustin Iurman 	__u8 type;
33db67f219SJustin Iurman } __attribute__((packed));
34db67f219SJustin Iurman 
35db67f219SJustin Iurman /*
36db67f219SJustin Iurman  * IOAM Trace Header
37db67f219SJustin Iurman  */
38db67f219SJustin Iurman struct ioam6_trace_hdr {
39db67f219SJustin Iurman 	__be16	namespace_id;
40db67f219SJustin Iurman 
41db67f219SJustin Iurman #if defined(__LITTLE_ENDIAN_BITFIELD)
42db67f219SJustin Iurman 
43db67f219SJustin Iurman 	__u8	:1,				/* unused */
44db67f219SJustin Iurman 		:1,				/* unused */
45db67f219SJustin Iurman 		overflow:1,
46db67f219SJustin Iurman 		nodelen:5;
47db67f219SJustin Iurman 
48db67f219SJustin Iurman 	__u8	remlen:7,
49db67f219SJustin Iurman 		:1;				/* unused */
50db67f219SJustin Iurman 
51db67f219SJustin Iurman 	union {
52db67f219SJustin Iurman 		__be32 type_be32;
53db67f219SJustin Iurman 
54db67f219SJustin Iurman 		struct {
55db67f219SJustin Iurman 			__u32	bit7:1,
56db67f219SJustin Iurman 				bit6:1,
57db67f219SJustin Iurman 				bit5:1,
58db67f219SJustin Iurman 				bit4:1,
59db67f219SJustin Iurman 				bit3:1,
60db67f219SJustin Iurman 				bit2:1,
61db67f219SJustin Iurman 				bit1:1,
62db67f219SJustin Iurman 				bit0:1,
63db67f219SJustin Iurman 				bit15:1,	/* unused */
64db67f219SJustin Iurman 				bit14:1,	/* unused */
65db67f219SJustin Iurman 				bit13:1,	/* unused */
66db67f219SJustin Iurman 				bit12:1,	/* unused */
67db67f219SJustin Iurman 				bit11:1,
68db67f219SJustin Iurman 				bit10:1,
69db67f219SJustin Iurman 				bit9:1,
70db67f219SJustin Iurman 				bit8:1,
71db67f219SJustin Iurman 				bit23:1,	/* reserved */
72db67f219SJustin Iurman 				bit22:1,
73db67f219SJustin Iurman 				bit21:1,	/* unused */
74db67f219SJustin Iurman 				bit20:1,	/* unused */
75db67f219SJustin Iurman 				bit19:1,	/* unused */
76db67f219SJustin Iurman 				bit18:1,	/* unused */
77db67f219SJustin Iurman 				bit17:1,	/* unused */
78db67f219SJustin Iurman 				bit16:1,	/* unused */
79db67f219SJustin Iurman 				:8;		/* reserved */
80db67f219SJustin Iurman 		} type;
81db67f219SJustin Iurman 	};
82db67f219SJustin Iurman 
83db67f219SJustin Iurman #elif defined(__BIG_ENDIAN_BITFIELD)
84db67f219SJustin Iurman 
85db67f219SJustin Iurman 	__u8	nodelen:5,
86db67f219SJustin Iurman 		overflow:1,
87db67f219SJustin Iurman 		:1,				/* unused */
88db67f219SJustin Iurman 		:1;				/* unused */
89db67f219SJustin Iurman 
90db67f219SJustin Iurman 	__u8	:1,				/* unused */
91db67f219SJustin Iurman 		remlen:7;
92db67f219SJustin Iurman 
93db67f219SJustin Iurman 	union {
94db67f219SJustin Iurman 		__be32 type_be32;
95db67f219SJustin Iurman 
96db67f219SJustin Iurman 		struct {
97db67f219SJustin Iurman 			__u32	bit0:1,
98db67f219SJustin Iurman 				bit1:1,
99db67f219SJustin Iurman 				bit2:1,
100db67f219SJustin Iurman 				bit3:1,
101db67f219SJustin Iurman 				bit4:1,
102db67f219SJustin Iurman 				bit5:1,
103db67f219SJustin Iurman 				bit6:1,
104db67f219SJustin Iurman 				bit7:1,
105db67f219SJustin Iurman 				bit8:1,
106db67f219SJustin Iurman 				bit9:1,
107db67f219SJustin Iurman 				bit10:1,
108db67f219SJustin Iurman 				bit11:1,
109db67f219SJustin Iurman 				bit12:1,	/* unused */
110db67f219SJustin Iurman 				bit13:1,	/* unused */
111db67f219SJustin Iurman 				bit14:1,	/* unused */
112db67f219SJustin Iurman 				bit15:1,	/* unused */
113db67f219SJustin Iurman 				bit16:1,	/* unused */
114db67f219SJustin Iurman 				bit17:1,	/* unused */
115db67f219SJustin Iurman 				bit18:1,	/* unused */
116db67f219SJustin Iurman 				bit19:1,	/* unused */
117db67f219SJustin Iurman 				bit20:1,	/* unused */
118db67f219SJustin Iurman 				bit21:1,	/* unused */
119db67f219SJustin Iurman 				bit22:1,
120db67f219SJustin Iurman 				bit23:1,	/* reserved */
121db67f219SJustin Iurman 				:8;		/* reserved */
122db67f219SJustin Iurman 		} type;
123db67f219SJustin Iurman 	};
124db67f219SJustin Iurman 
125db67f219SJustin Iurman #else
126db67f219SJustin Iurman #error "Please fix <asm/byteorder.h>"
127db67f219SJustin Iurman #endif
128db67f219SJustin Iurman 
1293edede08SJustin Iurman #define IOAM6_TRACE_DATA_SIZE_MAX 244
130*0b5dfa35SKees Cook 	__u8	data[];
131db67f219SJustin Iurman } __attribute__((packed));
132db67f219SJustin Iurman 
133db67f219SJustin Iurman #endif /* _UAPI_LINUX_IOAM6_H */
134