*/
#define foreach_hicn_api_reply_msg \
_(HICN_API_REGISTER_PROD_APP_REPLY, hicn_api_register_prod_app_reply) \
+ _(HICN_API_FACE_PROD_DEL_REPLY, hicn_api_face_prod_del_reply) \
_(HICN_API_REGISTER_CONS_APP_REPLY, hicn_api_register_cons_app_reply) \
+ _(HICN_API_FACE_CONS_DEL_REPLY, hicn_api_face_cons_del_reply) \
_(HICN_API_ROUTE_NHOPS_ADD_REPLY, hicn_api_route_nhops_add_reply)
int hicn_binary_api_register_prod_app(
vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api);
}
+int hicn_binary_api_face_prod_del(
+ vpp_plugin_binary_api_t *api, hicn_del_face_app_input_params *input_params) {
+ vl_api_hicn_api_face_prod_del_t *mp;
+ vpp_plugin_binary_api_t *hm = api;
+
+ //vpp_binary_api_set_user_param(hm->vpp_api, output_params);
+
+ /* Construct the API message */
+ M(HICN_API_FACE_PROD_DEL, mp);
+
+ mp->faceid = clib_host_to_net_u32(input_params->face_id);
+
+ CONTEXT_SAVE(context_store, api, mp)
+
+ return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp);
+}
+
+static void vl_api_hicn_api_face_prod_del_reply_t_handler(
+ vl_api_hicn_api_face_prod_del_reply_t *mp) {
+ vpp_plugin_binary_api_t *binary_api;
+ CONTEXT_GET(context_store, mp, binary_api);
+
+ vpp_binary_api_set_ret_value(binary_api->vpp_api,
+ clib_net_to_host_u32(mp->retval));
+
+ vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api);
+}
+
int hicn_binary_api_register_cons_app(
vpp_plugin_binary_api_t *api, hicn_consumer_input_params *input_params,
hicn_consumer_output_params *output_params) {
vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api);
}
+int hicn_binary_api_face_cons_del(
+ vpp_plugin_binary_api_t *api, hicn_del_face_app_input_params *input_params) {
+ vl_api_hicn_api_face_cons_del_t *mp;
+ vpp_plugin_binary_api_t *hm = api;
+
+ /* Construct the API message */
+ M(HICN_API_FACE_CONS_DEL, mp);
+
+ mp->faceid = clib_host_to_net_u32(input_params->face_id);
+
+ CONTEXT_SAVE(context_store, api, mp)
+
+ return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp);
+}
+
+static void vl_api_hicn_api_face_cons_del_reply_t_handler(
+ vl_api_hicn_api_face_cons_del_reply_t *mp) {
+ vpp_plugin_binary_api_t *binary_api;
+ CONTEXT_GET(context_store, mp, binary_api);
+
+ vpp_binary_api_set_ret_value(binary_api->vpp_api,
+ clib_net_to_host_u32(mp->retval));
+
+ vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api);
+}
+
int hicn_binary_api_register_route(
vpp_plugin_binary_api_t *api,
hicn_producer_set_route_params *input_params) {
VPPForwarderInterface::VPPForwarderInterface(MemifConnector &connector)
: ForwarderInterface<VPPForwarderInterface, MemifConnector>(connector),
sw_if_index_(~0),
- face_id_(~0) {}
+ face_id1_(~0),
+ face_id2_(~0),
+ is_consumer_(false) {}
VPPForwarderInterface::~VPPForwarderInterface() {}
output.src4 = &ip4_address;
output.src6 = &ip6_address;
-
input.swif = sw_if_index_;
int ret = hicn_binary_api_register_cons_app(VPPForwarderInterface::hicn_api_,
throw errors::RuntimeException(hicn_binary_api_get_error_string(ret));
}
+ face_id1_ = output.face_id1;
+ face_id2_ = output.face_id2;
+
+
std::memcpy(inet_address_.v4.as_u8, output.src4->v4.as_u8, IPV4_ADDR_LEN);
std::memcpy(inet6_address_.v6.as_u8, output.src6->v6.as_u8, IPV6_ADDR_LEN);
sw_if_index_ = getMemifConfiguration();
- if (is_consumer) {
+ is_consumer_ = is_consumer;
+ if (is_consumer_) {
consumerConnection();
}
ip_prefix_t producer_prefix;
ip_address_t producer_locator;
- if (face_id_ == uint32_t(~0)) {
+ if (face_id1_ == uint32_t(~0)) {
hicn_producer_input_params input;
std::memset(&input, 0, sizeof(input));
inet6_address_ = *output.prod_addr;
- face_id_ = output.face_id;
+ face_id1_ = output.face_id;
} else {
hicn_producer_set_route_params params;
params.prefix = &producer_prefix;
params.prefix->address = addr.address;
params.prefix->family = addr.family;
params.prefix->len = addr.len;
- params.face_id = face_id_;
+ params.face_id = face_id1_;
int ret = hicn_binary_api_register_route(VPPForwarderInterface::hicn_api_,
¶ms);
if (VPPForwarderInterface::api_) {
connector_.close();
+ if (is_consumer_) {
+ hicn_del_face_app_input_params params;
+ params.face_id = face_id1_;
+ hicn_binary_api_face_cons_del(VPPForwarderInterface::hicn_api_, ¶ms);
+ params.face_id = face_id2_;
+ hicn_binary_api_face_cons_del(VPPForwarderInterface::hicn_api_, ¶ms);
+ }
+ else {
+ hicn_del_face_app_input_params params;
+ params.face_id = face_id1_;
+ hicn_binary_api_face_prod_del(VPPForwarderInterface::hicn_api_, ¶ms);
+ }
+
if (sw_if_index_ != uint32_t(~0)) {
int ret = memif_binary_api_delete_memif(VPPForwarderInterface::memif_api_,
sw_if_index_);