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