- switch (proto)
- {
- case FIB_PROTOCOL_IP4:
- pfx_len = 32;
- ue->ue_hdrs.ip4.ue_ip4.ip_version_and_header_length = 0x45;
- ue->ue_hdrs.ip4.ue_ip4.ttl = 254;
- ue->ue_hdrs.ip4.ue_ip4.protocol = IP_PROTOCOL_UDP;
- ue->ue_hdrs.ip4.ue_ip4.src_address.as_u32 = src_ip->ip4.as_u32;
- ue->ue_hdrs.ip4.ue_ip4.dst_address.as_u32 = dst_ip->ip4.as_u32;
- ue->ue_hdrs.ip4.ue_ip4.checksum =
- ip4_header_checksum (&ue->ue_hdrs.ip4.ue_ip4);
- ue->ue_hdrs.ip4.ue_udp.src_port = clib_host_to_net_u16 (src_port);
- ue->ue_hdrs.ip4.ue_udp.dst_port = clib_host_to_net_u16 (dst_port);
-
- break;
- case FIB_PROTOCOL_IP6:
- pfx_len = 128;
- ue->ue_hdrs.ip6.ue_ip6.ip_version_traffic_class_and_flow_label =
- clib_host_to_net_u32 (6 << 28);
- ue->ue_hdrs.ip6.ue_ip6.hop_limit = 255;
- ue->ue_hdrs.ip6.ue_ip6.protocol = IP_PROTOCOL_UDP;
- ue->ue_hdrs.ip6.ue_ip6.src_address.as_u64[0] =
- src_ip->ip6.as_u64[0];
- ue->ue_hdrs.ip6.ue_ip6.src_address.as_u64[1] =
- src_ip->ip6.as_u64[1];
- ue->ue_hdrs.ip6.ue_ip6.dst_address.as_u64[0] =
- dst_ip->ip6.as_u64[0];
- ue->ue_hdrs.ip6.ue_ip6.dst_address.as_u64[1] =
- dst_ip->ip6.as_u64[1];
- ue->ue_hdrs.ip6.ue_udp.src_port = clib_host_to_net_u16 (src_port);
- ue->ue_hdrs.ip6.ue_udp.dst_port = clib_host_to_net_u16 (dst_port);
-
- break;
- default:
- ASSERT (0);
- }
+ /*
+ * track the destination address
+ */
+ fib_prefix_t dst_pfx = {
+ .fp_proto = proto,
+ .fp_len = pfx_len,
+ .fp_addr = *dst_ip,
+ };
+
+ ue->ue_fib_entry_index = fib_entry_track (fib_index,
+ &dst_pfx,
+ FIB_NODE_TYPE_UDP_ENCAP,
+ uei, &ue->ue_fib_sibling);
+ udp_encap_restack (ue);