+void
+ipsec_unregister_udp_port (u16 port)
+{
+ ipsec_main_t *im = &ipsec_main;
+ u32 n_regs;
+ uword *p;
+
+ p = hash_get (im->udp_port_registrations, port);
+
+ ASSERT (p);
+
+ n_regs = p[0];
+
+ if (0 == --n_regs)
+ {
+ udp_unregister_dst_port (vlib_get_main (), port, 1);
+ hash_unset (im->udp_port_registrations, port);
+ }
+ else
+ {
+ hash_unset (im->udp_port_registrations, port);
+ hash_set (im->udp_port_registrations, port, n_regs);
+ }
+}
+
+void
+ipsec_register_udp_port (u16 port)
+{
+ ipsec_main_t *im = &ipsec_main;
+ u32 n_regs;
+ uword *p;
+
+ p = hash_get (im->udp_port_registrations, port);
+
+ n_regs = (p ? p[0] : 0);
+
+ if (0 == n_regs++)
+ udp_register_dst_port (vlib_get_main (), port,
+ ipsec4_tun_input_node.index, 1);
+
+ hash_unset (im->udp_port_registrations, port);
+ hash_set (im->udp_port_registrations, port, n_regs);
+}
+