Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
0002 /*
0003  *  IPv6 IOAM implementation
0004  *
0005  *  Author:
0006  *  Justin Iurman <justin.iurman@uliege.be>
0007  */
0008 
0009 #ifndef _UAPI_LINUX_IOAM6_H
0010 #define _UAPI_LINUX_IOAM6_H
0011 
0012 #include <asm/byteorder.h>
0013 #include <linux/types.h>
0014 
0015 #define IOAM6_U16_UNAVAILABLE U16_MAX
0016 #define IOAM6_U32_UNAVAILABLE U32_MAX
0017 #define IOAM6_U64_UNAVAILABLE U64_MAX
0018 
0019 #define IOAM6_DEFAULT_ID (IOAM6_U32_UNAVAILABLE >> 8)
0020 #define IOAM6_DEFAULT_ID_WIDE (IOAM6_U64_UNAVAILABLE >> 8)
0021 #define IOAM6_DEFAULT_IF_ID IOAM6_U16_UNAVAILABLE
0022 #define IOAM6_DEFAULT_IF_ID_WIDE IOAM6_U32_UNAVAILABLE
0023 
0024 /*
0025  * IPv6 IOAM Option Header
0026  */
0027 struct ioam6_hdr {
0028     __u8 opt_type;
0029     __u8 opt_len;
0030     __u8 :8;                /* reserved */
0031 #define IOAM6_TYPE_PREALLOC 0
0032     __u8 type;
0033 } __attribute__((packed));
0034 
0035 /*
0036  * IOAM Trace Header
0037  */
0038 struct ioam6_trace_hdr {
0039     __be16  namespace_id;
0040 
0041 #if defined(__LITTLE_ENDIAN_BITFIELD)
0042 
0043     __u8    :1,             /* unused */
0044         :1,             /* unused */
0045         overflow:1,
0046         nodelen:5;
0047 
0048     __u8    remlen:7,
0049         :1;             /* unused */
0050 
0051     union {
0052         __be32 type_be32;
0053 
0054         struct {
0055             __u32   bit7:1,
0056                 bit6:1,
0057                 bit5:1,
0058                 bit4:1,
0059                 bit3:1,
0060                 bit2:1,
0061                 bit1:1,
0062                 bit0:1,
0063                 bit15:1,    /* unused */
0064                 bit14:1,    /* unused */
0065                 bit13:1,    /* unused */
0066                 bit12:1,    /* unused */
0067                 bit11:1,
0068                 bit10:1,
0069                 bit9:1,
0070                 bit8:1,
0071                 bit23:1,    /* reserved */
0072                 bit22:1,
0073                 bit21:1,    /* unused */
0074                 bit20:1,    /* unused */
0075                 bit19:1,    /* unused */
0076                 bit18:1,    /* unused */
0077                 bit17:1,    /* unused */
0078                 bit16:1,    /* unused */
0079                 :8;     /* reserved */
0080         } type;
0081     };
0082 
0083 #elif defined(__BIG_ENDIAN_BITFIELD)
0084 
0085     __u8    nodelen:5,
0086         overflow:1,
0087         :1,             /* unused */
0088         :1;             /* unused */
0089 
0090     __u8    :1,             /* unused */
0091         remlen:7;
0092 
0093     union {
0094         __be32 type_be32;
0095 
0096         struct {
0097             __u32   bit0:1,
0098                 bit1:1,
0099                 bit2:1,
0100                 bit3:1,
0101                 bit4:1,
0102                 bit5:1,
0103                 bit6:1,
0104                 bit7:1,
0105                 bit8:1,
0106                 bit9:1,
0107                 bit10:1,
0108                 bit11:1,
0109                 bit12:1,    /* unused */
0110                 bit13:1,    /* unused */
0111                 bit14:1,    /* unused */
0112                 bit15:1,    /* unused */
0113                 bit16:1,    /* unused */
0114                 bit17:1,    /* unused */
0115                 bit18:1,    /* unused */
0116                 bit19:1,    /* unused */
0117                 bit20:1,    /* unused */
0118                 bit21:1,    /* unused */
0119                 bit22:1,
0120                 bit23:1,    /* reserved */
0121                 :8;     /* reserved */
0122         } type;
0123     };
0124 
0125 #else
0126 #error "Please fix <asm/byteorder.h>"
0127 #endif
0128 
0129 #define IOAM6_TRACE_DATA_SIZE_MAX 244
0130     __u8    data[0];
0131 } __attribute__((packed));
0132 
0133 #endif /* _UAPI_LINUX_IOAM6_H */