diff options
author | Pablo Camarillo <pcamaril@cisco.com> | 2017-11-16 16:02:50 +0100 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-11-27 19:00:17 +0000 |
commit | 1a5e301fcdcd109d14112aafc5f5ee48d1462458 (patch) | |
tree | 76e88e7c4f142356fd20a0e71fa7d74e743a046c /src/vnet/srv6 | |
parent | 7af4a57e7824c850f28a3cc5b4451a9e9baad068 (diff) |
SRv6 improvements to binary API
Change-Id: I260f5fe43074c0be973309f0a0895f50f0ca7c2b
Signed-off-by: Pablo Camarillo <pcamaril@cisco.com>
Diffstat (limited to 'src/vnet/srv6')
-rw-r--r-- | src/vnet/srv6/sr.api | 42 | ||||
-rwxr-xr-x | src/vnet/srv6/sr.h | 2 | ||||
-rw-r--r-- | src/vnet/srv6/sr_api.c | 56 | ||||
-rwxr-xr-x | src/vnet/srv6/sr_policy_rewrite.c | 6 |
4 files changed, 84 insertions, 22 deletions
diff --git a/src/vnet/srv6/sr.api b/src/vnet/srv6/sr.api index 2c72cc55ed2..f2f6e78807d 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 @@ autoreply define sr_policy_del 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 @@ autoreply define sr_steering_add_del @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 d0f42869d21..1a30cf3e3e0 100755 --- a/src/vnet/srv6/sr.h +++ b/src/vnet/srv6/sr.h @@ -276,6 +276,8 @@ sr_steering_policy (int is_del, ip6_address_t * bsid, u32 sr_policy_index, 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 623f672a204..789bb27386c 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 @@ vl_api_sr_policy_del_t_handler (vl_api_sr_policy_del_t * mp) 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 @@ static void vl_api_sr_steering_add_del_t_handler 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 514dd6584d0..b42942c3cd5 100755 --- a/src/vnet/srv6/sr_policy_rewrite.c +++ b/src/vnet/srv6/sr_policy_rewrite.c @@ -112,6 +112,12 @@ static ip6_address_t sr_pr_encaps_src; /* 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) |