{
vat_main_t *vam = &vat_main;
u8 *prefix;
+ u8 * (*format_eid)(u8 *, va_list *) = 0;
- prefix = format(0, "[&d] %U/%d",
+ switch (mp->eid_type)
+ {
+ case 0: format_eid = format_ip4_address; break;
+ case 1: format_eid = format_ip6_address; break;
+ case 2: format_eid = format_ethernet_address; break;
+ default:
+ errmsg ("unknown EID type %d!", mp->eid_type);
+ return;
+ }
+
+ prefix = format(0, "[%d] %U/%d",
clib_net_to_host_u32 (mp->vni),
- mp->eid_is_ipv6 ? format_ip6_address : format_ip4_address,
- mp->eid_ip_address,
- mp->eid_prefix_len);
+ format_eid, mp->eid, mp->eid_prefix_len);
fformat(vam->ofp, "%=20s%=30s\n",
mp->locator_set_name, prefix);
vat_json_node_t *node = NULL;
struct in6_addr ip6;
struct in_addr ip4;
+ u8 * s = 0;
if (VAT_JSON_ARRAY != vam->json_tree.type) {
ASSERT(VAT_JSON_NONE == vam->json_tree.type);
vat_json_init_object(node);
vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name);
- if (mp->eid_is_ipv6) {
- clib_memcpy(&ip6, mp->eid_ip_address, sizeof(ip6));
- vat_json_object_add_ip6(node, "eid address", ip6);
- } else {
- clib_memcpy(&ip4, mp->eid_ip_address, sizeof(ip4));
- vat_json_object_add_ip4(node, "eid address", ip4);
- }
+ switch (mp->eid_type)
+ {
+ case 0:
+ clib_memcpy(&ip4, mp->eid, sizeof(ip4));
+ vat_json_object_add_ip4(node, "eid-address", ip4);
+ break;
+ case 1:
+ clib_memcpy(&ip6, mp->eid, sizeof(ip6));
+ vat_json_object_add_ip6(node, "eid-address", ip6);
+ break;
+ case 2:
+ s = format (0, "%U", format_ethernet_address, mp->eid);
+ vec_add1(s, 0);
+ vat_json_object_add_string_copy(node, "eid-address", s);
+ vec_free(s);
+ break;
+ default:
+ errmsg ("unknown EID type %d!", mp->eid_type);
+ return;
+ }
vat_json_object_add_uint(node, "vni", clib_net_to_host_u32 (mp->vni));
- vat_json_object_add_uint(node, "eid prefix len", mp->eid_prefix_len);
+ vat_json_object_add_uint(node, "eid-prefix-len", mp->eid_prefix_len);
}
static u8 *
_(lisp_add_del_locator_set_reply) \
_(lisp_add_del_locator_reply) \
_(lisp_add_del_local_eid_reply) \
+_(lisp_add_del_remote_mapping_reply) \
+_(lisp_add_del_adjacency_reply) \
_(lisp_gpe_add_del_fwd_entry_reply) \
_(lisp_add_del_map_resolver_reply) \
_(lisp_gpe_enable_disable_reply) \
_(af_packet_delete_reply) \
_(policer_add_del_reply) \
_(netmap_create_reply) \
-_(netmap_delete_reply)
+_(netmap_delete_reply) \
+_(ipfix_enable_reply)
#define _(n) \
static void vl_api_##n##_t_handler \
_(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
_(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
_(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
+_(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
+_(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
_(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
_(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
_(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
_(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
_(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
_(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
-_(CLASSIFY_SESSION_DETAILS, classify_session_details)
+_(CLASSIFY_SESSION_DETAILS, classify_session_details) \
+_(IPFIX_ENABLE_REPLY, ipfix_enable_reply) \
+_(IPFIX_DETAILS, ipfix_details)
/* M: construct, but don't yet send a message */
u8 is_add = 1;
u8 static_mac = 0;
u8 filter_mac = 0;
+ u8 bvi_mac = 0;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
else if (unformat (i, "filter")) {
filter_mac = 1;
static_mac = 1;
+ } else if (unformat (i, "bvi")) {
+ bvi_mac = 1;
+ static_mac = 1;
} else if (unformat (i, "del"))
is_add = 0;
else
mp->sw_if_index = ntohl(sw_if_index);
mp->static_mac = static_mac;
mp->filter_mac = filter_mac;
+ mp->bvi_mac = bvi_mac;
}
S; W;
unformat_input_t * i = vam->input;
vl_api_ip_add_del_route_t *mp;
f64 timeout;
- u32 sw_if_index = 0, vrf_id = 0;
+ u32 sw_if_index = ~0, vrf_id = 0;
u8 sw_if_index_set = 0;
u8 is_ipv6 = 0;
u8 is_local = 0, is_drop = 0;
f64 timeout;
u32 sw_if_index;
u8 sw_if_index_set = 0;
- u8 surpress = 0;
+ u8 suppress = 0;
u8 managed = 0;
u8 other = 0;
u8 ll_option = 0;
;
else if (unformat (i, "interval %d", &initial_interval))
;
- else if (unformat (i, "surpress"))
- surpress = 1;
+ else if (unformat (i, "suppress") || unformat (i, "surpress"))
+ suppress = 1;
else if (unformat (i, "managed"))
managed = 1;
else if (unformat (i, "other"))
mp->lifetime = ntohl(lifetime);
mp->initial_count = ntohl(initial_count);
mp->initial_interval = ntohl(initial_interval);
- mp->surpress = surpress;
+ mp->suppress = suppress;
mp->managed = managed;
mp->other = other;
mp->ll_option = ll_option;
return 0;
}
+static int api_ipfix_enable (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_ipfix_enable_t *mp;
+ ip4_address_t collector_address;
+ u8 collector_address_set = 0;
+ u32 collector_port = ~0;
+ ip4_address_t src_address;
+ u8 src_address_set = 0;
+ u32 vrf_id = ~0;
+ u32 path_mtu = ~0;
+ u32 template_interval = ~0;
+ f64 timeout;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "collector_address %U", unformat_ip4_address,
+ &collector_address))
+ collector_address_set = 1;
+ else if (unformat (i, "collector_port %d", &collector_port))
+ ;
+ else if (unformat (i, "src_address %U", unformat_ip4_address,
+ &src_address))
+ src_address_set = 1;
+ else if (unformat (i, "vrf_id %d", &vrf_id))
+ ;
+ else if (unformat (i, "path_mtu %d", &path_mtu))
+ ;
+ else if (unformat (i, "template_interval %d", &template_interval))
+ ;
+ else
+ break;
+ }
+
+ if (collector_address_set == 0) {
+ errmsg ("collector_address required\n");
+ return -99;
+ }
+
+ if (src_address_set == 0) {
+ errmsg ("src_address required\n");
+ return -99;
+ }
+
+ M (IPFIX_ENABLE, ipfix_enable);
+
+ memcpy(mp->collector_address, collector_address.data,
+ sizeof(collector_address.data));
+ mp->collector_port = htons((u16)collector_port);
+ memcpy(mp->src_address, src_address.data,
+ sizeof(src_address.data));
+ mp->vrf_id = htonl(vrf_id);
+ mp->path_mtu = htonl(path_mtu);
+ mp->template_interval = htonl(template_interval);
+
+ S; W;
+ /* NOTREACHED */
+}
+
static int api_get_node_index (vat_main_t * vam)
{
unformat_input_t * i = vam->input;
u32 sw_if_index = ~0;
u8 sw_if_index_set = 0;
u8 sw_if_index_if_name_set = 0;
- u8 priority = ~0;
+ u32 priority = ~0;
u8 priority_set = 0;
- u8 weight = ~0;
+ u32 weight = ~0;
u8 weight_set = 0;
u8 is_add = 1;
u8 *locator_set_name = NULL;
u8 is_add = 1;
u8 eidv4_set = 0;
u8 eidv6_set = 0;
+ u8 eid_type = (u8)~0;
ip4_address_t eidv4;
ip6_address_t eidv6;
- u8 tmp_eid_lenght = ~0;
+ u8 mac[6] = {0};
+ u32 tmp_eid_lenght = ~0;
u8 eid_lenght = ~0;
u8 *locator_set_name = NULL;
u8 locator_set_name_set = 0;
&eidv4, &tmp_eid_lenght)) {
eid_lenght = tmp_eid_lenght;
eidv4_set = 1;
+ eid_type = 0; /* ipv4 type */
} else if (unformat(input, "eid %U/%d", unformat_ip6_address,
&eidv6, &tmp_eid_lenght)) {
eid_lenght = tmp_eid_lenght;
eidv6_set = 1;
+ eid_type = 1; /* ipv6 type */
+ } else if (unformat(input, "eid %U", unformat_ethernet_address, mac)) {
+ eid_type = 2; /* mac type */
} else if (unformat(input, "locator-set %s", &locator_set_name)) {
locator_set_name_set = 1;
} else
return -99;
}
+ if ((u8)~0 == eid_type) {
+ errmsg ("EID address not set!");
+ vec_free(locator_set_name);
+ return -99;
+ }
+
if (vec_len(locator_set_name) > 64) {
errmsg ("locator-set name too long\n");
vec_free(locator_set_name);
return -99;
}
- if (!eidv4_set && !eidv6_set) {
- errmsg ("eid addresses not set\n");
- vec_free(locator_set_name);
- return -99;
- }
-
if (eidv4_set && eid_lenght > 32) {
errmsg ("eid prefix to big\n");
vec_free(locator_set_name);
M(LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
mp->is_add = is_add;
- if (eidv6_set) {
- mp->is_ipv6 = 1;
- clib_memcpy(mp->ip_address, &eidv6, sizeof(eidv6));
- } else {
- mp->is_ipv6 = 0;
- clib_memcpy(mp->ip_address, &eidv4, sizeof(eidv4));
+ switch (eid_type) {
+ case 0: /* ipv4 */
+ clib_memcpy (mp->eid, &eidv4, sizeof(eidv4));
+ break;
+ case 1: /* ipv6 */
+ clib_memcpy (mp->eid, &eidv6, sizeof(eidv6));
+ break;
+ case 2: /* mac */
+ clib_memcpy (mp->eid, mac, 6);
+ break;
}
+ mp->eid_type = eid_type;
mp->prefix_len = eid_lenght;
mp->vni = clib_host_to_net_u32(vni);
clib_memcpy(mp->locator_set_name, locator_set_name,
u8 eidv6_set = 0, slocv6_set = 0, dlocv6_set = 0;
ip4_address_t eidv4, slocv4, dlocv4;
ip6_address_t eidv6, slocv6, dlocv6;
- u8 tmp_eid_lenght = ~0;
+ u32 tmp_eid_lenght = ~0;
u8 eid_lenght = ~0;
/* Parse args required to build the message */
typedef CLIB_PACKED(struct
{
u8 is_ip4; /**< is locator an IPv4 address? */
+ u8 priority; /**< locator priority */
+ u8 weight; /**< locator weight */
u8 addr[16]; /**< IPv4/IPv6 address */
}) rloc_t;
}
/**
- * Add/del remote mapping from LISP control plane and updates
- * forwarding entries in data-plane accordingly.
+ * Add/del remote mapping to/from LISP control plane
*
* @param vam vpp API test context
* @return return code
vl_api_lisp_add_del_remote_mapping_t *mp;
f64 timeout = ~0;
u32 vni = 0;
- u8 seid_set = 0, deid_set = 0;
ip4_address_t seid4, deid4, rloc4;
ip6_address_t seid6, deid6, rloc6;
+ u8 deid_mac[6] = {0};
+ u8 seid_mac[6] = {0};
+ u8 deid_type, seid_type;
u32 seid_len = 0, deid_len = 0, len;
- u8 deid_is_ip4 = 0, seid_is_ip4 = 0;
u8 is_add = 1, del_all = 0;
- u32 action = ~0;
- rloc_t * rlocs = 0, rloc;
+ u32 action = ~0, p, w;
+ rloc_t * rlocs = 0, rloc, * curr_rloc = 0;
+
+ seid_type = deid_type = (u8)~0;
/* Parse args required to build the message */
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
is_add = 1;
} else if (unformat(input, "deid %U/%d", unformat_ip4_address,
&deid4, &len)) {
- deid_set = 1;
- deid_is_ip4 = 1;
+ deid_type = 0; /* ipv4 */
deid_len = len;
} else if (unformat(input, "deid %U/%d", unformat_ip6_address,
&deid6, &len)) {
- deid_set = 1;
- deid_is_ip4 = 0;
+ deid_type = 1; /* ipv6 */
deid_len = len;
+ } else if (unformat(input, "deid %U", unformat_ethernet_address,
+ deid_mac)) {
+ deid_type = 2; /* mac */
} else if (unformat(input, "seid %U/%d", unformat_ip4_address,
&seid4, &len)) {
- seid_set = 1;
- seid_is_ip4 = 1;
+ seid_type = 0; /* ipv4 */
seid_len = len;
} else if (unformat(input, "seid %U/%d", unformat_ip6_address,
&seid6, &len)) {
- seid_set = 1;
- seid_is_ip4 = 0;
+ seid_type = 1; /* ipv6 */
seid_len = len;
+ } else if (unformat(input, "seid %U", unformat_ethernet_address,
+ seid_mac)) {
+ seid_type = 2; /* mac */
} else if (unformat(input, "vni %d", &vni)) {
;
+ } else if (unformat(input, "p %d w %d", &p, &w)) {
+ if (!curr_rloc) {
+ errmsg ("No RLOC configured for setting priority/weight!");
+ return -99;
+ }
+ curr_rloc->priority = p;
+ curr_rloc->weight = w;
} else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
rloc.is_ip4 = 1;
clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
vec_add1 (rlocs, rloc);
+ curr_rloc = &rlocs[vec_len (rlocs) - 1];
} else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
rloc.is_ip4 = 0;
clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
vec_add1 (rlocs, rloc);
+ curr_rloc = &rlocs[vec_len (rlocs) - 1];
} else if (unformat(input, "action %d", &action)) {
;
} else {
}
}
- if (!seid_set || !deid_set) {
+ if ((u8)~0 == deid_type) {
errmsg ("missing params!");
return -99;
}
- if (seid_is_ip4 != deid_is_ip4) {
- errmsg ("source and destination EIDs are not in " "same IP family!");
+ if (seid_type != deid_type) {
+ errmsg ("source and destination EIDs are of different types!");
return -99;
}
mp->action = (u8) action;
mp->deid_len = deid_len;
mp->del_all = del_all;
- if (seid_is_ip4) {
- mp->eid_is_ip4 = 1;
+ mp->eid_type = deid_type;
+
+ switch (mp->eid_type) {
+ case 0:
clib_memcpy (mp->seid, &seid4, sizeof (seid4));
- } else {
- mp->eid_is_ip4 = 0;
+ clib_memcpy (mp->deid, &deid4, sizeof (deid4));
+ break;
+ case 1:
clib_memcpy (mp->seid, &seid6, sizeof (seid6));
+ clib_memcpy (mp->deid, &deid6, sizeof (deid6));
+ break;
+ case 2:
+ clib_memcpy (mp->seid, seid_mac, 6);
+ clib_memcpy (mp->deid, deid_mac, 6);
+ break;
+ default:
+ errmsg ("unknown EID type %d!", mp->eid_type);
+ return 0;
}
- if (deid_is_ip4) {
- mp->eid_is_ip4 = 1;
+ mp->rloc_num = vec_len (rlocs);
+ clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
+ vec_free (rlocs);
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+
+ /* NOTREACHED */
+ return 0;
+}
+
+/**
+ * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
+ * forwarding entries in data-plane accordingly.
+ *
+ * @param vam vpp API test context
+ * @return return code
+ */
+static int
+api_lisp_add_del_adjacency (vat_main_t * vam)
+{
+ unformat_input_t * input = vam->input;
+ vl_api_lisp_add_del_adjacency_t *mp;
+ f64 timeout = ~0;
+ u32 vni = 0;
+ ip4_address_t seid4, deid4, rloc4;
+ ip6_address_t seid6, deid6, rloc6;
+ u8 deid_mac[6] = {0};
+ u8 seid_mac[6] = {0};
+ u8 deid_type, seid_type;
+ u32 seid_len = 0, deid_len = 0, len;
+ u8 is_add = 1;
+ u32 action = ~0, p, w;
+ rloc_t * rlocs = 0, rloc, * curr_rloc = 0;
+
+ seid_type = deid_type = (u8)~0;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+ if (unformat(input, "del")) {
+ is_add = 0;
+ } else if (unformat(input, "add")) {
+ is_add = 1;
+ } else if (unformat(input, "deid %U/%d", unformat_ip4_address,
+ &deid4, &len)) {
+ deid_type = 0; /* ipv4 */
+ deid_len = len;
+ } else if (unformat(input, "deid %U/%d", unformat_ip6_address,
+ &deid6, &len)) {
+ deid_type = 1; /* ipv6 */
+ deid_len = len;
+ } else if (unformat(input, "deid %U", unformat_ethernet_address,
+ deid_mac)) {
+ deid_type = 2; /* mac */
+ } else if (unformat(input, "seid %U/%d", unformat_ip4_address,
+ &seid4, &len)) {
+ seid_type = 0; /* ipv4 */
+ seid_len = len;
+ } else if (unformat(input, "seid %U/%d", unformat_ip6_address,
+ &seid6, &len)) {
+ seid_type = 1; /* ipv6 */
+ seid_len = len;
+ } else if (unformat(input, "seid %U", unformat_ethernet_address,
+ seid_mac)) {
+ seid_type = 2; /* mac */
+ } else if (unformat(input, "vni %d", &vni)) {
+ ;
+ } else if (unformat(input, "p %d w %d", &p, &w)) {
+ if (!curr_rloc) {
+ errmsg ("No RLOC configured for setting priority/weight!");
+ return -99;
+ }
+ curr_rloc->priority = p;
+ curr_rloc->weight = w;
+ } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
+ rloc.is_ip4 = 1;
+ clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
+ vec_add1 (rlocs, rloc);
+ curr_rloc = &rlocs[vec_len (rlocs) - 1];
+ } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
+ rloc.is_ip4 = 0;
+ clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
+ vec_add1 (rlocs, rloc);
+ curr_rloc = &rlocs[vec_len (rlocs) - 1];
+ } else if (unformat(input, "action %d", &action)) {
+ ;
+ } else {
+ errmsg ("parse error '%U'", format_unformat_error, input);
+ return -99;
+ }
+ }
+
+ if ((u8)~0 == deid_type) {
+ errmsg ("missing params!");
+ return -99;
+ }
+
+ if (seid_type != deid_type) {
+ errmsg ("source and destination EIDs are of different types!");
+ return -99;
+ }
+
+ if (is_add && (~0 == action)
+ && 0 == vec_len (rlocs)) {
+ errmsg ("no action set for negative map-reply!");
+ return -99;
+ }
+
+ M(LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
+ mp->is_add = is_add;
+ mp->vni = htonl (vni);
+ mp->seid_len = seid_len;
+ mp->action = (u8) action;
+ mp->deid_len = deid_len;
+ mp->eid_type = deid_type;
+
+ switch (mp->eid_type) {
+ case 0:
+ clib_memcpy (mp->seid, &seid4, sizeof (seid4));
clib_memcpy (mp->deid, &deid4, sizeof (deid4));
- } else {
- mp->eid_is_ip4 = 0;
+ break;
+ case 1:
+ clib_memcpy (mp->seid, &seid6, sizeof (seid6));
clib_memcpy (mp->deid, &deid6, sizeof (deid6));
+ break;
+ case 2:
+ clib_memcpy (mp->seid, seid_mac, 6);
+ clib_memcpy (mp->deid, deid_mac, 6);
+ break;
+ default:
+ errmsg ("unknown EID type %d!", mp->eid_type);
+ return 0;
}
mp->rloc_num = vec_len (rlocs);
static int
api_lisp_local_eid_table_dump(vat_main_t *vam)
{
+ unformat_input_t * i = vam->input;
vl_api_lisp_local_eid_table_dump_t *mp;
f64 timeout = ~0;
+ struct in_addr ip4;
+ struct in6_addr ip6;
+ u8 mac[6];
+ u8 eid_type = ~0, eid_set;
+ u32 prefix_length = ~0, t, vni = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t)) {
+ eid_set = 1;
+ eid_type = 0;
+ prefix_length = t;
+ } else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t)) {
+ eid_set = 1;
+ eid_type = 1;
+ prefix_length = t;
+ } else if (unformat (i, "eid %U", unformat_ethernet_address, mac)) {
+ eid_set = 1;
+ eid_type = 2;
+ } else if (unformat (i, "vni %d", &t))
+ vni = t;
+ else {
+ errmsg ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
if (!vam->json_output) {
fformat(vam->ofp, "%=20s%=30s\n",
}
M(LISP_LOCAL_EID_TABLE_DUMP, lisp_local_eid_table_dump);
+
+ if (eid_set) {
+ mp->eid_set = 1;
+ mp->vni = htonl (vni);
+ mp->eid_type = eid_type;
+ switch (eid_type) {
+ case 0:
+ mp->prefix_length = prefix_length;
+ clib_memcpy (mp->eid, &ip4, sizeof (ip4));
+ break;
+ case 1:
+ mp->prefix_length = prefix_length;
+ clib_memcpy (mp->eid, &ip6, sizeof (ip6));
+ break;
+ case 2:
+ clib_memcpy (mp->eid, mac, sizeof (mac));
+ break;
+ default:
+ errmsg ("unknown EID type %d!", eid_type);
+ return -99;
+ }
+ }
+
/* send it... */
S;
return 0;
}
+static void vl_api_ipfix_details_t_handler (vl_api_ipfix_details_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+
+ fformat(vam->ofp, "collector_address %U, collector_port %d, "
+ "src_address %U, fib_index %u, path_mtu %u, "
+ "template_interval %u\n",
+ format_ip4_address, mp->collector_address,
+ ntohs(mp->collector_port),
+ format_ip4_address, mp->src_address,
+ ntohl(mp->fib_index),
+ ntohl(mp->path_mtu),
+ ntohl(mp->template_interval));
+
+ vam->retval = 0;
+ vam->result_ready = 1;
+}
+
+static void vl_api_ipfix_details_t_handler_json
+(vl_api_ipfix_details_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+ vat_json_node_t node;
+ struct in_addr collector_address;
+ struct in_addr src_address;
+
+ vat_json_init_object(&node);
+ clib_memcpy(&collector_address, &mp->collector_address,
+ sizeof(collector_address));
+ vat_json_object_add_ip4(&node, "collector_address", collector_address);
+ vat_json_object_add_uint(&node, "collector_port",
+ ntohs(mp->collector_port));
+ clib_memcpy(&src_address, &mp->src_address, sizeof(src_address));
+ vat_json_object_add_ip4(&node, "src_address", src_address);
+ vat_json_object_add_uint(&node, "fib_index", ntohl(mp->fib_index));
+ vat_json_object_add_uint(&node, "path_mtu", ntohl(mp->path_mtu));
+ vat_json_object_add_uint(&node, "template_interval",
+ ntohl(mp->template_interval));
+
+ vat_json_print(vam->ofp, &node);
+ vat_json_free(&node);
+ vam->retval = 0;
+ vam->result_ready = 1;
+}
+
+int api_ipfix_dump (vat_main_t *vam)
+{
+ vl_api_ipfix_dump_t *mp;
+ f64 timeout;
+
+ /* Construct the API message */
+ M(IPFIX_DUMP, ipfix_dump);
+ mp->context = 0;
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
static int q_or_quit (vat_main_t * vam)
{
longjmp (vam->jump_buf, 1);
"[nolink] [isno]") \
_(sw_interface_ip6nd_ra_config, \
"<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
- "[life <n>] [count <n>] [interval <n>] [surpress]\n" \
+ "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
"[managed] [other] [ll] [send] [cease] [isno] [def]") \
_(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
_(l2_patch_add_del, \
_(lisp_gpe_enable_disable, "enable|disable") \
_(lisp_enable_disable, "enable|disable") \
_(lisp_gpe_add_del_iface, "up|down") \
-_(lisp_add_del_remote_mapping, "add|del vni <vni> table-id <id> " \
- "deid <dest-eid> seid" \
- " <src-eid> rloc <locator> " \
- "[rloc <loc> ... ]") \
+_(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> seid" \
+ " <src-eid> rloc <locator> p <prio> " \
+ "w <weight> [rloc <loc> ... ] " \
+ "action <action>") \
+_(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \
+ "<src-eid> rloc <locator> p <prio> w <weight>"\
+ "[rloc <loc> ... ] action <action>") \
_(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
_(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
_(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
_(classify_table_ids, "") \
_(classify_table_by_interface, "sw_if_index <sw_if_index>") \
_(classify_table_info, "table_id <nn>") \
-_(classify_session_dump, "table_id <nn>")
+_(classify_session_dump, "table_id <nn>") \
+_(ipfix_enable, "collector_address <ip4> [collector_port <nn>] " \
+ "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] " \
+ "[template_interval <nn>]") \
+_(ipfix_dump, "")
/* List of command functions, CLI names map directly to functions */
#define foreach_cli_function \