// SPDX-License-Identifier: GPL-2.0+
/*
* Author: Justin Iurman (justin.iurman@uliege.be)
*
* IOAM tester for IPv6, see ioam6.sh for details on each test case.
*/
#include <arpa/inet.h>
#include <errno.h>
#include <limits.h>
#include <linux/const.h>
#include <linux/if_ether.h>
#include <linux/ioam6.h>
#include <linux/ipv6.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
struct ioam_config {
__u32 id;
__u64 wide;
__u16 ingr_id;
__u16 egr_id;
__u32 ingr_wide;
__u32 egr_wide;
__u32 ns_data;
__u64 ns_wide;
__u32 sc_id;
__u8 hlim;
char *sc_data;
};
/*
* Be careful if you modify structs below - everything MUST be kept synchronized
* with configurations inside ioam6.sh and always reflect the same.
*/
static struct ioam_config node1 = {
.id = 1,
.wide = 11111111,
.ingr_id = 0xffff, /* default value */
.egr_id = 101,
.ingr_wide = 0xffffffff, /* default value */
.egr_wide = 101101,
.ns_data = 0xdeadbeef,
.ns_wide = 0xcafec0caf00dc0de,
.sc_id = 777,
.sc_data = "something that will be 4n-aligned",
.hlim = 64,
};
static struct ioam_config node2 = {
.id = 2,
.wide = 22222222,
.ingr_id = 201,
.egr_id = 202,
.ingr_wide = 201201,
.egr_wide = 202202,
.ns_data = 0xffffffff, /* default value */
.ns_wide = 0xffffffffffffffff, /* default value */
.sc_id = 0xffffff, /* default value */
.sc_data = NULL,
.hlim = 63,
};
enum {
/**********
* OUTPUT *
**********/
__TEST_OUT_MIN,
TEST_OUT_UNDEF_NS,
TEST_OUT_NO_ROOM,
TEST_OUT_NO_ROOM_OSS,
TEST_OUT_BIT0,
TEST_OUT_BIT1,
TEST_OUT_BIT2,
TEST_OUT_BIT3,
TEST_OUT_BIT4,
TEST_OUT_BIT5,
TEST_OUT_BIT6,
TEST_OUT_BIT7,
TEST_OUT_BIT8,
TEST_OUT_BIT9,
TEST_OUT_BIT10,
TEST_OUT_BIT11,
TEST_OUT_BIT22,
TEST_OUT_SIZE4,
TEST_OUT_SIZE8,
TEST_OUT_SIZE12,
TEST_OUT_SIZE16,
TEST_OUT_SIZE20,
TEST_OUT_SIZE24,
TEST_OUT_SIZE28,
TEST_OUT_SIZE32,
TEST_OUT_SIZE36,
TEST_OUT_SIZE40,
TEST_OUT_SIZE44,
TEST_OUT_SIZE48,
TEST_OUT_SIZE52,
TEST_OUT_SIZE56,
TEST_OUT_SIZE60,
TEST_OUT_SIZE64,
TEST_OUT_SIZE68,
TEST_OUT_SIZE72,
TEST_OUT_SIZE76,
TEST_OUT_SIZE80,
TEST_OUT_SIZE84,
TEST_OUT_SIZE88,
TEST_OUT_SIZE92,
TEST_OUT_SIZE96,
TEST_OUT_SIZE100,
TEST_OUT_SIZE104,
TEST_OUT_SIZE108,
TEST_OUT_SIZE112,
TEST_OUT_SIZE116,
TEST_OUT_SIZE120,
TEST_OUT_SIZE124,
TEST_OUT_SIZE128,
TEST_OUT_SIZE132,
TEST_OUT_SIZE136,
TEST_OUT_SIZE140,
TEST_OUT_SIZE144,
TEST_OUT_SIZE148,
TEST_OUT_SIZE152,
TEST_OUT_SIZE156,
TEST_OUT_SIZE160,
TEST_OUT_SIZE164,
TEST_OUT_SIZE168,
TEST_OUT_SIZE172,
TEST_OUT_SIZE176,
TEST_OUT_SIZE180,
TEST_OUT_SIZE184,
TEST_OUT_SIZE188,
TEST_OUT_SIZE192,
TEST_OUT_SIZE196,
TEST_OUT_SIZE200,
TEST_OUT_SIZE204,
TEST_OUT_SIZE208,
TEST_OUT_SIZE212,
TEST_OUT_SIZE216,
TEST_OUT_SIZE220,
TEST_OUT_SIZE224,
TEST_OUT_SIZE228,
TEST_OUT_SIZE232,
TEST_OUT_SIZE236,
TEST_OUT_SIZE240,
TEST_OUT_SIZE244,
TEST_OUT_FULL_SUPP_TRACE,
__TEST_OUT_MAX,
/*********
* INPUT *
*********/
__TEST_IN_MIN,
TEST_IN_UNDEF_NS,
TEST_IN_NO_ROOM,
TEST_IN_NO_ROOM_OSS,
TEST_IN_DISABLED,
TEST_IN_OFLAG,
TEST_IN_BIT0,
TEST_IN_BIT1,
TEST_IN_BIT2,
TEST_IN_BIT3,
TEST_IN_BIT4,
TEST_IN_BIT5,
TEST_IN_BIT6,
TEST_IN_BIT7,
TEST_IN_BIT8,
TEST_IN_BIT9,
TEST_IN_BIT10,
TEST_IN_BIT11,
TEST_IN_BIT22,
TEST_IN_SIZE4,
TEST_IN_SIZE8,
TEST_IN_SIZE12,
TEST_IN_SIZE16,
TEST_IN_SIZE20,
TEST_IN_SIZE24,
TEST_IN_SIZE28,
TEST_IN_SIZE32