* 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:
rangan
2016-03-18 03:31:17 +05:30
committed by Gerrit Code Review
parent acf0872108
commit 4f81085a77
3 changed files with 498 additions and 61 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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__ */

View File

@ -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__ */