+ pi = udp_get_dst_port_info (um, lcl->port, lcl->is_ip4);
+ if (pi)
+ return -1;
+
+ pool_get (um->listener_pool, listener);
+ memset (listener, 0, sizeof (udp_connection_t));
+
+ listener->c_lcl_port = lcl->port;
+ listener->c_c_index = listener - um->listener_pool;
+
+ /* If we are provided a sw_if_index, bind using one of its ips */
+ if (ip_is_zero (&lcl->ip, 1) && lcl->sw_if_index != ENDPOINT_INVALID_INDEX)
+ {
+ if ((iface_ip = ip_interface_get_first_ip (lcl->sw_if_index,
+ lcl->is_ip4)))
+ ip_set (&lcl->ip, iface_ip, lcl->is_ip4);
+ }
+ ip_copy (&listener->c_lcl_ip, &lcl->ip, lcl->is_ip4);
+ listener->c_is_ip4 = lcl->is_ip4;
+ listener->c_proto = TRANSPORT_PROTO_UDP;
+ listener->c_s_index = session_index;
+ listener->c_fib_index = lcl->fib_index;
+
+ node_index = lcl->is_ip4 ? udp4_input_node.index : udp6_input_node.index;
+ udp_register_dst_port (vm, clib_net_to_host_u16 (lcl->port), node_index,
+ 1 /* is_ipv4 */ );
+ return listener->c_c_index;