/* * Copyright (c) 2015 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __included_ip6_hop_by_hop_h__ #define __included_ip6_hop_by_hop_h__ #include #include typedef struct { /* The current rewrite we're using */ u8 * rewrite; /* 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_rewrite_fn(void); 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__ */