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