]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_updgrp_packet.c
bgpd: Print the correct table in "show ip bgp x.x.x.x"
[mirror_frr.git] / bgpd / bgp_updgrp_packet.c
index 979a823f17744479a182a1bbb60f2dcad28becbb..3cb3ddcdea256061eb420079fdd1a2e8f4e9f5be 100644 (file)
@@ -600,6 +600,14 @@ subgroup_packets_to_build (struct update_subgroup *subgrp)
   return 0;
 }
 
+static void
+bgp_info_addpath_tx_str (int addpath_encode, u_int32_t addpath_tx_id,
+                         char *buf)
+{
+  if (addpath_encode)
+    sprintf(buf, " with addpath ID %d", addpath_tx_id);
+}
+
 /* Make BGP update packet.  */
 struct bpacket *
 subgroup_update_packet (struct update_subgroup *subgrp)
@@ -625,7 +633,8 @@ subgroup_update_packet (struct update_subgroup *subgrp)
   char send_attr_str[BUFSIZ];
   int send_attr_printed = 0;
   int num_pfx = 0;
-
+  int addpath_encode = 0;
+  u_int32_t addpath_tx_id = 0;
 
   if (!subgrp)
     return NULL;
@@ -644,18 +653,21 @@ subgroup_update_packet (struct update_subgroup *subgrp)
 
   bpacket_attr_vec_arr_reset (&vecarr);
 
+  addpath_encode = bgp_addpath_encode_tx (peer, afi, safi);
+
   adv = BGP_ADV_FIFO_HEAD (&subgrp->sync->update);
   while (adv)
     {
       assert (adv->rn);
       rn = adv->rn;
       adj = adv->adj;
-      if (adv->binfo)
-       binfo = adv->binfo;
+      addpath_tx_id = adj->addpath_tx_id;
+      binfo = adv->binfo;
 
       space_remaining = STREAM_CONCAT_REMAIN (s, snlri, STREAM_SIZE(s)) -
                         BGP_MAX_PACKET_SIZE_OVERFLOW;
-      space_needed = BGP_NLRI_LENGTH + PSIZE (rn->p.prefixlen);
+      space_needed = BGP_NLRI_LENGTH +
+                     bgp_packet_mpattr_prefix_size (afi, safi, &rn->p);
 
       /* When remaining space can't include NLRI and it's length.  */
       if (space_remaining < space_needed)
@@ -667,7 +679,7 @@ subgroup_update_packet (struct update_subgroup *subgrp)
          struct peer *from = NULL;
 
          if (binfo)
-           from = binfo->peer;
+            from = binfo->peer;
 
          /* 1: Write the BGP message header - 16 bytes marker, 2 bytes length,
           * one byte message type.
@@ -691,11 +703,12 @@ subgroup_update_packet (struct update_subgroup *subgrp)
          total_attr_len = bgp_packet_attribute (NULL, peer, s,
                                                 adv->baa->attr, &vecarr,
                                                 NULL, afi, safi,
-                                                from, NULL, NULL);
+                                                from, NULL, NULL, 0, 0);
 
           space_remaining = STREAM_CONCAT_REMAIN (s, snlri, STREAM_SIZE(s)) -
                             BGP_MAX_PACKET_SIZE_OVERFLOW;
-          space_needed = BGP_NLRI_LENGTH + PSIZE (rn->p.prefixlen);
+          space_needed = BGP_NLRI_LENGTH +
+                         bgp_packet_mpattr_prefix_size (afi, safi, &rn->p);
 
           /* If the attributes alone do not leave any room for NLRI then
            * return */
@@ -721,7 +734,7 @@ subgroup_update_packet (struct update_subgroup *subgrp)
 
       if ((afi == AFI_IP && safi == SAFI_UNICAST) &&
           !peer_cap_enhe(peer))
-       stream_put_prefix (s, &rn->p);
+       stream_put_prefix_addpath (s, &rn->p, addpath_encode, addpath_tx_id);
       else
        {
          /* Encode the prefix in MP_REACH_NLRI attribute */
@@ -737,14 +750,16 @@ subgroup_update_packet (struct update_subgroup *subgrp)
            mpattrlen_pos = bgp_packet_mpattr_start (snlri, afi, safi,
                                          (peer_cap_enhe(peer) ? AFI_IP6 : afi),
                                          &vecarr, adv->baa->attr);
-         bgp_packet_mpattr_prefix (snlri, afi, safi, &rn->p, prd, tag);
+          bgp_packet_mpattr_prefix (snlri, afi, safi, &rn->p, prd, tag,
+                                    addpath_encode, addpath_tx_id);
        }
 
       num_pfx++;
 
       if (bgp_debug_update(NULL, &rn->p, subgrp->update_group, 0))
        {
-         char buf[INET6_BUFSIZ];
+          char buf[INET6_BUFSIZ];
+          char tx_id_buf[30];
 
           if (!send_attr_printed)
             {
@@ -753,10 +768,11 @@ subgroup_update_packet (struct update_subgroup *subgrp)
               send_attr_printed = 1;
             }
 
-         zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d",
-               subgrp->update_group->id, subgrp->id,
-               inet_ntop (rn->p.family, &(rn->p.u.prefix), buf,
-                          INET6_BUFSIZ), rn->p.prefixlen);
+          bgp_info_addpath_tx_str (addpath_encode, addpath_tx_id, tx_id_buf);
+          zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d%s",
+                      subgrp->update_group->id, subgrp->id,
+                      inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, INET6_BUFSIZ),
+                      rn->p.prefixlen, tx_id_buf);
        }
 
       /* Synchnorize attribute.  */
