Put address in top bytes for the nexthop in vl_api_fib_path_t (VPP-532) 59/3859/2
authorSteven <sluong@cisco.com>
Wed, 16 Nov 2016 21:26:27 +0000 (13:26 -0800)
committerNeale Ranns <nranns@cisco.com>
Thu, 17 Nov 2016 14:46:26 +0000 (14:46 +0000)
VPP-500 added the API for the fib dump capability. However, it puts the address of the
nexthop in the low bytes while the top bytes are padded with 0's if the address is ipv4.
The address field is defined as 16 bytes to accommodate both ipv4 and ipv6.
This fix is to correct the issue and put the address of the nexthop in the top bytes.

Change-Id: I429dec662e32040b186dfc323801ef49b76a42a3
Signed-off-by: Steven <sluong@cisco.com>
vpp-api-test/vat/api_format.c
vpp/vpp-api/api.c

index b32c159..c170147 100644 (file)
@@ -14896,12 +14896,20 @@ vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
   fp = mp->path;
   for (i = 0; i < count; i++)
     {
-      fformat (vam->ofp,
-              "  weight %d, sw_if_index %d, is_local %d, is_drop %d, is_unreach %d, "
-              "is_prohitbit %d, afi %d, next_hop %U\n", ntohl (fp->weight),
-              ntohl (fp->sw_if_index), fp->is_local, fp->is_drop,
-              fp->is_unreach, fp->is_prohibit, fp->afi, format_ip46_address,
-              fp->next_hop, fp->afi);
+      if (fp->afi == IP46_TYPE_IP6)
+       fformat (vam->ofp,
+                "  weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+                "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+                ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+                fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+                format_ip6_address, fp->next_hop);
+      else if (fp->afi == IP46_TYPE_IP4)
+       fformat (vam->ofp,
+                "  weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+                "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+                ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+                fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+                format_ip4_address, fp->next_hop);
       fp++;
     }
 }
@@ -14988,12 +14996,20 @@ vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
   fp = mp->path;
   for (i = 0; i < count; i++)
     {
-      fformat (vam->ofp,
-              "  weight %d, sw_if_index %d, is_local %d, is_drop %d, is_unreach %d, "
-              "is_prohitbit %d, afi %d, next_hop %U\n", ntohl (fp->weight),
-              ntohl (fp->sw_if_index), fp->is_local, fp->is_drop,
-              fp->is_unreach, fp->is_prohibit, fp->afi, format_ip46_address,
-              fp->next_hop, fp->afi);
+      if (fp->afi == IP46_TYPE_IP6)
+       fformat (vam->ofp,
+                "  weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+                "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+                ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+                fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+                format_ip6_address, fp->next_hop);
+      else if (fp->afi == IP46_TYPE_IP4)
+       fformat (vam->ofp,
+                "  weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+                "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+                ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+                fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+                format_ip4_address, fp->next_hop);
       fp++;
     }
 }
@@ -15081,12 +15097,20 @@ vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
   fp = mp->path;
   for (i = 0; i < count; i++)
     {
-      fformat (vam->ofp,
-              "  weight %d, sw_if_index %d, is_local %d, is_drop %d, is_unreach %d, "
-              "is_prohitbit %d, afi %d, next_hop %U\n", ntohl (fp->weight),
-              ntohl (fp->sw_if_index), fp->is_local, fp->is_drop,
-              fp->is_unreach, fp->is_prohibit, fp->afi, format_ip46_address,
-              fp->next_hop, fp->afi);
+      if (fp->afi == IP46_TYPE_IP6)
+       fformat (vam->ofp,
+                "  weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+                "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+                ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+                fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+                format_ip6_address, fp->next_hop);
+      else if (fp->afi == IP46_TYPE_IP4)
+       fformat (vam->ofp,
+                "  weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+                "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+                ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+                fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+                format_ip4_address, fp->next_hop);
       fp++;
     }
 }
index b297576..e234df8 100644 (file)
@@ -7605,6 +7605,33 @@ vl_api_mpls_fib_details_t_print (vl_api_mpls_fib_details_t * mp)
   clib_warning ("BUG");
 }
 
