+static void
+application_start_stop_proxy_local_scope (application_t * app,
+ u8 transport_proto, u8 is_start)
+{
+ session_endpoint_t sep = SESSION_ENDPOINT_NULL;
+ app_namespace_t *app_ns;
+ app_ns = app_namespace_get (app->ns_index);
+ sep.is_ip4 = 1;
+ sep.transport_proto = transport_proto;
+ sep.port = 0;
+
+ if (is_start)
+ {
+ session_lookup_add_session_endpoint (app_ns->local_table_index, &sep,
+ app->index);
+ sep.is_ip4 = 0;
+ session_lookup_add_session_endpoint (app_ns->local_table_index, &sep,
+ app->index);
+ }
+ else
+ {
+ session_lookup_del_session_endpoint (app_ns->local_table_index, &sep);
+ sep.is_ip4 = 0;
+ session_lookup_del_session_endpoint (app_ns->local_table_index, &sep);
+ }
+}
+
+void
+application_start_stop_proxy (application_t * app,
+ transport_proto_t transport_proto, u8 is_start)
+{
+ if (application_has_local_scope (app))
+ application_start_stop_proxy_local_scope (app, transport_proto, is_start);
+
+ if (application_has_global_scope (app))
+ {
+ application_start_stop_proxy_fib_proto (app, FIB_PROTOCOL_IP4,
+ transport_proto, is_start);
+ application_start_stop_proxy_fib_proto (app, FIB_PROTOCOL_IP6,
+ transport_proto, is_start);
+ }
+}
+
+void
+application_setup_proxy (application_t * app)
+{
+ u16 transports = app->proxied_transports;
+ transport_proto_t tp;
+
+ ASSERT (application_is_proxy (app));
+ if (application_is_builtin (app))
+ return;
+
+ /* *INDENT-OFF* */
+ transport_proto_foreach (tp, ({
+ if (transports & (1 << tp))
+ application_start_stop_proxy (app, tp, 1);
+ }));
+ /* *INDENT-ON* */
+}
+
+void
+application_remove_proxy (application_t * app)
+{
+ u16 transports = app->proxied_transports;
+ transport_proto_t tp;
+
+ ASSERT (application_is_proxy (app));
+
+ /* *INDENT-OFF* */
+ transport_proto_foreach (tp, ({
+ if (transports & (1 << tp))
+ application_start_stop_proxy (app, tp, 0);
+ }));
+ /* *INDENT-ON* */
+}
+