* Added support to configure trace type as a
configuration parameter. This can be any combination of nodeid, interface indices, timestamp and appdata. This configuration is passed through packet header by encap node to all other nodes. Rewrite buffer is resized accordingly. Trace function modified accordingly. * Added CLI 'show ioam summary' command to display various configuration. * Added CLI 'clear ioam rewrite' Change-Id: Ide4c85f8b22561303df48519c5ea59668a300188 Signed-off-by: rangan <rangan@cisco.com>
This commit is contained in:

committed by
Gerrit Code Review

parent
acf0872108
commit
4f81085a77
File diff suppressed because it is too large
Load Diff
@ -23,13 +23,84 @@ typedef struct {
|
||||
|
||||
/* Trace data processing callback */
|
||||
void *ioam_end_of_path_cb;
|
||||
/* Configuration data */
|
||||
/* Adjacency */
|
||||
ip6_address_t adj;
|
||||
#define IOAM_HBYH_ADD 0
|
||||
#define IOAM_HBYH_MOD 1
|
||||
#define IOAM_HBYH_POP 2
|
||||
u8 ioam_flag;
|
||||
/* time scale transform. Joy. */
|
||||
u32 unix_time_0;
|
||||
f64 vlib_time_0;
|
||||
|
||||
|
||||
/* Trace option */
|
||||
u8 trace_type;
|
||||
u8 trace_option_elts;
|
||||
|
||||
/* Configured node-id */
|
||||
u32 node_id;
|
||||
u32 app_data;
|
||||
|
||||
/* PoW option */
|
||||
u8 has_pow_option;
|
||||
|
||||
#define PPC_NONE 0
|
||||
#define PPC_ENCAP 1
|
||||
#define PPC_DECAP 2
|
||||
u8 has_ppc_option;
|
||||
|
||||
#define TSP_SECONDS 0
|
||||
#define TSP_MILLISECONDS 1
|
||||
#define TSP_MICROSECONDS 2
|
||||
#define TSP_NANOSECONDS 3
|
||||
/* Time stamp precision. This is enumerated to above four options */
|
||||
u32 trace_tsp;
|
||||
|
||||
/* convenience */
|
||||
vlib_main_t * vlib_main;
|
||||
vnet_main_t * vnet_main;
|
||||
} ip6_hop_by_hop_main_t;
|
||||
|
||||
extern ip6_hop_by_hop_main_t ip6_hop_by_hop_main;
|
||||
|
||||
extern u8 * format_path_map(u8 * s, va_list * args);
|
||||
extern clib_error_t *
|
||||
ip6_ioam_trace_profile_set(u32 trace_option_elts, u32 trace_type, u32 node_id,
|
||||
u32 app_data, int has_pow_option, u32 trace_tsp,
|
||||
int has_e2e_option);
|
||||
extern int ip6_ioam_set_destination (ip6_address_t *addr, u32 mask_width,
|
||||
u32 vrf_id, int is_add, int is_pop, int is_none);
|
||||
|
||||
|
||||
extern clib_error_t * clear_ioam_trace_fn();
|
||||
|
||||
static inline u8 is_zero_ip4_address (ip4_address_t *a)
|
||||
{
|
||||
return (a->as_u32 == 0);
|
||||
}
|
||||
|
||||
static inline void copy_ip6_address (ip6_address_t *dst, ip6_address_t *src)
|
||||
{
|
||||
dst->as_u64[0] = src->as_u64[0];
|
||||
dst->as_u64[1] = src->as_u64[1];
|
||||
}
|
||||
|
||||
static inline void set_zero_ip6_address (ip6_address_t *a)
|
||||
{
|
||||
a->as_u64[0] = 0;
|
||||
a->as_u64[1] = 0;
|
||||
}
|
||||
|
||||
static inline u8 cmp_ip6_address (ip6_address_t *a1, ip6_address_t *a2)
|
||||
{
|
||||
return ((a1->as_u64[0] == a2->as_u64[0]) && (a1->as_u64[1] == a2->as_u64[1]));
|
||||
}
|
||||
static inline u8 is_zero_ip6_address (ip6_address_t *a)
|
||||
{
|
||||
return ((a->as_u64[0] == 0) && (a->as_u64[1] == 0));
|
||||
}
|
||||
|
||||
extern ip6_hop_by_hop_main_t * hm;
|
||||
#endif /* __included_ip6_hop_by_hop_h__ */
|
||||
|
@ -39,29 +39,152 @@ typedef struct {
|
||||
} ip6_hop_by_hop_option_t;
|
||||
|
||||
/* $$$$ IANA banana constants */
|
||||
#define HBH_OPTION_TYPE_IOAM_DATA_LIST 1
|
||||
#define HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST 1
|
||||
#define HBH_OPTION_TYPE_IOAM_PROOF_OF_WORK 2
|
||||
#define HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE 3
|
||||
|
||||
/*
|
||||
typedef struct {
|
||||
u32 ttl_node_id;
|
||||
u16 ingress_if;
|
||||
u16 egress_if;
|
||||
u32 timestamp;
|
||||
u32 app_data;
|
||||
} ioam_data_list_element_t;
|
||||
} ioam_trace_data_list_element_t;
|
||||
*/
|
||||
|
||||
#define BIT_TTL_NODEID (1<<0)
|
||||
#define BIT_ING_INTERFACE (1<<1)
|
||||
#define BIT_EGR_INTERFACE (1<<2)
|
||||
#define BIT_TIMESTAMP (1<<3)
|
||||
#define BIT_APPDATA (1<<4)
|
||||
#define TRACE_TYPE_MASK 0x1F /* Mask of all above bits */
|
||||
|
||||
/*
|
||||
0x00011111 iOAM-trace-type is 0x00011111 then the format of node
|
||||
data is:
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Hop_Lim | node_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| ingress_if_id | egress_if_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
+ timestamp +
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| app_data |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
*/
|
||||
#define TRACE_TYPE_IF_TS_APP 0x1f
|
||||
typedef struct {
|
||||
u32 ttl_node_id;
|
||||
u16 ingress_if;
|
||||
u16 egress_if;
|
||||
u32 timestamp;
|
||||
u32 app_data;
|
||||
} ioam_trace_if_ts_app_t;
|
||||
|
||||
/*
|
||||
0x00000111 iOAM-trace-type is 0x00000111 then the format is:
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Hop_Lim | node_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| ingress_if_id | egress_if_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
*/
|
||||
|
||||
#define TRACE_TYPE_IF 0x03
|
||||
typedef struct {
|
||||
u32 ttl_node_id;
|
||||
u16 ingress_if;
|
||||
u16 egress_if;
|
||||
} ioam_trace_if_t;
|
||||
|
||||
/*
|
||||
0x00001001 iOAM-trace-type is 0x00001001 then the format is:
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Hop_Lim | node_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
+ timestamp +
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
*/
|
||||
|
||||
#define TRACE_TYPE_TS 0x09
|
||||
typedef struct {
|
||||
u32 ttl_node_id;
|
||||
u32 timestamp;
|
||||
} ioam_trace_ts_t;
|
||||
|
||||
/*
|
||||
0x00010001 iOAM-trace-type is 0x00010001 then the format is:
|
||||
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Hop_Lim | node_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| app_data |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#define TRACE_TYPE_APP 0x11
|
||||
typedef struct {
|
||||
u32 ttl_node_id;
|
||||
u32 app_data;
|
||||
} ioam_trace_app_t;
|
||||
|
||||
/*
|
||||
|
||||
0x00011001 iOAM-trace-type is 0x00011001 then the format is:
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Hop_Lim | node_id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
+ timestamp +
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| app_data |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
|
||||
#define TRACE_TYPE_TS_APP 0x19
|
||||
typedef struct {
|
||||
u32 ttl_node_id;
|
||||
u32 timestamp;
|
||||
u32 app_data;
|
||||
} ioam_trace_ts_app_t;
|
||||
|
||||
|
||||
typedef CLIB_PACKED(struct {
|
||||
ip6_hop_by_hop_option_t hdr;
|
||||
u8 ioam_trace_type;
|
||||
u8 data_list_elts_left;
|
||||
ioam_data_list_element_t elts[0];
|
||||
u32 elts[0]; /* Variable type. So keep it generic */
|
||||
}) ioam_trace_option_t;
|
||||
|
||||
typedef CLIB_PACKED(struct {
|
||||
ip6_hop_by_hop_option_t hdr;
|
||||
u8 pow_type;
|
||||
u8 reserved;
|
||||
u32 random[2];
|
||||
u32 cumulative[2];
|
||||
#define PROFILE_ID_MASK 0xF
|
||||
u8 reserved_profile_id; /* 4 bits reserved, 4 bits to carry profile id */
|
||||
u64 random;
|
||||
u64 cumulative;
|
||||
}) ioam_pow_option_t;
|
||||
|
||||
typedef CLIB_PACKED(struct {
|
||||
ip6_hop_by_hop_option_t hdr;
|
||||
u8 e2e_type;
|
||||
u8 reserved;
|
||||
u32 e2e_data;
|
||||
}) ioam_e2e_option_t;
|
||||
|
||||
#endif /* __included_ip6_hop_by_hop_packet_h__ */
|
||||
|
Reference in New Issue
Block a user