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 _LINUX_IOAM6_H
 10#define _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 /* _LINUX_IOAM6_H */