Add locator prority and weight to LISP API
[vpp.git] / vpp-api-test / vat / api_format.c
index 6b5271d..5e2b327 100644 (file)
@@ -2651,7 +2651,8 @@ _(vxlan_gpe_add_del_tunnel_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          \
@@ -2852,7 +2853,9 @@ _(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details)                       \
 _(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 */
 
@@ -4269,7 +4272,7 @@ static int api_ip_add_del_route (vat_main_t * vam)
     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;
@@ -7362,6 +7365,64 @@ static int api_classify_set_interface_l2_tables (vat_main_t * vam)
     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;
@@ -10472,6 +10533,8 @@ api_lisp_enable_disable (vat_main_t * vam)
 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;
 
@@ -10594,8 +10657,8 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
     u8 deid_type, seid_type;
     u32 seid_len = 0, deid_len = 0, len;
     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;
 
@@ -10631,14 +10694,23 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam)
             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 {
@@ -10725,10 +10797,9 @@ api_lisp_add_del_adjacency (vat_main_t * vam)
     u8 deid_type, seid_type;
     u32 seid_len = 0, deid_len = 0, len;
     u8 is_add = 1;
-    u32 action = ~0;
-    rloc_t * rlocs = 0, rloc;
+    u32 action = ~0, p, w;
+    rloc_t * rlocs = 0, rloc, * curr_rloc = 0;
 
-    memset(mp, 0, sizeof(mp[0]));
     seid_type = deid_type =  (u8)~0;
 
     /* Parse args required to build the message */
@@ -10761,18 +10832,27 @@ api_lisp_add_del_adjacency (vat_main_t * vam)
             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 {
-            clib_warning ("parse error '%U'", format_unformat_error, input);
+            errmsg ("parse error '%U'", format_unformat_error, input);
             return -99;
         }
     }
@@ -11831,6 +11911,65 @@ int api_classify_session_dump (vat_main_t *vam)
     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);
@@ -12309,11 +12448,12 @@ _(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> deid <dest-eid> seid" \
-                               " <src-eid> rloc <locator> "             \
-                               "[rloc <loc> ... ] action <action>")     \
-_(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid"      \
-                              " <src-eid> rloc <locator> "              \
-                              "[rloc <loc> ... ] action <action>")      \
+                               " <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>")              \
@@ -12337,7 +12477,11 @@ _(mpls_fib_decap_dump, "")                                              \
 _(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                                    \