SRv6 improvements to binary API

Change-Id: I260f5fe43074c0be973309f0a0895f50f0ca7c2b
Signed-off-by: Pablo Camarillo <pcamaril@cisco.com>
diff --git a/src/vnet/srv6/sr.api b/src/vnet/srv6/sr.api
index 2c72cc5..f2f6e78 100644
--- a/src/vnet/srv6/sr.api
+++ b/src/vnet/srv6/sr.api
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-vl_api_version 1.0.0
+vl_api_version 1.0.1
 
 /** \brief IPv6 SR LocalSID add/del request
     @param client_index - opaque cookie to identify the sender
@@ -106,6 +106,19 @@
   u32 sr_policy_index;
 };
 
+/** \brief IPv6 SR Set SRv6 encapsulation source
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+    @param bsid is the bindingSID of the SR Policy
+    @param index is the index of the SR policy
+*/
+autoreply define sr_set_encap_source
+{
+  u32 client_index;
+  u32 context;
+  u8 encaps_source[16];
+};
+
 /** \brief IPv6 SR steering add/del
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
@@ -136,33 +149,22 @@
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
 */
-/**define sr_localsids_dump
+define sr_localsids_dump
 {
   u32 client_index;
   u32 context;
-};*/
+};
 
-/** \brief Details about a single SR LocalSID
-    @param context - returned sender context, to match reply w/ request
-    @param localsid_addr IPv6 address of the localsid
-    @param behavior Type of behavior (function) for this localsid
-    @param end_psp Boolean of whether decapsulation is allowed in this function
-    @param sw_if_index Only for L2/L3 xconnect. OIF. In VRF variant the fib_table.
-    @param vlan_index Only for L2 xconnect. Outgoing VLAN tag.
-    @param fib_table  FIB table in which we should install the localsid entry
-    @param nh_addr Next Hop IPv4/IPv6 address. Only for L2/L3 xconnect.
-*/
-/**manual_endian define sr_localsid_details
+define sr_localsids_details
 {
   u32 context;
-  u8 localsid_addr[16];
-  u8 behavior;
+  u8 address[16];
   u8 end_psp;
-  u32 sw_if_index;
-  u32 vlan_index;
+  u16 behavior;
   u32 fib_table;
-  u8 nh_addr[16];
-};*/
+  u8 xconnect_next_hop[16];
+  u32 xconnect_iface_or_vrf_table;
+};
 
 /*
  * fd.io coding-style-patch-verification: OFF
diff --git a/src/vnet/srv6/sr.h b/src/vnet/srv6/sr.h
index d0f4286..1a30cf3 100755
--- a/src/vnet/srv6/sr.h
+++ b/src/vnet/srv6/sr.h
@@ -276,6 +276,8 @@
 		    u32 table_id, ip46_address_t * prefix, u32 mask_width,
 		    u32 sw_if_index, u8 traffic_type);
 
+extern void sr_set_source (ip6_address_t * address);
+
 /**
  * @brief SR rewrite string computation for SRH insertion (inline)
  *
diff --git a/src/vnet/srv6/sr_api.c b/src/vnet/srv6/sr_api.c
index 623f672..789bb27 100644
--- a/src/vnet/srv6/sr_api.c
+++ b/src/vnet/srv6/sr_api.c
@@ -46,8 +46,9 @@
 #define foreach_vpe_api_msg                             \
 _(SR_LOCALSID_ADD_DEL, sr_localsid_add_del)             \
 _(SR_POLICY_DEL, sr_policy_del)                         \
-_(SR_STEERING_ADD_DEL, sr_steering_add_del)
-//_(SR_LOCALSIDS, sr_localsids_dump)
+_(SR_STEERING_ADD_DEL, sr_steering_add_del)             \
+_(SR_SET_ENCAP_SOURCE, sr_set_encap_source)             \
+_(SR_LOCALSIDS_DUMP, sr_localsids_dump)
 //_(SR_LOCALSID_BEHAVIORS, sr_localsid_behaviors_dump)
 
 static void vl_api_sr_localsid_add_del_t_handler
@@ -152,6 +153,16 @@
   REPLY_MACRO (VL_API_SR_POLICY_DEL_REPLY);
 }
 
+static void
+vl_api_sr_set_encap_source_t_handler (vl_api_sr_set_encap_source_t * mp)
+{
+  vl_api_sr_set_encap_source_reply_t *rmp;
+  int rv = 0;
+  sr_set_source ((ip6_address_t *) & mp->encaps_source);
+
+  REPLY_MACRO (VL_API_SR_POLICY_DEL_REPLY);
+}
+
 static void vl_api_sr_steering_add_del_t_handler
   (vl_api_sr_steering_add_del_t * mp)
 {
@@ -179,6 +190,47 @@
   REPLY_MACRO (VL_API_SR_STEERING_ADD_DEL_REPLY);
 }
 
+static void send_sr_localsid_details
+  (ip6_sr_localsid_t * t, unix_shared_memory_queue_t * q, u32 context)
+{
+  vl_api_sr_localsids_details_t *rmp;
+
+  rmp = vl_msg_api_alloc (sizeof (*rmp));
+  memset (rmp, 0, sizeof (*rmp));
+  rmp->_vl_msg_id = ntohs (VL_API_SR_LOCALSIDS_DETAILS);
+  memcpy (rmp->address, &t->localsid, sizeof (ip6_address_t));
+  rmp->end_psp = t->end_psp;
+  rmp->behavior = htons (t->behavior);
+  rmp->fib_table = htonl (t->fib_table);
+  memcpy (rmp->xconnect_next_hop, &t->next_hop, sizeof (ip6_address_t));
+  rmp->xconnect_iface_or_vrf_table = htonl (t->sw_if_index);
+  rmp->context = context;
+
+  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+}
+
+static void vl_api_sr_localsids_dump_t_handler
+  (vl_api_sr_localsids_dump_t * mp)
+{
+  unix_shared_memory_queue_t *q;
+  ip6_sr_main_t *sm = &sr_main;
+  ip6_sr_localsid_t *t;
+
+  q = vl_api_client_index_to_input_queue (mp->client_index);
+  if (q == 0)
+    {
+      return;
+    }
+
+  /* *INDENT-OFF* */
+  pool_foreach (t, sm->localsids,
+  ({
+    send_sr_localsid_details(t, q, mp->context);
+  }));
+  /* *INDENT-ON* */
+}
+
+
 /*
  * sr_api_hookup
  * Add vpe's API message handlers to the table.
diff --git a/src/vnet/srv6/sr_policy_rewrite.c b/src/vnet/srv6/sr_policy_rewrite.c
index 514dd65..b42942c 100755
--- a/src/vnet/srv6/sr_policy_rewrite.c
+++ b/src/vnet/srv6/sr_policy_rewrite.c
@@ -112,6 +112,12 @@
 /* Note:  This is temporal. We don't know whether to follow this path or
           take the ip address of a loopback interface or even the OIF         */
 
+void
+sr_set_source (ip6_address_t * address)
+{
+  clib_memcpy (&sr_pr_encaps_src, address, sizeof (sr_pr_encaps_src));
+}
+
 static clib_error_t *
 set_sr_src_command_fn (vlib_main_t * vm, unformat_input_t * input,
 		       vlib_cli_command_t * cmd)