api: remove transport specific code from handlers
[vpp.git] / src / vnet / bier / bier_api.c
index aacee09..840c33b 100644 (file)
@@ -83,7 +83,17 @@ vl_api_bier_table_add_del_t_handler (vl_api_bier_table_add_del_t * mp)
 
     if (mp->bt_is_add)
     {
-        bier_table_add_or_lock(&bti, ntohl(mp->bt_label));
+        mpls_label_t label = ntohl(mp->bt_label);
+
+        /*
+         * convert acceptable 'don't want a label' values from 
+         * the API to the correct internal INVLID value
+         */
+        if ((0 == label) || (~0 == label))
+        {
+            label = MPLS_LABEL_INVALID;
+        }
+        bier_table_add_or_lock(&bti, label);
     }
     else
     {
@@ -96,7 +106,7 @@ vl_api_bier_table_add_del_t_handler (vl_api_bier_table_add_del_t * mp)
 }
 
 static void
-send_bier_table_details (unix_shared_memory_queue_t * q,
+send_bier_table_details (vl_api_registration_t * reg,
                          u32 context,
                          const bier_table_t *bt)
 {
@@ -114,18 +124,18 @@ send_bier_table_details (unix_shared_memory_queue_t * q,
     mp->bt_tbl_id.bt_sub_domain = bt->bt_id.bti_sub_domain;
     mp->bt_tbl_id.bt_hdr_len_id = bt->bt_id.bti_hdr_len;
 
-    vl_msg_api_send_shmem (q, (u8 *) & mp);
+    vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp)
 {
-    unix_shared_memory_queue_t *q;
+    vl_api_registration_t *reg;
     bier_table_t *bt;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     pool_foreach(bt, bier_table_pool,
     ({
@@ -134,7 +144,7 @@ vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp)
          */
         if (bier_table_is_main(bt))
         {
-            send_bier_table_details(q, mp->context, bt);
+            send_bier_table_details(reg, mp->context, bt);
         }
     }));
 }
@@ -152,10 +162,10 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
     vnm = vnet_get_main ();
     vnm->api_errno = 0;
 
-    bp = ntohs(mp->br_bp);
+    bp = ntohl(mp->br_bp);
     brpaths = NULL;
 
-    if (0 == bp || bp > 0xffff)
+    if (0 == bp || bp > BIER_BP_MAX)
     {
         rv = -1;
         goto done;
@@ -175,51 +185,62 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
     {
         brpath = &brpaths[ii];
         memset(brpath, 0, sizeof(*brpath));
-        brpath->frp_flags = FIB_ROUTE_PATH_BIER_FMASK;
+        brpath->frp_sw_if_index = ~0;
 
         vec_validate(brpath->frp_label_stack,
-                     mp->br_paths[ii].n_labels);
+                     mp->br_paths[ii].n_labels - 1);
         for (jj = 0; jj < mp->br_paths[ii].n_labels; jj++)
         {
             brpath->frp_label_stack[jj] =
                 ntohl(mp->br_paths[ii].label_stack[jj]);
         }
 
-        if (0 == mp->br_paths[ii].afi)
+        if (mp->br_paths[ii].is_udp_encap)
         {
-            clib_memcpy (&brpath->frp_addr.ip4,
-                         mp->br_paths[ii].next_hop,
-                         sizeof (brpath->frp_addr.ip4));
+            brpath->frp_flags |= FIB_ROUTE_PATH_UDP_ENCAP;
+            brpath->frp_udp_encap_id = ntohl(mp->br_paths[ii].next_hop_id);
         }
         else
         {
-            clib_memcpy (&brpath->frp_addr.ip6,
-                         mp->br_paths[ii].next_hop,
-                         sizeof (brpath->frp_addr.ip6));
-        }
-        if (ip46_address_is_zero(&brpath->frp_addr))
-        {
-            index_t bdti;
-
-            bdti = bier_disp_table_find(ntohl(mp->br_paths[ii].table_id));
-
-            if (INDEX_INVALID != bdti)
-                brpath->frp_fib_index = bdti;
+            if (0 == mp->br_paths[ii].afi)
+            {
+                clib_memcpy (&brpath->frp_addr.ip4,
+                             mp->br_paths[ii].next_hop,
+                             sizeof (brpath->frp_addr.ip4));
+            }
             else
             {
-                rv = VNET_API_ERROR_NO_SUCH_FIB;
-                goto done;
+                clib_memcpy (&brpath->frp_addr.ip6,
+                             mp->br_paths[ii].next_hop,
+                             sizeof (brpath->frp_addr.ip6));
+            }
+            if (ip46_address_is_zero(&brpath->frp_addr))
+            {
+                index_t bdti;
+
+                bdti = bier_disp_table_find(ntohl(mp->br_paths[ii].table_id));
+
+                if (INDEX_INVALID != bdti)
+                {
+                    brpath->frp_fib_index = bdti;
+                    brpath->frp_proto = DPO_PROTO_BIER;
+                }
+                else
+                {
+                    rv = VNET_API_ERROR_NO_SUCH_FIB;
+                    goto done;
+                }
             }
         }
     }
 
     if (mp->br_is_add)
     {
-        bier_table_route_add(&bti, ntohs(mp->br_bp), brpaths);
+        bier_table_route_add(&bti, bp, brpaths);
     }
     else
     {
-        bier_table_route_remove(&bti, ntohs(mp->br_bp), brpaths);
+        bier_table_route_remove(&bti, bp, brpaths);
     }
 
 done:
@@ -231,7 +252,7 @@ done:
 
 typedef struct bier_route_details_walk_t_
 {
-    unix_shared_memory_queue_t * q;
+    vl_api_registration_t * reg;
     u32 context;
 } bier_route_details_walk_t;
 
@@ -275,17 +296,17 @@ send_bier_route_details (const bier_table_t *bt,
         fp++;
     }
 
-    vl_msg_api_send_shmem (ctx->q, (u8 *) & mp);
+    vl_api_send_msg (ctx->reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_route_dump_t_handler (vl_api_bier_route_dump_t * mp)
 {
-    unix_shared_memory_queue_t *q;
+    vl_api_registration_t *reg;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     bier_table_id_t bti = {
         .bti_set = mp->br_tbl_id.bt_set,
@@ -295,7 +316,7 @@ vl_api_bier_route_dump_t_handler (vl_api_bier_route_dump_t * mp)
         .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
     };
     bier_route_details_walk_t ctx = {
-        .q = q,
+        .reg = reg,
         .context = mp->context,
     };
     bier_table_walk(&bti, send_bier_route_details, &ctx);
@@ -329,7 +350,7 @@ vl_api_bier_imp_add_t_handler (vl_api_bier_imp_add_t * mp)
     /* *INDENT-OFF* */
     REPLY_MACRO2 (VL_API_BIER_IMP_ADD_REPLY,
     ({
-        rmp->bi_index = bii;
+        rmp->bi_index = ntohl (bii);
     }));
     /* *INDENT-OM* */
 }
@@ -350,7 +371,7 @@ vl_api_bier_imp_del_t_handler (vl_api_bier_imp_del_t * mp)
 }
 
 static void
-send_bier_imp_details (unix_shared_memory_queue_t * q,
+send_bier_imp_details (vl_api_registration_t * reg,
                        u32 context,
                        const bier_imp_t *bi)
 {
@@ -379,22 +400,22 @@ send_bier_imp_details (unix_shared_memory_queue_t * q,
     mp->bi_n_bytes = n_bytes;
     memcpy(mp->bi_bytes, bi->bi_bits.bits, n_bytes);
 
-    vl_msg_api_send_shmem (q, (u8 *) & mp);
+    vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_imp_dump_t_handler (vl_api_bier_imp_dump_t * mp)
 {
-    unix_shared_memory_queue_t *q;
+    vl_api_registration_t *reg;
     bier_imp_t *bi;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     pool_foreach(bi, bier_imp_pool,
     ({
-        send_bier_imp_details(q, mp->context, bi);
+        send_bier_imp_details(reg, mp->context, bi);
     }));
 }
 
@@ -425,7 +446,7 @@ vl_api_bier_disp_table_add_del_t_handler (vl_api_bier_disp_table_add_del_t * mp)
 }
 
 static void
-send_bier_disp_table_details (unix_shared_memory_queue_t * q,
+send_bier_disp_table_details (vl_api_registration_t * reg,
                               u32 context,
                               const bier_disp_table_t *bdt)
 {
@@ -440,22 +461,22 @@ send_bier_disp_table_details (unix_shared_memory_queue_t * q,
 
     mp->bdt_tbl_id = htonl(bdt->bdt_table_id);
 
-    vl_msg_api_send_shmem (q, (u8 *) & mp);
+    vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_disp_table_dump_t_handler (vl_api_bier_disp_table_dump_t * mp)
 {
-    unix_shared_memory_queue_t *q;
+    vl_api_registration_t *reg;
     bier_disp_table_t *bdt;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     pool_foreach(bdt, bier_disp_table_pool,
     ({
-        send_bier_disp_table_details(q, mp->context, bdt);
+        send_bier_disp_table_details(reg, mp->context, bdt);
     }));
 }
 
@@ -475,7 +496,10 @@ vl_api_bier_disp_entry_add_del_t_handler (vl_api_bier_disp_entry_add_del_t * mp)
     table_id = ntohl(mp->bde_tbl_id);
     bp = ntohs(mp->bde_bp);
 
-    if (0 == bp || bp > 0xffff)
+    /*
+     * BP=0 is the default route
+     */
+    if (bp > 0xffff)
     {
         rv = -1;
         goto done;
@@ -579,7 +603,7 @@ done:
 
 typedef struct bier_disp_entry_details_walk_t_
 {
-    unix_shared_memory_queue_t * q;
+    vl_api_registration_t * reg;
     u32 context;
 } bier_disp_entry_details_walk_t;
 
@@ -629,7 +653,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
                 fp++;
             }
 
-            vl_msg_api_send_shmem (ctx->q, (u8 *) & mp);
+            vl_api_send_msg (ctx->reg, (u8 *) mp);
         }
     }
 }
@@ -637,14 +661,14 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
 static void
 vl_api_bier_disp_entry_dump_t_handler (vl_api_bier_disp_entry_dump_t * mp)
 {
-    unix_shared_memory_queue_t *q;
+    vl_api_registration_t *reg;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     bier_disp_entry_details_walk_t ctx = {
-        .q = q,
+        .reg = reg,
         .context = mp->context,
     };
     bier_disp_table_walk(ntohl(mp->bde_tbl_id),