+
+static void
+copy_fib_next_hop (fib_route_path_encode_t * api_rpath,
+                  vl_api_fib_path_t * fp)
+{
+  int is_ip4;
+
+  if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4)
+    fp->afi = IP46_TYPE_IP4;
+  else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6)
+    fp->afi = IP46_TYPE_IP6;
+  else
+    {
+      is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr);
+      if (is_ip4)
+       fp->afi = IP46_TYPE_IP4;
+      else
+       fp->afi = IP46_TYPE_IP6;
+    }
+  if (fp->afi == IP46_TYPE_IP4)
+    memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip4,
+           sizeof (api_rpath->rpath.frp_addr.ip4));
+  else
+    memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip6,
+           sizeof (api_rpath->rpath.frp_addr.ip6));
+}
+
 static void
 send_mpls_fib_details (vpe_api_main_t * am,
                       unix_shared_memory_queue_t * q,
@@ -7614,7 +7641,7 @@ send_mpls_fib_details (vpe_api_main_t * am,
   vl_api_mpls_fib_details_t *mp;
   fib_route_path_encode_t *api_rpath;
   vl_api_fib_path_t *fp;
-  int is_ip4, path_count;
+  int path_count;
 
   path_count = vec_len (api_rpaths);
   mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
@@ -7635,19 +7662,7 @@ send_mpls_fib_details (vpe_api_main_t * am,
     memset (fp, 0, sizeof (*fp));
     fp->weight = htonl (api_rpath->rpath.frp_weight);
     fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
-    memcpy (fp->next_hop, &api_rpath->rpath.frp_addr, sizeof (fp->next_hop));
-    if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4)
-      fp->afi = IP46_TYPE_IP4;
-    else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6)
-      fp->afi = IP46_TYPE_IP6;
-    else
-      {
-       is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr);
-       if (is_ip4)
-         fp->afi = IP46_TYPE_IP4;
-       else
-         fp->afi = IP46_TYPE_IP6;
-      }
+    copy_fib_next_hop (api_rpath, fp);
     fp++;
   }
 
@@ -7727,7 +7742,7 @@ send_ip_fib_details (vpe_api_main_t * am,
   vl_api_ip_fib_details_t *mp;
   fib_route_path_encode_t *api_rpath;
   vl_api_fib_path_t *fp;
-  int is_ip4, path_count;
+  int path_count;
 
   path_count = vec_len(api_rpaths);
   mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
@@ -7775,19 +7790,7 @@ send_ip_fib_details (vpe_api_main_t * am,
       }
     fp->weight = htonl(api_rpath->rpath.frp_weight);
     fp->sw_if_index = htonl(api_rpath->rpath.frp_sw_if_index);
-    memcpy(fp->next_hop, &api_rpath->rpath.frp_addr, sizeof(fp->next_hop));
-    if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4)
-       fp->afi = IP46_TYPE_IP4;
-    else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6)
-       fp->afi = IP46_TYPE_IP6;
-    else
-      {
-       is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr);
-       if (is_ip4)
-           fp->afi = IP46_TYPE_IP4;
-       else
-           fp->afi = IP46_TYPE_IP6;
-      }
+    copy_fib_next_hop (api_rpath, fp);
     fp++;
   }
 
@@ -7871,7 +7874,7 @@ send_ip6_fib_details (vpe_api_main_t * am,
   vl_api_ip6_fib_details_t *mp;
   fib_route_path_encode_t *api_rpath;
   vl_api_fib_path_t *fp;
-  int is_ip4, path_count;
+  int path_count;
 
   path_count = vec_len(api_rpaths);
   mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp));
@@ -7919,19 +7922,7 @@ send_ip6_fib_details (vpe_api_main_t * am,
       }
     fp->weight = htonl(api_rpath->rpath.frp_weight);
     fp->sw_if_index = htonl(api_rpath->rpath.frp_sw_if_index);
-    memcpy(fp->next_hop, &api_rpath->rpath.frp_addr, sizeof(fp->next_hop));
-    if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4)
-      fp->afi = IP46_TYPE_IP4;
-    else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6)
-      fp->afi = IP46_TYPE_IP6;
-    else
-      {
-       is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr);
-       if (is_ip4)
-         fp->afi = IP46_TYPE_IP4;
-       else
-         fp->afi = IP46_TYPE_IP6;
-      }
+    copy_fib_next_hop (api_rpath, fp);
     fp++;
   }