session: rules tables

This introduces 5-tuple lookup tables that may be used to implement
custom session layer actions at connection establishment time (session
layer perspective).

The rules table build mask-match-action lookup trees that for a given
5-tuple key return the action for the first longest match. If rules
overlap, ordering is established by tuple longest match with the
following descending priority: remote ip, local ip, remote port, local
port.

At this time, the only match action supported is to forward packets to
the application identified by the action.

Change-Id: Icbade6fac720fa3979820d50cd7d6137f8b635c3
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c
index c6fd119..df68ce0 100644
--- a/src/vnet/session/application.c
+++ b/src/vnet/session/application.c
@@ -482,6 +482,27 @@
   return app->flags & APP_OPTIONS_FLAGS_USE_GLOBAL_SCOPE;
 }
 
+u32
+application_n_listeners (application_t * app)
+{
+  return hash_elts (app->listeners_table);
+}
+
+stream_session_t *
+application_first_listener (application_t * app)
+{
+  u64 handle;
+  u32 sm_index;
+
+  /* *INDENT-OFF* */
+   hash_foreach (handle, sm_index, app->listeners_table, ({
+     return listen_session_get_from_handle (handle);
+   }));
+  /* *INDENT-ON* */
+
+  return 0;
+}
+
 u8 *
 format_application_listener (u8 * s, va_list * args)
 {
@@ -651,7 +672,7 @@
 	  vlib_cli_output (vm, "%U", format_application_listener,
 			   0 /* header */ , 0, 0,
 			   verbose);
-          /* *INDENT-OFF* */
+	  /* *INDENT-OFF* */
           pool_foreach (app, app_pool,
           ({
             /* App's listener sessions */