@@ -831,6 +847,8 @@ subgroup_withdraw_packet (struct update_subgroup *subgrp)
   int space_remaining = 0;
   int space_needed = 0;
   int num_pfx = 0;
+  int addpath_encode = 0;
+  u_int32_t addpath_tx_id = 0;
 
   if (!subgrp)
     return NULL;
@@ -843,17 +861,19 @@ subgroup_withdraw_packet (struct update_subgroup *subgrp)
   safi = SUBGRP_SAFI (subgrp);
   s = subgrp->work;
   stream_reset (s);
+  addpath_encode = bgp_addpath_encode_tx (peer, afi, safi);
 
   while ((adv = BGP_ADV_FIFO_HEAD (&subgrp->sync->withdraw)) != NULL)
     {
       assert (adv->rn);
       adj = adv->adj;
       rn = adv->rn;
+      addpath_tx_id = adj->addpath_tx_id;
 
       space_remaining = STREAM_REMAIN (s) -
                         BGP_MAX_PACKET_SIZE_OVERFLOW;
-      space_needed = (BGP_NLRI_LENGTH + BGP_TOTAL_ATTR_LEN +
-                      PSIZE (rn->p.prefixlen));
+      space_needed = BGP_NLRI_LENGTH + BGP_TOTAL_ATTR_LEN +
+                     bgp_packet_mpattr_prefix_size (afi, safi, &rn->p);
 
       if (space_remaining < space_needed)
        break;
@@ -868,7 +888,7 @@ subgroup_withdraw_packet (struct update_subgroup *subgrp)
 
       if (afi == AFI_IP && safi == SAFI_UNICAST &&
           !peer_cap_enhe(peer))
-       stream_put_prefix (s, &rn->p);
+       stream_put_prefix_addpath (s, &rn->p, addpath_encode, addpath_tx_id);
       else
        {
          struct prefix_rd *prd = NULL;
@@ -886,19 +906,21 @@ subgroup_withdraw_packet (struct update_subgroup *subgrp)
              mplen_pos = bgp_packet_mpunreach_start (s, afi, safi);
            }
 
-         bgp_packet_mpunreach_prefix (s, &rn->p, afi, safi, prd, NULL);
+         bgp_packet_mpunreach_prefix (s, &rn->p, afi, safi, prd, NULL,
+                                       addpath_encode, addpath_tx_id);
        }
 
       num_pfx++;
 
       if (bgp_debug_update(NULL, &rn->p, subgrp->update_group, 0))
        {
-         char buf[INET6_BUFSIZ];
-
-         zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d -- unreachable",
-               subgrp->update_group->id, subgrp->id,
-               inet_ntop (rn->p.family, &(rn->p.u.prefix), buf,
-                          INET6_BUFSIZ), rn->p.prefixlen);
+          char buf[INET6_BUFSIZ];
+          char tx_id_buf[30];
+          bgp_info_addpath_tx_str (addpath_encode, addpath_tx_id, tx_id_buf);
+         zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d%s -- unreachable",
+                      subgrp->update_group->id, subgrp->id,
+                      inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, INET6_BUFSIZ),
+                      rn->p.prefixlen, tx_id_buf);
        }
 
       subgrp->scount--;
@@ -944,7 +966,6 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
                                struct attr *attr, struct peer *from)
 {
   struct stream *s;
-  struct stream *packet;
   struct peer *peer;
   struct prefix p;
   unsigned long pos;
@@ -952,6 +973,7 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
   afi_t afi;
   safi_t safi;
   struct bpacket_attr_vec_arr vecarr;
+  int addpath_encode = 0;
 
   if (DISABLE_BGP_ANNOUNCE)
     return;
@@ -963,6 +985,7 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
   afi = SUBGRP_AFI (subgrp);
   safi = SUBGRP_SAFI (subgrp);
   bpacket_attr_vec_arr_reset (&vecarr);
+  addpath_encode = bgp_addpath_encode_tx (peer, afi, safi);
 
   if (afi == AFI_IP)
     str2prefix ("0.0.0.0/0", &p);
@@ -976,13 +999,15 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
     {
       char attrstr[BUFSIZ];
       char buf[INET6_BUFSIZ];
+      char tx_id_buf[30];
       attrstr[0] = '\0';
 
       bgp_dump_attr (peer, attr, attrstr, BUFSIZ);
-      zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d %s",
-           (SUBGRP_UPDGRP (subgrp))->id, subgrp->id,
-           inet_ntop (p.family, &(p.u.prefix), buf, INET6_BUFSIZ),
-           p.prefixlen, attrstr);
+      bgp_info_addpath_tx_str (addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE, tx_id_buf);
+      zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d%s %s",
+                  (SUBGRP_UPDGRP (subgrp))->id, subgrp->id,
+                  inet_ntop (p.family, &(p.u.prefix), buf, INET6_BUFSIZ),
+                  p.prefixlen, tx_id_buf, attrstr);
     }
 
   s = stream_new (BGP_MAX_PACKET_SIZE);
