+u32
+udp_api_decap_proto_to_index (vlib_main_t *vm,
+ vl_api_udp_decap_next_proto_t iproto)
+{
+ switch (iproto)
+ {
+ case UDP_API_DECAP_PROTO_IP4:
+ return vlib_get_node_by_name (vm, (u8 *) "ip4-input")->index;
+ case UDP_API_DECAP_PROTO_IP6:
+ return vlib_get_node_by_name (vm, (u8 *) "ip6-input")->index;
+ case UDP_API_DECAP_PROTO_MPLS:
+ return vlib_get_node_by_name (vm, (u8 *) "mpls-input")->index;
+ }
+ return ~0;
+}
+
+static void
+vl_api_udp_decap_add_del_t_handler (vl_api_udp_decap_add_del_t *mp)
+{
+ vl_api_udp_decap_add_del_reply_t *rmp;
+ vlib_main_t *vm = vlib_get_main ();
+ int rv = 0;
+
+ if (mp->is_add)
+ {
+ u32 node_index =
+ udp_api_decap_proto_to_index (vm, ntohl (mp->udp_decap.next_proto));
+ if (node_index == ~0)
+ rv = VNET_API_ERROR_INVALID_PROTOCOL;
+ else
+ udp_register_dst_port (vm, ntohs (mp->udp_decap.port), node_index,
+ mp->udp_decap.is_ip4);
+ }
+ else
+ udp_unregister_dst_port (vm, ntohs (mp->udp_decap.port),
+ mp->udp_decap.is_ip4);
+ REPLY_MACRO (VL_API_UDP_DECAP_ADD_DEL_REPLY);
+}
+