2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
15 #ifndef __included_ip6_hop_by_hop_ioam_h__
16 #define __included_ip6_hop_by_hop_ioam_h__
18 #include <vnet/ip/ip6_hop_by_hop.h>
19 #include <vnet/ip/ip6_hop_by_hop_packet.h>
20 #include <vnet/ip/ip.h>
23 /* The current rewrite we're using */
26 /* Trace data processing callback */
27 void *ioam_end_of_path_cb;
28 /* Configuration data */
31 #define IOAM_HBYH_ADD 0
32 #define IOAM_HBYH_MOD 1
33 #define IOAM_HBYH_POP 2
35 /* time scale transform. Joy. */
44 /* Configured node-id */
57 #define TSP_MILLISECONDS 1
58 #define TSP_MICROSECONDS 2
59 #define TSP_NANOSECONDS 3
60 /* Time stamp precision. This is enumerated to above four options */
63 /* Array of function pointers to ADD and POP HBH option handling routines */
65 int (*add_options[256])(u8 *rewrite_string, u8 rewrite_size);
66 int (*pop_options[256])(ip6_header_t *ip, ip6_hop_by_hop_option_t *opt);
69 vlib_main_t * vlib_main;
70 vnet_main_t * vnet_main;
71 } ip6_hop_by_hop_ioam_main_t;
73 extern ip6_hop_by_hop_ioam_main_t ip6_hop_by_hop_ioam_main;
75 extern u8 * format_path_map(u8 * s, va_list * args);
77 ip6_ioam_trace_profile_set(u32 trace_option_elts, u32 trace_type, u32 node_id,
78 u32 app_data, int has_pot_option, u32 trace_tsp,
80 extern int ip6_ioam_set_destination (ip6_address_t *addr, u32 mask_width,
81 u32 vrf_id, int is_add, int is_pop, int is_none);
83 extern clib_error_t * clear_ioam_rewrite_fn(void);
85 static inline u8 is_zero_ip4_address (ip4_address_t *a)
87 return (a->as_u32 == 0);
90 static inline void copy_ip6_address (ip6_address_t *dst, ip6_address_t *src)
92 dst->as_u64[0] = src->as_u64[0];
93 dst->as_u64[1] = src->as_u64[1];
96 static inline void set_zero_ip6_address (ip6_address_t *a)
102 static inline u8 cmp_ip6_address (ip6_address_t *a1, ip6_address_t *a2)
104 return ((a1->as_u64[0] == a2->as_u64[0]) && (a1->as_u64[1] == a2->as_u64[1]));
106 static inline u8 is_zero_ip6_address (ip6_address_t *a)
108 return ((a->as_u64[0] == 0) && (a->as_u64[1] == 0));
111 int ip6_hbh_add_register_option (u8 option,
113 int rewrite_options(u8 *rewrite_string, u8 size));
114 int ip6_hbh_add_unregister_option (u8 option);
116 int ip6_hbh_pop_register_option (u8 option,
117 int options(ip6_header_t *ip, ip6_hop_by_hop_option_t *opt));
118 int ip6_hbh_pop_unregister_option (u8 option);
121 #endif /* __included_ip6_hop_by_hop_ioam_h__ */