SRv6 improvements to binary API

Change-Id: I260f5fe43074c0be973309f0a0895f50f0ca7c2b
Signed-off-by: Pablo Camarillo <pcamaril@cisco.com>
This commit is contained in:
Pablo Camarillo
2017-11-16 16:02:50 +01:00
committed by Damjan Marion
parent 7af4a57e78
commit 1a5e301fcd
4 changed files with 84 additions and 22 deletions

@ -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

@ -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)
*

@ -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.

@ -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)