From b16031a2ecdd354e0d74d7074987e7525d260e77 Mon Sep 17 00:00:00 2001 From: vivek Date: Mon, 15 May 2017 14:52:17 -0700 Subject: [PATCH] bgpd: Debug logging updates for EVPN Ensure VNI and EVPN nexthops are logged in debug logs. Updates: "bgpd: labeled unicast processing" Signed-off-by: Vivek Venkatraman --- bgpd/bgp_debug.c | 32 +++++++++++---- bgpd/bgp_debug.h | 3 +- bgpd/bgp_evpn.c | 13 ++++++ bgpd/bgp_evpn.h | 2 + bgpd/bgp_route.c | 86 ++++++++++++++++++++++++---------------- bgpd/bgp_updgrp_packet.c | 27 +++++-------- 6 files changed, 104 insertions(+), 59 deletions(-) diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c index 450f68fec..a48df5c0c 100644 --- a/bgpd/bgp_debug.c +++ b/bgpd/bgp_debug.c @@ -40,6 +40,8 @@ #include "bgpd/bgp_updgrp.h" #include "bgpd/bgp_mplsvpn.h" #include "bgpd/bgp_ecommunity.h" +#include "bgpd/bgp_label.h" +#include "bgpd/bgp_evpn.h" unsigned long conf_bgp_debug_as4; unsigned long conf_bgp_debug_neighbor_events; @@ -410,6 +412,9 @@ bgp_dump_attr (struct attr *attr, char *buf, size_t size) snprintf (buf + strlen (buf), size - strlen (buf), "(%s)", inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local, addrbuf, BUFSIZ)); + + if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4) + snprintf (buf, size, "nexthop %s", inet_ntoa (attr->nexthop)); } if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))) @@ -2147,12 +2152,14 @@ bgp_debug_zebra (struct prefix *p) } const char * -bgp_debug_rdpfxpath2str (struct prefix_rd *prd, union prefixconstptr pu, - int addpath_valid, u_int32_t addpath_id, - char *str, int size) +bgp_debug_rdpfxpath2str (afi_t afi, safi_t safi, + struct prefix_rd *prd, union prefixconstptr pu, + mpls_label_t *label, int addpath_valid, + u_int32_t addpath_id, char *str, int size) { char rd_buf[RD_ADDRSTRLEN]; char pfx_buf[PREFIX_STRLEN]; + char tag_buf[30]; /* ' with addpath ID ' 17 * max strlen of uint32 + 10 * +/- (just in case) + 1 @@ -2168,13 +2175,24 @@ bgp_debug_rdpfxpath2str (struct prefix_rd *prd, union prefixconstptr pu, if (addpath_valid) snprintf(pathid_buf, sizeof(pathid_buf), " with addpath ID %u", addpath_id); + tag_buf[0] = '\0'; + if (bgp_labeled_safi (safi) && label) + { + u_int32_t label_value; + + label_value = decode_label (label); + sprintf (tag_buf, " label %u", label_value); + } + if (prd) - snprintf (str, size, "RD %s %s%s", + snprintf (str, size, "RD %s %s%s%s", prefix_rd2str(prd, rd_buf, sizeof (rd_buf)), - prefix2str (pu, pfx_buf, sizeof (pfx_buf)), pathid_buf); + prefix2str (pu, pfx_buf, sizeof (pfx_buf)), + tag_buf, pathid_buf); else - snprintf (str, size, "%s%s", - prefix2str (pu, pfx_buf, sizeof (pfx_buf)), pathid_buf); + snprintf (str, size, "%s%s%s", + prefix2str (pu, pfx_buf, sizeof (pfx_buf)), + tag_buf, pathid_buf); return str; } diff --git a/bgpd/bgp_debug.h b/bgpd/bgp_debug.h index 5ec2eaa7c..11ab4dbd6 100644 --- a/bgpd/bgp_debug.h +++ b/bgpd/bgp_debug.h @@ -153,7 +153,8 @@ extern int bgp_debug_bestpath(struct prefix *p); extern int bgp_debug_zebra(struct prefix *p); extern int bgp_debug_count(void); -extern const char *bgp_debug_rdpfxpath2str (struct prefix_rd *, union prefixconstptr, +extern const char *bgp_debug_rdpfxpath2str (afi_t, safi_t, struct prefix_rd *, + union prefixconstptr, mpls_label_t *, int, u_int32_t, char *, int); const char *bgp_notify_admin_message(char *buf, size_t bufsz, u_char *data, size_t datalen); diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index 130017562..5bff85723 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -1968,6 +1968,19 @@ free_vni_entry (struct hash_backet *backet, struct bgp *bgp) * Public functions. */ +/* + * Function to display "tag" in route as a VNI. + */ +char * +bgp_evpn_label2str (mpls_label_t *label, char *buf, int len) +{ + vni_t vni; + + vni = label2vni (label); + snprintf (buf, len, "%u", vni); + return buf; +} + /* * Encode EVPN prefix in Update (MP_REACH) */ diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h index ed76bc3a4..9e471138f 100644 --- a/bgpd/bgp_evpn.h +++ b/bgpd/bgp_evpn.h @@ -23,6 +23,8 @@ #include "vxlan.h" +extern char * +bgp_evpn_label2str (mpls_label_t *label, char *buf, int len); extern void bgp_evpn_encode_prefix (struct stream *s, struct prefix *p, struct prefix_rd *prd, mpls_label_t *label, diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index e55cd7b94..6a2cc8d4d 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2605,8 +2605,6 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, bgp = peer->bgp; rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd); - label_buf[0] = '\0'; - has_valid_label = bgp_is_valid_label(label); if (has_valid_label) @@ -2721,9 +2719,12 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY)) { if (bgp_debug_update(peer, p, NULL, 1)) - zlog_debug ("%s rcvd %s %s", peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf)), label_buf); + { + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s rcvd %s", peer->host, pfx_buf); + } if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED) { @@ -2741,10 +2742,11 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, peer->rcvd_attr_printed = 1; } - zlog_debug ("%s rcvd %s %s...duplicate ignored", - peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? - 1 : 0, addpath_id, pfx_buf, sizeof (pfx_buf)), label_buf); + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s rcvd %s...duplicate ignored", + peer->host, pfx_buf); } /* graceful restart STALE flag unset. */ @@ -2765,18 +2767,25 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) { if (bgp_debug_update(peer, p, NULL, 1)) - zlog_debug ("%s rcvd %s %s, flapped quicker than processing", - peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf)), label_buf); + { + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s rcvd %s, flapped quicker than processing", + peer->host, pfx_buf); + } + bgp_info_restore (rn, ri); } /* Received Logging. */ if (bgp_debug_update(peer, p, NULL, 1)) - zlog_debug ("%s rcvd %s %s", peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf)), label_buf); + { + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s rcvd %s", peer->host, pfx_buf); + } /* graceful restart STALE flag unset. */ if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) @@ -2995,9 +3004,10 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, peer->rcvd_attr_printed = 1; } - zlog_debug ("%s rcvd %s %s ", peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf)), label_buf); + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s rcvd %s", peer->host, pfx_buf); } /* Make new BGP info. */ @@ -3117,10 +3127,11 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, peer->rcvd_attr_printed = 1; } - zlog_debug ("%s rcvd UPDATE about %s %s -- DENIED due to: %s", - peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf)), label_buf, reason); + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s rcvd UPDATE about %s -- DENIED due to: %s", + peer->host, pfx_buf, reason); } if (ri) @@ -3184,10 +3195,13 @@ bgp_withdraw (struct peer *peer, struct prefix *p, u_int32_t addpath_id, if (!bgp_adj_in_unset (rn, peer, addpath_id)) { if (bgp_debug_update (peer, p, NULL, 1)) - zlog_debug ("%s withdrawing route %s not in adj-in", - peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf))); + { + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s withdrawing route %s not in adj-in", + peer->host, pfx_buf); + } bgp_unlock_node (rn); return 0; } @@ -3201,20 +3215,24 @@ bgp_withdraw (struct peer *peer, struct prefix *p, u_int32_t addpath_id, /* Logging. */ if (bgp_debug_update(peer, p, NULL, 1)) { + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); zlog_debug ("%s rcvd UPDATE about %s -- withdrawn", - peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf))); + peer->host, pfx_buf); } /* Withdraw specified route from routing table. */ if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY)) bgp_rib_withdraw (rn, ri, peer, afi, safi, prd); else if (bgp_debug_update(peer, p, NULL, 1)) - zlog_debug ("%s Can't find the route %s", - peer->host, - bgp_debug_rdpfxpath2str (prd, p, addpath_id ? 1 : 0, - addpath_id, pfx_buf, sizeof (pfx_buf))); + { + bgp_debug_rdpfxpath2str (afi, safi, prd, p, label, + addpath_id ? 1 : 0, addpath_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("%s Can't find the route %s", + peer->host, pfx_buf); + } /* Unlock bgp_node_get() lock. */ bgp_unlock_node (rn); diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index 872ead000..df1bb1eab 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -703,7 +703,7 @@ subgroup_update_packet (struct update_subgroup *subgrp) int addpath_encode = 0; u_int32_t addpath_tx_id = 0; struct prefix_rd *prd = NULL; - char label_buf[20]; + mpls_label_t label = MPLS_INVALID_LABEL; if (!subgrp) return NULL; @@ -718,7 +718,6 @@ subgroup_update_packet (struct update_subgroup *subgrp) stream_reset (s); snlri = subgrp->scratch; stream_reset (snlri); - label_buf[0] = '\0'; bpacket_attr_vec_arr_reset (&vecarr); @@ -807,8 +806,6 @@ subgroup_update_packet (struct update_subgroup *subgrp) else { /* Encode the prefix in MP_REACH_NLRI attribute */ - mpls_label_t label = MPLS_INVALID_LABEL; - if (rn->prn) prd = (struct prefix_rd *) &rn->prn->p; @@ -818,9 +815,6 @@ subgroup_update_packet (struct update_subgroup *subgrp) if (binfo && binfo->extra) label = binfo->extra->label; - if (bgp_labeled_safi(safi)) - sprintf (label_buf, "label %u", label_pton(&label)); - if (stream_empty (snlri)) mpattrlen_pos = bgp_packet_mpattr_start (snlri, peer, afi, safi, &vecarr, adv->baa->attr); @@ -853,12 +847,11 @@ subgroup_update_packet (struct update_subgroup *subgrp) send_attr_printed = 1; } - zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s %s", - subgrp->update_group->id, subgrp->id, - bgp_debug_rdpfxpath2str (prd, &rn->p, addpath_encode, - addpath_tx_id, - pfx_buf, sizeof (pfx_buf)), - label_buf); + bgp_debug_rdpfxpath2str (afi, safi, prd, &rn->p, &label, + addpath_encode, addpath_tx_id, + pfx_buf, sizeof (pfx_buf)); + zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s", + subgrp->update_group->id, subgrp->id, pfx_buf); } /* Synchnorize attribute. */ @@ -1011,11 +1004,11 @@ subgroup_withdraw_packet (struct update_subgroup *subgrp) { char pfx_buf[BGP_PRD_PATH_STRLEN]; + bgp_debug_rdpfxpath2str (afi, safi, prd, &rn->p, NULL, + addpath_encode, addpath_tx_id, + pfx_buf, sizeof (pfx_buf)); zlog_debug ("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s -- unreachable", - subgrp->update_group->id, subgrp->id, - bgp_debug_rdpfxpath2str (prd, &rn->p, - addpath_encode, addpath_tx_id, - pfx_buf, sizeof (pfx_buf))); + subgrp->update_group->id, subgrp->id, pfx_buf); } subgrp->scount--; -- 2.39.5