- ip0 = vlib_buffer_get_current (b0);
- adj_index0 = vnet_buffer (b0)->ip.adj_index[VLIB_TX];
- adj0 = ip_get_adjacency (lm, adj_index0);
- hbh0 = (ip6_hop_by_hop_header_t *)(ip0+1);
- opt0 = (ip6_hop_by_hop_option_t *)(hbh0+1);
- limit0 = (ip6_hop_by_hop_option_t *)
- ((u8 *)hbh0 + ((hbh0->length+1)<<3));
-
- /* Scan the set of h-b-h options, process ones that we understand */
- while (opt0 < limit0)
- {
- type0 = opt0->type & HBH_OPTION_TYPE_MASK;
- switch (type0)
- {
- case HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST:
- trace0 = (ioam_trace_option_t *)opt0;
- if (PREDICT_TRUE (trace0->data_list_elts_left))
- {
- trace0->data_list_elts_left--;
- /* fetch_trace_data_size returns in bytes. Convert it to 4-bytes
- * to skip to this node's location.
- */
- elt_index = trace0->data_list_elts_left *
- fetch_trace_data_size(trace0->ioam_trace_type)/4;
- elt0 = &trace0->elts[elt_index];
- if (trace0->ioam_trace_type & BIT_TTL_NODEID)
- {
- *elt0 =
- clib_host_to_net_u32 ((ip0->hop_limit<<24)
- | hm->node_id);
- elt0++;
- }
-
- if (trace0->ioam_trace_type & BIT_ING_INTERFACE)
- {
- *elt0 =
- (vnet_buffer(b0)->sw_if_index[VLIB_RX]&0xFFFF) << 16 | (adj0->rewrite_header.sw_if_index & 0xFFFF);
- *elt0 = clib_host_to_net_u32(*elt0);
- elt0++;
- }
-
- if (trace0->ioam_trace_type & BIT_TIMESTAMP)
- {
- /* Send least significant 32 bits */
- f64 time_f64 = (f64)(((f64)hm->unix_time_0) +
- (vlib_time_now(hm->vlib_main) - hm->vlib_time_0));
-
- time_u64.as_u64 =
- time_f64 * trace_tsp_mul[hm->trace_tsp];
- *elt0 = clib_host_to_net_u32(time_u64.as_u32[0]);
- elt0++;
- }
-
- if (trace0->ioam_trace_type & BIT_APPDATA)
- {
- /* $$$ set elt0->app_data */
- *elt0 = clib_host_to_net_u32(hm->app_data);
- elt0++;
- }
- }
-
- opt0 = (ip6_hop_by_hop_option_t *)
- (((u8 *)opt0) + opt0->length
- + sizeof (ip6_hop_by_hop_option_t));
- break;
-
- case HBH_OPTION_TYPE_IOAM_PROOF_OF_WORK:
- opt0 = (ip6_hop_by_hop_option_t *)
- (((u8 *)opt0) + sizeof (ioam_pow_option_t));
- break;
-
- case 0: /* Pad */
- opt0 = (ip6_hop_by_hop_option_t *) ((u8 *)opt0) + 1;
- goto out0;
-
- default:
- opt0 = (ip6_hop_by_hop_option_t *)
- (((u8 *)opt0) + opt0->length
- + sizeof (ip6_hop_by_hop_option_t));
- unknown_opts++;
- break;
- }
- }