+ udp_main_t *um = vnet_get_udp_main ();
+ vlib_main_t *vm = vlib_get_main ();
+ u32 thread_index = vm->thread_index;
+ udp_connection_t *uc;
+ ip46_address_t lcl_addr;
+ u32 node_index;
+ u16 lcl_port;
+
+ if (transport_alloc_local_endpoint (TRANSPORT_PROTO_UDP, rmt, &lcl_addr,
+ &lcl_port))
+ return -1;
+
+ while (udp_get_dst_port_info (um, lcl_port, rmt->is_ip4))
+ {
+ lcl_port = transport_alloc_local_port (TRANSPORT_PROTO_UDP, &lcl_addr);
+ if (lcl_port < 1)
+ {
+ clib_warning ("Failed to allocate src port");
+ return -1;
+ }
+ }
+
+ node_index = rmt->is_ip4 ? udp4_input_node.index : udp6_input_node.index;
+ udp_register_dst_port (vm, lcl_port, node_index, 1 /* is_ipv4 */ );
+
+ /* We don't poll main thread if we have workers */
+ if (vlib_num_workers ())
+ thread_index = 1;
+
+ uc = udp_connection_alloc (thread_index);
+ ip_copy (&uc->c_rmt_ip, &rmt->ip, rmt->is_ip4);
+ ip_copy (&uc->c_lcl_ip, &lcl_addr, rmt->is_ip4);
+ uc->c_rmt_port = rmt->port;
+ uc->c_lcl_port = clib_host_to_net_u16 (lcl_port);
+ uc->c_is_ip4 = rmt->is_ip4;
+ uc->c_proto = TRANSPORT_PROTO_UDP;
+ uc->c_fib_index = rmt->fib_index;
+
+ return uc->c_c_index;
+}
+
+transport_connection_t *
+udp_session_get_half_open (u32 conn_index)
+{
+ udp_connection_t *uc;
+ u32 thread_index;
+
+ /* We don't poll main thread if we have workers */
+ thread_index = vlib_num_workers ()? 1 : 0;
+ uc = udp_connection_get (conn_index, thread_index);
+ return &uc->connection;