@@ -997,7 +1022,9 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
   pos = stream_get_endp (s);
   stream_putw (s, 0);
   total_attr_len = bgp_packet_attribute (NULL, peer, s, attr, &vecarr, &p,
-                                        afi, safi, from, NULL, NULL);
+                                        afi, safi, from, NULL, NULL,
+                                         addpath_encode,
+                                         BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
 
   /* Set Total Path Attribute Length. */
   stream_putw_at (s, pos, total_attr_len);
@@ -1005,14 +1032,12 @@ subgroup_default_update_packet (struct update_subgroup *subgrp,
   /* NLRI set. */
   if (p.family == AF_INET && safi == SAFI_UNICAST &&
       !peer_cap_enhe(peer))
-    stream_put_prefix (s, &p);
+    stream_put_prefix_addpath (s, &p, addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
 
   /* Set size. */
   bgp_packet_set_size (s);
 
-  packet = stream_dup (s);
-  stream_free (s);
-  (void) bpacket_queue_add (SUBGRP_PKTQ (subgrp), packet, &vecarr);
+  (void) bpacket_queue_add (SUBGRP_PKTQ (subgrp), s, &vecarr);
   subgroup_trigger_write(subgrp);
 }
 
@@ -1021,16 +1046,16 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
 {
   struct peer *peer;
   struct stream *s;
-  struct stream *packet;
   struct prefix p;
   unsigned long attrlen_pos = 0;
   unsigned long cp;
   bgp_size_t unfeasible_len;
-  bgp_size_t total_attr_len;
+  bgp_size_t total_attr_len = 0;
   size_t mp_start = 0;
   size_t mplen_pos = 0;
   afi_t afi;
   safi_t safi;
+  int addpath_encode = 0;
 
   if (DISABLE_BGP_ANNOUNCE)
     return;
@@ -1038,6 +1063,7 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
   peer = SUBGRP_PEER (subgrp);
   afi = SUBGRP_AFI (subgrp);
   safi = SUBGRP_SAFI (subgrp);
+  addpath_encode = bgp_addpath_encode_tx (peer, afi, safi);
 
   if (afi == AFI_IP)
     str2prefix ("0.0.0.0/0", &p);
@@ -1046,19 +1072,16 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
     str2prefix ("::/0", &p);
 #endif /* HAVE_IPV6 */
 
-  total_attr_len = 0;
-
   if (bgp_debug_update(NULL, &p, subgrp->update_group, 0))
     {
       char buf[INET6_BUFSIZ];
+      char tx_id_buf[INET6_BUFSIZ];
 
-      zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d -- unreachable",
-           (SUBGRP_UPDGRP (subgrp))->id, subgrp->id, inet_ntop (p.family,
-                                                                &(p.u.
-                                                                  prefix),
-                                                                buf,
-                                                                INET6_BUFSIZ),
-           p.prefixlen);
+      bgp_info_addpath_tx_str (addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE, tx_id_buf);
+      zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s/%d%s -- unreachable",
+                  (SUBGRP_UPDGRP (subgrp))->id, subgrp->id,
+                  inet_ntop (p.family, &(p.u.prefix), buf, INET6_BUFSIZ),
+                  p.prefixlen, tx_id_buf);
     }
 
   s = stream_new (BGP_MAX_PACKET_SIZE);
@@ -1074,7 +1097,8 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
   if (p.family == AF_INET && safi == SAFI_UNICAST &&
       !peer_cap_enhe(peer))
     {
-      stream_put_prefix (s, &p);
+      stream_put_prefix_addpath (s, &p, addpath_encode,
+                                 BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
 
       unfeasible_len = stream_get_endp (s) - cp - 2;
 
@@ -1090,7 +1114,9 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
       stream_putw (s, 0);
       mp_start = stream_get_endp (s);
       mplen_pos = bgp_packet_mpunreach_start (s, afi, safi);
-      bgp_packet_mpunreach_prefix (s, &p, afi, safi, NULL, NULL);
+      bgp_packet_mpunreach_prefix (s, &p, afi, safi, NULL, NULL,
+                                   addpath_encode,
+                                   BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
 
       /* Set the mp_unreach attr's length */
       bgp_packet_mpunreach_end (s, mplen_pos);
@@ -1102,10 +1128,7 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp)
 
   bgp_packet_set_size (s);
 
-  packet = stream_dup (s);
-  stream_free (s);
-
-  (void) bpacket_queue_add (SUBGRP_PKTQ (subgrp), packet, NULL);
+  (void) bpacket_queue_add (SUBGRP_PKTQ (subgrp), s, NULL);
   subgroup_trigger_write(subgrp);
 }