diff options
Diffstat (limited to 'bgpd/bgp_dump.c')
| -rw-r--r-- | bgpd/bgp_dump.c | 1307 | 
1 files changed, 626 insertions, 681 deletions
diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c index 84ece48850..3029f12c89 100644 --- a/bgpd/bgp_dump.c +++ b/bgpd/bgp_dump.c @@ -37,62 +37,56 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  #include "bgpd/bgp_attr.h"  #include "bgpd/bgp_dump.h" -enum bgp_dump_type -{ -  BGP_DUMP_ALL, -  BGP_DUMP_ALL_ET, -  BGP_DUMP_UPDATES, -  BGP_DUMP_UPDATES_ET, -  BGP_DUMP_ROUTES +enum bgp_dump_type { +	BGP_DUMP_ALL, +	BGP_DUMP_ALL_ET, +	BGP_DUMP_UPDATES, +	BGP_DUMP_UPDATES_ET, +	BGP_DUMP_ROUTES  };  static const struct bgp_dump_type_map { -  enum bgp_dump_type type; -  const char *str; -} bgp_dump_type_map[] = -  { -    {BGP_DUMP_ALL, "all"}, -    {BGP_DUMP_ALL_ET, "all-et"}, -    {BGP_DUMP_UPDATES, "updates"}, -    {BGP_DUMP_UPDATES_ET, "updates-et"}, -    {BGP_DUMP_ROUTES, "routes-mrt"}, -    {0, NULL}, -  }; +	enum bgp_dump_type type; +	const char *str; +} bgp_dump_type_map[] = { +	{BGP_DUMP_ALL, "all"},		 {BGP_DUMP_ALL_ET, "all-et"}, +	{BGP_DUMP_UPDATES, "updates"},   {BGP_DUMP_UPDATES_ET, "updates-et"}, +	{BGP_DUMP_ROUTES, "routes-mrt"}, {0, NULL}, +};  enum MRT_MSG_TYPES { -   MSG_NULL, -   MSG_START,                   /* sender is starting up */ -   MSG_DIE,                     /* receiver should shut down */ -   MSG_I_AM_DEAD,               /* sender is shutting down */ -   MSG_PEER_DOWN,               /* sender's peer is down */ -   MSG_PROTOCOL_BGP,            /* msg is a BGP packet */ -   MSG_PROTOCOL_RIP,            /* msg is a RIP packet */ -   MSG_PROTOCOL_IDRP,           /* msg is an IDRP packet */ -   MSG_PROTOCOL_RIPNG,          /* msg is a RIPNG packet */ -   MSG_PROTOCOL_BGP4PLUS,       /* msg is a BGP4+ packet */ -   MSG_PROTOCOL_BGP4PLUS_01,    /* msg is a BGP4+ (draft 01) packet */ -   MSG_PROTOCOL_OSPF,           /* msg is an OSPF packet */ -   MSG_TABLE_DUMP,              /* routing table dump */ -   MSG_TABLE_DUMP_V2            /* routing table dump, version 2 */ +	MSG_NULL, +	MSG_START,		  /* sender is starting up */ +	MSG_DIE,		  /* receiver should shut down */ +	MSG_I_AM_DEAD,		  /* sender is shutting down */ +	MSG_PEER_DOWN,		  /* sender's peer is down */ +	MSG_PROTOCOL_BGP,	 /* msg is a BGP packet */ +	MSG_PROTOCOL_RIP,	 /* msg is a RIP packet */ +	MSG_PROTOCOL_IDRP,	/* msg is an IDRP packet */ +	MSG_PROTOCOL_RIPNG,       /* msg is a RIPNG packet */ +	MSG_PROTOCOL_BGP4PLUS,    /* msg is a BGP4+ packet */ +	MSG_PROTOCOL_BGP4PLUS_01, /* msg is a BGP4+ (draft 01) packet */ +	MSG_PROTOCOL_OSPF,	/* msg is an OSPF packet */ +	MSG_TABLE_DUMP,		  /* routing table dump */ +	MSG_TABLE_DUMP_V2	 /* routing table dump, version 2 */  }; -struct bgp_dump -{ -  enum bgp_dump_type type; +struct bgp_dump { +	enum bgp_dump_type type; -  char *filename; +	char *filename; -  FILE *fp; +	FILE *fp; -  unsigned int interval; +	unsigned int interval; -  char *interval_str; +	char *interval_str; -  struct thread *t_interval; +	struct thread *t_interval;  }; -static int bgp_dump_unset (struct bgp_dump *bgp_dump); -static int bgp_dump_interval_func (struct thread *); +static int bgp_dump_unset(struct bgp_dump *bgp_dump); +static int bgp_dump_interval_func(struct thread *);  /* BGP packet dump output buffer. */  struct stream *bgp_dump_obuf; @@ -106,629 +100,593 @@ struct bgp_dump bgp_dump_updates;  /* BGP dump structure for 'dump bgp routes' */  struct bgp_dump bgp_dump_routes; -static FILE * -bgp_dump_open_file (struct bgp_dump *bgp_dump) +static FILE *bgp_dump_open_file(struct bgp_dump *bgp_dump)  { -  int ret; -  time_t clock; -  struct tm *tm; -  char fullpath[MAXPATHLEN]; -  char realpath[MAXPATHLEN]; -  mode_t oldumask; - -  time (&clock); -  tm = localtime (&clock); - -  if (bgp_dump->filename[0] != DIRECTORY_SEP) -    { -      sprintf (fullpath, "%s/%s", vty_get_cwd (), bgp_dump->filename); -      ret = strftime (realpath, MAXPATHLEN, fullpath, tm); -    } -  else -    ret = strftime (realpath, MAXPATHLEN, bgp_dump->filename, tm); - -  if (ret == 0) -    { -      zlog_warn ("bgp_dump_open_file: strftime error"); -      return NULL; -    } +	int ret; +	time_t clock; +	struct tm *tm; +	char fullpath[MAXPATHLEN]; +	char realpath[MAXPATHLEN]; +	mode_t oldumask; + +	time(&clock); +	tm = localtime(&clock); + +	if (bgp_dump->filename[0] != DIRECTORY_SEP) { +		sprintf(fullpath, "%s/%s", vty_get_cwd(), bgp_dump->filename); +		ret = strftime(realpath, MAXPATHLEN, fullpath, tm); +	} else +		ret = strftime(realpath, MAXPATHLEN, bgp_dump->filename, tm); + +	if (ret == 0) { +		zlog_warn("bgp_dump_open_file: strftime error"); +		return NULL; +	} -  if (bgp_dump->fp) -    fclose (bgp_dump->fp); +	if (bgp_dump->fp) +		fclose(bgp_dump->fp); -  oldumask = umask(0777 & ~LOGFILE_MASK); -  bgp_dump->fp = fopen (realpath, "w"); +	oldumask = umask(0777 & ~LOGFILE_MASK); +	bgp_dump->fp = fopen(realpath, "w"); -  if (bgp_dump->fp == NULL) -    { -      zlog_warn ("bgp_dump_open_file: %s: %s", realpath, strerror (errno)); -      umask(oldumask); -      return NULL; -    } -  umask(oldumask);   +	if (bgp_dump->fp == NULL) { +		zlog_warn("bgp_dump_open_file: %s: %s", realpath, +			  strerror(errno)); +		umask(oldumask); +		return NULL; +	} +	umask(oldumask); -  return bgp_dump->fp; +	return bgp_dump->fp;  } -static int -bgp_dump_interval_add (struct bgp_dump *bgp_dump, int interval) +static int bgp_dump_interval_add(struct bgp_dump *bgp_dump, int interval)  { -  int secs_into_day; -  time_t t; -  struct tm *tm; - -  if (interval > 0) -    { -      /* Periodic dump every interval seconds */ -      if ((interval < 86400) && ((86400 % interval) == 0)) -	{ -	  /* Dump at predictable times: if a day has a whole number of -	   * intervals, dump every interval seconds starting from midnight -	   */ -	  (void) time(&t); -	  tm = localtime(&t); -	  secs_into_day = tm->tm_sec + 60*tm->tm_min + 60*60*tm->tm_hour; -	  interval = interval - secs_into_day % interval; /* always > 0 */ +	int secs_into_day; +	time_t t; +	struct tm *tm; + +	if (interval > 0) { +		/* Periodic dump every interval seconds */ +		if ((interval < 86400) && ((86400 % interval) == 0)) { +			/* Dump at predictable times: if a day has a whole +			 * number of +			 * intervals, dump every interval seconds starting from +			 * midnight +			 */ +			(void)time(&t); +			tm = localtime(&t); +			secs_into_day = tm->tm_sec + 60 * tm->tm_min +					+ 60 * 60 * tm->tm_hour; +			interval = interval +				   - secs_into_day % interval; /* always > 0 */ +		} +		bgp_dump->t_interval = thread_add_timer( +			bm->master, bgp_dump_interval_func, bgp_dump, interval); +	} else { +		/* One-off dump: execute immediately, don't affect any scheduled +		 * dumps */ +		bgp_dump->t_interval = thread_add_event( +			bm->master, bgp_dump_interval_func, bgp_dump, 0);  	} -      bgp_dump->t_interval = thread_add_timer (bm->master, bgp_dump_interval_func, -					       bgp_dump, interval); -    } -  else -    { -      /* One-off dump: execute immediately, don't affect any scheduled dumps */ -      bgp_dump->t_interval = thread_add_event (bm->master, bgp_dump_interval_func, -					       bgp_dump, 0); -    } -  return 0; +	return 0;  }  /* Dump common header. */ -static void -bgp_dump_header (struct stream *obuf, int type, int subtype, int dump_type) +static void bgp_dump_header(struct stream *obuf, int type, int subtype, +			    int dump_type)  { -  struct timeval clock; -  long msecs; -  time_t secs; +	struct timeval clock; +	long msecs; +	time_t secs; -  if ((dump_type == BGP_DUMP_ALL_ET || dump_type == BGP_DUMP_UPDATES_ET) -      && type == MSG_PROTOCOL_BGP4MP) -    type = MSG_PROTOCOL_BGP4MP_ET; +	if ((dump_type == BGP_DUMP_ALL_ET || dump_type == BGP_DUMP_UPDATES_ET) +	    && type == MSG_PROTOCOL_BGP4MP) +		type = MSG_PROTOCOL_BGP4MP_ET; -  gettimeofday(&clock, NULL); +	gettimeofday(&clock, NULL); -  secs = clock.tv_sec; -  msecs = clock.tv_usec; +	secs = clock.tv_sec; +	msecs = clock.tv_usec; -  /* Put dump packet header. */ -  stream_putl (obuf, secs); -  stream_putw (obuf, type); -  stream_putw (obuf, subtype); -  stream_putl (obuf, 0);	/* len */ +	/* Put dump packet header. */ +	stream_putl(obuf, secs); +	stream_putw(obuf, type); +	stream_putw(obuf, subtype); +	stream_putl(obuf, 0); /* len */ -  /* Adding microseconds for the MRT Extended Header */ -  if (type == MSG_PROTOCOL_BGP4MP_ET) -    stream_putl (obuf, msecs); +	/* Adding microseconds for the MRT Extended Header */ +	if (type == MSG_PROTOCOL_BGP4MP_ET) +		stream_putl(obuf, msecs);  } -static void -bgp_dump_set_size (struct stream *s, int type) +static void bgp_dump_set_size(struct stream *s, int type)  { -  /* -   * The BGP_DUMP_HEADER_SIZE stay at 12 event when ET: -   * "The Microsecond Timestamp is included in the computation -   *  of the Length field value." (RFC6396 2011) -   */ -  stream_putl_at (s, 8, stream_get_endp (s) - BGP_DUMP_HEADER_SIZE); +	/* +	 * The BGP_DUMP_HEADER_SIZE stay at 12 event when ET: +	 * "The Microsecond Timestamp is included in the computation +	 *  of the Length field value." (RFC6396 2011) +	 */ +	stream_putl_at(s, 8, stream_get_endp(s) - BGP_DUMP_HEADER_SIZE);  } -static void -bgp_dump_routes_index_table(struct bgp *bgp) +static void bgp_dump_routes_index_table(struct bgp *bgp)  { -  struct peer *peer; -  struct listnode *node; -  uint16_t peerno = 1; -  struct stream *obuf; - -  obuf = bgp_dump_obuf; -  stream_reset (obuf); - -  /* MRT header */ -  bgp_dump_header (obuf, MSG_TABLE_DUMP_V2, TABLE_DUMP_V2_PEER_INDEX_TABLE, -		   BGP_DUMP_ROUTES); - -  /* Collector BGP ID */ -  stream_put_in_addr (obuf, &bgp->router_id); - -  /* View name */ -  if(bgp->name) -    { -      stream_putw (obuf, strlen(bgp->name)); -      stream_put(obuf, bgp->name, strlen(bgp->name)); -    } -  else -    { -      stream_putw(obuf, 0); -    } - -  /* Peer count ( plus one extra internal peer ) */ -  stream_putw (obuf, listcount(bgp->peer) + 1); - -  /* Populate fake peer at index 0, for locally originated routes */ -  /* Peer type (IPv4) */ -  stream_putc (obuf, TABLE_DUMP_V2_PEER_INDEX_TABLE_AS4+TABLE_DUMP_V2_PEER_INDEX_TABLE_IP); -  /* Peer BGP ID (0.0.0.0) */ -  stream_putl (obuf, 0); -  /* Peer IP address (0.0.0.0) */ -  stream_putl (obuf, 0); -  /* Peer ASN (0) */ -  stream_putl (obuf, 0); - -  /* Walk down all peers */ -  for(ALL_LIST_ELEMENTS_RO (bgp->peer, node, peer)) -    { +	struct peer *peer; +	struct listnode *node; +	uint16_t peerno = 1; +	struct stream *obuf; + +	obuf = bgp_dump_obuf; +	stream_reset(obuf); + +	/* MRT header */ +	bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, TABLE_DUMP_V2_PEER_INDEX_TABLE, +			BGP_DUMP_ROUTES); + +	/* Collector BGP ID */ +	stream_put_in_addr(obuf, &bgp->router_id); + +	/* View name */ +	if (bgp->name) { +		stream_putw(obuf, strlen(bgp->name)); +		stream_put(obuf, bgp->name, strlen(bgp->name)); +	} else { +		stream_putw(obuf, 0); +	} -      /* Peer's type */ -      if (sockunion_family(&peer->su) == AF_INET) -        { -          stream_putc (obuf, TABLE_DUMP_V2_PEER_INDEX_TABLE_AS4+TABLE_DUMP_V2_PEER_INDEX_TABLE_IP); -        } -      else if (sockunion_family(&peer->su) == AF_INET6) -        { -          stream_putc (obuf, TABLE_DUMP_V2_PEER_INDEX_TABLE_AS4+TABLE_DUMP_V2_PEER_INDEX_TABLE_IP6); -        } - -      /* Peer's BGP ID */ -      stream_put_in_addr (obuf, &peer->remote_id); - -      /* Peer's IP address */ -      if (sockunion_family(&peer->su) == AF_INET) -        { -          stream_put_in_addr (obuf, &peer->su.sin.sin_addr); -        } -      else if (sockunion_family(&peer->su) == AF_INET6) -        { -          stream_write (obuf, (u_char *)&peer->su.sin6.sin6_addr, -                        IPV6_MAX_BYTELEN); -        } - -      /* Peer's AS number. */ -      /* Note that, as this is an AS4 compliant quagga, the RIB is always AS4 */ -      stream_putl (obuf, peer->as); - -      /* Store the peer number for this peer */ -      peer->table_dump_index = peerno; -      peerno++; -    } +	/* Peer count ( plus one extra internal peer ) */ +	stream_putw(obuf, listcount(bgp->peer) + 1); + +	/* Populate fake peer at index 0, for locally originated routes */ +	/* Peer type (IPv4) */ +	stream_putc(obuf, +		    TABLE_DUMP_V2_PEER_INDEX_TABLE_AS4 +			    + TABLE_DUMP_V2_PEER_INDEX_TABLE_IP); +	/* Peer BGP ID (0.0.0.0) */ +	stream_putl(obuf, 0); +	/* Peer IP address (0.0.0.0) */ +	stream_putl(obuf, 0); +	/* Peer ASN (0) */ +	stream_putl(obuf, 0); + +	/* Walk down all peers */ +	for (ALL_LIST_ELEMENTS_RO(bgp->peer, node, peer)) { + +		/* Peer's type */ +		if (sockunion_family(&peer->su) == AF_INET) { +			stream_putc( +				obuf, +				TABLE_DUMP_V2_PEER_INDEX_TABLE_AS4 +					+ TABLE_DUMP_V2_PEER_INDEX_TABLE_IP); +		} else if (sockunion_family(&peer->su) == AF_INET6) { +			stream_putc( +				obuf, +				TABLE_DUMP_V2_PEER_INDEX_TABLE_AS4 +					+ TABLE_DUMP_V2_PEER_INDEX_TABLE_IP6); +		} + +		/* Peer's BGP ID */ +		stream_put_in_addr(obuf, &peer->remote_id); + +		/* Peer's IP address */ +		if (sockunion_family(&peer->su) == AF_INET) { +			stream_put_in_addr(obuf, &peer->su.sin.sin_addr); +		} else if (sockunion_family(&peer->su) == AF_INET6) { +			stream_write(obuf, (u_char *)&peer->su.sin6.sin6_addr, +				     IPV6_MAX_BYTELEN); +		} + +		/* Peer's AS number. */ +		/* Note that, as this is an AS4 compliant quagga, the RIB is +		 * always AS4 */ +		stream_putl(obuf, peer->as); + +		/* Store the peer number for this peer */ +		peer->table_dump_index = peerno; +		peerno++; +	} -  bgp_dump_set_size(obuf, MSG_TABLE_DUMP_V2); +	bgp_dump_set_size(obuf, MSG_TABLE_DUMP_V2); -  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_routes.fp); -  fflush (bgp_dump_routes.fp); +	fwrite(STREAM_DATA(obuf), stream_get_endp(obuf), 1, bgp_dump_routes.fp); +	fflush(bgp_dump_routes.fp);  } -static struct bgp_info * -bgp_dump_route_node_record (int afi, struct bgp_node *rn, -			    struct bgp_info *info, unsigned int seq) +static struct bgp_info *bgp_dump_route_node_record(int afi, struct bgp_node *rn, +						   struct bgp_info *info, +						   unsigned int seq)  { -  struct stream *obuf; -  size_t sizep; -  size_t endp; - -  obuf = bgp_dump_obuf; -  stream_reset (obuf); - -  /* MRT header */ -  if (afi == AFI_IP) -    bgp_dump_header (obuf, MSG_TABLE_DUMP_V2, TABLE_DUMP_V2_RIB_IPV4_UNICAST, -                     BGP_DUMP_ROUTES); -  else if (afi == AFI_IP6) -    bgp_dump_header (obuf, MSG_TABLE_DUMP_V2, TABLE_DUMP_V2_RIB_IPV6_UNICAST, -                     BGP_DUMP_ROUTES); - -  /* Sequence number */ -  stream_putl (obuf, seq); - -  /* Prefix length */ -  stream_putc (obuf, rn->p.prefixlen); - -  /* Prefix */ -  if (afi == AFI_IP) -    { -      /* We'll dump only the useful bits (those not 0), but have to align on 8 bits */ -      stream_write (obuf, (u_char *)&rn->p.u.prefix4, (rn->p.prefixlen+7)/8); -    } -  else if (afi == AFI_IP6) -    { -      /* We'll dump only the useful bits (those not 0), but have to align on 8 bits */ -      stream_write (obuf, (u_char *)&rn->p.u.prefix6, (rn->p.prefixlen+7)/8); -    } +	struct stream *obuf; +	size_t sizep; +	size_t endp; + +	obuf = bgp_dump_obuf; +	stream_reset(obuf); + +	/* MRT header */ +	if (afi == AFI_IP) +		bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, +				TABLE_DUMP_V2_RIB_IPV4_UNICAST, +				BGP_DUMP_ROUTES); +	else if (afi == AFI_IP6) +		bgp_dump_header(obuf, MSG_TABLE_DUMP_V2, +				TABLE_DUMP_V2_RIB_IPV6_UNICAST, +				BGP_DUMP_ROUTES); + +	/* Sequence number */ +	stream_putl(obuf, seq); + +	/* Prefix length */ +	stream_putc(obuf, rn->p.prefixlen); + +	/* Prefix */ +	if (afi == AFI_IP) { +		/* We'll dump only the useful bits (those not 0), but have to +		 * align on 8 bits */ +		stream_write(obuf, (u_char *)&rn->p.u.prefix4, +			     (rn->p.prefixlen + 7) / 8); +	} else if (afi == AFI_IP6) { +		/* We'll dump only the useful bits (those not 0), but have to +		 * align on 8 bits */ +		stream_write(obuf, (u_char *)&rn->p.u.prefix6, +			     (rn->p.prefixlen + 7) / 8); +	} -  /* Save where we are now, so we can overwride the entry count later */ -  sizep = stream_get_endp (obuf); +	/* Save where we are now, so we can overwride the entry count later */ +	sizep = stream_get_endp(obuf); -  /* Entry count */ -  uint16_t entry_count = 0; +	/* Entry count */ +	uint16_t entry_count = 0; -  /* Entry count, note that this is overwritten later */ -  stream_putw (obuf, 0); +	/* Entry count, note that this is overwritten later */ +	stream_putw(obuf, 0); -  endp = stream_get_endp (obuf); -  for (; info; info = info->next) -  { -    size_t cur_endp; +	endp = stream_get_endp(obuf); +	for (; info; info = info->next) { +		size_t cur_endp; -    /* Peer index */ -    stream_putw (obuf, info->peer->table_dump_index); +		/* Peer index */ +		stream_putw(obuf, info->peer->table_dump_index); -    /* Originated */ -    stream_putl (obuf, time(NULL) - (bgp_clock() - info->uptime)); +		/* Originated */ +		stream_putl(obuf, time(NULL) - (bgp_clock() - info->uptime)); -    /* Dump attribute. */ -    /* Skip prefix & AFI/SAFI for MP_NLRI */ -    bgp_dump_routes_attr (obuf, info->attr, &rn->p); +		/* Dump attribute. */ +		/* Skip prefix & AFI/SAFI for MP_NLRI */ +		bgp_dump_routes_attr(obuf, info->attr, &rn->p); -    cur_endp = stream_get_endp (obuf); -    if (cur_endp > BGP_MAX_PACKET_SIZE + BGP_DUMP_MSG_HEADER -                   + BGP_DUMP_HEADER_SIZE) -    { -      stream_set_endp (obuf, endp); -      break; -    } +		cur_endp = stream_get_endp(obuf); +		if (cur_endp > BGP_MAX_PACKET_SIZE + BGP_DUMP_MSG_HEADER +				       + BGP_DUMP_HEADER_SIZE) { +			stream_set_endp(obuf, endp); +			break; +		} -    entry_count++; -    endp = cur_endp; -  } +		entry_count++; +		endp = cur_endp; +	} -  /* Overwrite the entry count, now that we know the right number */ -  stream_putw_at (obuf, sizep, entry_count); +	/* Overwrite the entry count, now that we know the right number */ +	stream_putw_at(obuf, sizep, entry_count); -  bgp_dump_set_size (obuf, MSG_TABLE_DUMP_V2); -  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_routes.fp); +	bgp_dump_set_size(obuf, MSG_TABLE_DUMP_V2); +	fwrite(STREAM_DATA(obuf), stream_get_endp(obuf), 1, bgp_dump_routes.fp); -  return info; +	return info;  }  /* Runs under child process. */ -static unsigned int -bgp_dump_routes_func (int afi, int first_run, unsigned int seq) +static unsigned int bgp_dump_routes_func(int afi, int first_run, +					 unsigned int seq)  { -  struct bgp_info *info; -  struct bgp_node *rn; -  struct bgp *bgp; -  struct bgp_table *table; - -  bgp = bgp_get_default (); -  if (!bgp) -    return seq; - -  if (bgp_dump_routes.fp == NULL) -    return seq; - -  /* Note that bgp_dump_routes_index_table will do ipv4 and ipv6 peers, -     so this should only be done on the first call to bgp_dump_routes_func. -     ( this function will be called once for ipv4 and once for ipv6 ) */ -  if (first_run) -    bgp_dump_routes_index_table(bgp); - -  /* Walk down each BGP route. */ -  table = bgp->rib[afi][SAFI_UNICAST]; - -  for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) -    { -      info = rn->info; -      while (info) -      { -        info = bgp_dump_route_node_record (afi, rn, info, seq); -        seq++; -      } -    } +	struct bgp_info *info; +	struct bgp_node *rn; +	struct bgp *bgp; +	struct bgp_table *table; + +	bgp = bgp_get_default(); +	if (!bgp) +		return seq; + +	if (bgp_dump_routes.fp == NULL) +		return seq; + +	/* Note that bgp_dump_routes_index_table will do ipv4 and ipv6 peers, +	   so this should only be done on the first call to +	   bgp_dump_routes_func. +	   ( this function will be called once for ipv4 and once for ipv6 ) */ +	if (first_run) +		bgp_dump_routes_index_table(bgp); + +	/* Walk down each BGP route. */ +	table = bgp->rib[afi][SAFI_UNICAST]; + +	for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { +		info = rn->info; +		while (info) { +			info = bgp_dump_route_node_record(afi, rn, info, seq); +			seq++; +		} +	} -  fflush (bgp_dump_routes.fp); +	fflush(bgp_dump_routes.fp); -  return seq; +	return seq;  } -static int -bgp_dump_interval_func (struct thread *t) +static int bgp_dump_interval_func(struct thread *t)  { -  struct bgp_dump *bgp_dump; -  bgp_dump = THREAD_ARG (t); -  bgp_dump->t_interval = NULL; - -  /* Reschedule dump even if file couldn't be opened this time... */ -  if (bgp_dump_open_file (bgp_dump) != NULL) -    { -      /* In case of bgp_dump_routes, we need special route dump function. */ -      if (bgp_dump->type == BGP_DUMP_ROUTES) -	{ -	  unsigned int seq = bgp_dump_routes_func (AFI_IP, 1, 0); -	  bgp_dump_routes_func (AFI_IP6, 0, seq); -	  /* Close the file now. For a RIB dump there's no point in leaving -	   * it open until the next scheduled dump starts. */ -	  fclose(bgp_dump->fp); bgp_dump->fp = NULL; +	struct bgp_dump *bgp_dump; +	bgp_dump = THREAD_ARG(t); +	bgp_dump->t_interval = NULL; + +	/* Reschedule dump even if file couldn't be opened this time... */ +	if (bgp_dump_open_file(bgp_dump) != NULL) { +		/* In case of bgp_dump_routes, we need special route dump +		 * function. */ +		if (bgp_dump->type == BGP_DUMP_ROUTES) { +			unsigned int seq = bgp_dump_routes_func(AFI_IP, 1, 0); +			bgp_dump_routes_func(AFI_IP6, 0, seq); +			/* Close the file now. For a RIB dump there's no point +			 * in leaving +			 * it open until the next scheduled dump starts. */ +			fclose(bgp_dump->fp); +			bgp_dump->fp = NULL; +		}  	} -    } -  /* if interval is set reschedule */ -  if (bgp_dump->interval > 0) -    bgp_dump_interval_add (bgp_dump, bgp_dump->interval); +	/* if interval is set reschedule */ +	if (bgp_dump->interval > 0) +		bgp_dump_interval_add(bgp_dump, bgp_dump->interval); -  return 0; +	return 0;  }  /* Dump common information. */ -static void -bgp_dump_common (struct stream *obuf, struct peer *peer, int forceas4) +static void bgp_dump_common(struct stream *obuf, struct peer *peer, +			    int forceas4)  { -  char empty[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - -  /* Source AS number and Destination AS number. */ -  if (forceas4 || CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV) ) -    { -      stream_putl (obuf, peer->as); -      stream_putl (obuf, peer->local_as); -    } -  else -    { -      stream_putw (obuf, peer->as); -      stream_putw (obuf, peer->local_as); -    } - -  if (peer->su.sa.sa_family == AF_INET) -    { -      stream_putw (obuf, peer->ifindex); -      stream_putw (obuf, AFI_IP); - -      stream_put (obuf, &peer->su.sin.sin_addr, IPV4_MAX_BYTELEN); - -      if (peer->su_local) -	stream_put (obuf, &peer->su_local->sin.sin_addr, IPV4_MAX_BYTELEN); -      else -	stream_put (obuf, empty, IPV4_MAX_BYTELEN); -    } -  else if (peer->su.sa.sa_family == AF_INET6) -    { -      /* Interface Index and Address family. */ -      stream_putw (obuf, peer->ifindex); -      stream_putw (obuf, AFI_IP6); - -      /* Source IP Address and Destination IP Address. */ -      stream_put (obuf, &peer->su.sin6.sin6_addr, IPV6_MAX_BYTELEN); +	char empty[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +	/* Source AS number and Destination AS number. */ +	if (forceas4 || CHECK_FLAG(peer->cap, PEER_CAP_AS4_RCV)) { +		stream_putl(obuf, peer->as); +		stream_putl(obuf, peer->local_as); +	} else { +		stream_putw(obuf, peer->as); +		stream_putw(obuf, peer->local_as); +	} -      if (peer->su_local) -	stream_put (obuf, &peer->su_local->sin6.sin6_addr, IPV6_MAX_BYTELEN); -      else -	stream_put (obuf, empty, IPV6_MAX_BYTELEN); -    } +	if (peer->su.sa.sa_family == AF_INET) { +		stream_putw(obuf, peer->ifindex); +		stream_putw(obuf, AFI_IP); + +		stream_put(obuf, &peer->su.sin.sin_addr, IPV4_MAX_BYTELEN); + +		if (peer->su_local) +			stream_put(obuf, &peer->su_local->sin.sin_addr, +				   IPV4_MAX_BYTELEN); +		else +			stream_put(obuf, empty, IPV4_MAX_BYTELEN); +	} else if (peer->su.sa.sa_family == AF_INET6) { +		/* Interface Index and Address family. */ +		stream_putw(obuf, peer->ifindex); +		stream_putw(obuf, AFI_IP6); + +		/* Source IP Address and Destination IP Address. */ +		stream_put(obuf, &peer->su.sin6.sin6_addr, IPV6_MAX_BYTELEN); + +		if (peer->su_local) +			stream_put(obuf, &peer->su_local->sin6.sin6_addr, +				   IPV6_MAX_BYTELEN); +		else +			stream_put(obuf, empty, IPV6_MAX_BYTELEN); +	}  }  /* Dump BGP status change. */ -void -bgp_dump_state (struct peer *peer, int status_old, int status_new) +void bgp_dump_state(struct peer *peer, int status_old, int status_new)  { -  struct stream *obuf; +	struct stream *obuf; -  /* If dump file pointer is disabled return immediately. */ -  if (bgp_dump_all.fp == NULL) -    return; +	/* If dump file pointer is disabled return immediately. */ +	if (bgp_dump_all.fp == NULL) +		return; -  /* Make dump stream. */ -  obuf = bgp_dump_obuf; -  stream_reset (obuf); +	/* Make dump stream. */ +	obuf = bgp_dump_obuf; +	stream_reset(obuf); -  bgp_dump_header (obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_STATE_CHANGE_AS4, -		   bgp_dump_all.type); -  bgp_dump_common (obuf, peer, 1);/* force this in as4speak*/ +	bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_STATE_CHANGE_AS4, +			bgp_dump_all.type); +	bgp_dump_common(obuf, peer, 1); /* force this in as4speak*/ -  stream_putw (obuf, status_old); -  stream_putw (obuf, status_new); +	stream_putw(obuf, status_old); +	stream_putw(obuf, status_new); -  /* Set length. */ -  bgp_dump_set_size (obuf, MSG_PROTOCOL_BGP4MP); +	/* Set length. */ +	bgp_dump_set_size(obuf, MSG_PROTOCOL_BGP4MP); -  /* Write to the stream. */ -  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_all.fp); -  fflush (bgp_dump_all.fp); +	/* Write to the stream. */ +	fwrite(STREAM_DATA(obuf), stream_get_endp(obuf), 1, bgp_dump_all.fp); +	fflush(bgp_dump_all.fp);  } -static void -bgp_dump_packet_func (struct bgp_dump *bgp_dump, struct peer *peer, -		      struct stream *packet) +static void bgp_dump_packet_func(struct bgp_dump *bgp_dump, struct peer *peer, +				 struct stream *packet)  { -  struct stream *obuf; - -  /* If dump file pointer is disabled return immediately. */ -  if (bgp_dump->fp == NULL) -    return; - -  /* Make dump stream. */ -  obuf = bgp_dump_obuf; -  stream_reset (obuf); +	struct stream *obuf; + +	/* If dump file pointer is disabled return immediately. */ +	if (bgp_dump->fp == NULL) +		return; + +	/* Make dump stream. */ +	obuf = bgp_dump_obuf; +	stream_reset(obuf); + +	/* Dump header and common part. */ +	if (CHECK_FLAG(peer->cap, PEER_CAP_AS4_RCV)) { +		bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_MESSAGE_AS4, +				bgp_dump->type); +	} else { +		bgp_dump_header(obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_MESSAGE, +				bgp_dump->type); +	} +	bgp_dump_common(obuf, peer, 0); -  /* Dump header and common part. */ -  if (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV) ) -    {  -      bgp_dump_header (obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_MESSAGE_AS4, -		       bgp_dump->type); -    } -  else -    { -      bgp_dump_header (obuf, MSG_PROTOCOL_BGP4MP, BGP4MP_MESSAGE, -		       bgp_dump->type); -    } -  bgp_dump_common (obuf, peer, 0); +	/* Packet contents. */ +	stream_put(obuf, STREAM_DATA(packet), stream_get_endp(packet)); -  /* Packet contents. */ -  stream_put (obuf, STREAM_DATA (packet), stream_get_endp (packet)); -   -  /* Set length. */ -  bgp_dump_set_size (obuf, MSG_PROTOCOL_BGP4MP); +	/* Set length. */ +	bgp_dump_set_size(obuf, MSG_PROTOCOL_BGP4MP); -  /* Write to the stream. */ -  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump->fp); -  fflush (bgp_dump->fp); +	/* Write to the stream. */ +	fwrite(STREAM_DATA(obuf), stream_get_endp(obuf), 1, bgp_dump->fp); +	fflush(bgp_dump->fp);  }  /* Called from bgp_packet.c when BGP packet is received. */ -void -bgp_dump_packet (struct peer *peer, int type, struct stream *packet) +void bgp_dump_packet(struct peer *peer, int type, struct stream *packet)  { -  /* bgp_dump_all. */ -  bgp_dump_packet_func (&bgp_dump_all, peer, packet); +	/* bgp_dump_all. */ +	bgp_dump_packet_func(&bgp_dump_all, peer, packet); -  /* bgp_dump_updates. */ -  if (type == BGP_MSG_UPDATE) -    bgp_dump_packet_func (&bgp_dump_updates, peer, packet); +	/* bgp_dump_updates. */ +	if (type == BGP_MSG_UPDATE) +		bgp_dump_packet_func(&bgp_dump_updates, peer, packet);  } -static unsigned int -bgp_dump_parse_time (const char *str) +static unsigned int bgp_dump_parse_time(const char *str)  { -  int i; -  int len; -  int seen_h; -  int seen_m; -  int time; -  unsigned int total; - -  time = 0; -  total = 0; -  seen_h = 0; -  seen_m = 0; -  len = strlen (str); - -  for (i = 0; i < len; i++) -    { -      if (isdigit ((int) str[i])) -	{ -	  time *= 10; -	  time += str[i] - '0'; +	int i; +	int len; +	int seen_h; +	int seen_m; +	int time; +	unsigned int total; + +	time = 0; +	total = 0; +	seen_h = 0; +	seen_m = 0; +	len = strlen(str); + +	for (i = 0; i < len; i++) { +		if (isdigit((int)str[i])) { +			time *= 10; +			time += str[i] - '0'; +		} else if (str[i] == 'H' || str[i] == 'h') { +			if (seen_h) +				return 0; +			if (seen_m) +				return 0; +			total += time * 60 * 60; +			time = 0; +			seen_h = 1; +		} else if (str[i] == 'M' || str[i] == 'm') { +			if (seen_m) +				return 0; +			total += time * 60; +			time = 0; +			seen_h = 1; +		} else +			return 0;  	} -      else if (str[i] == 'H' || str[i] == 'h') -	{ -	  if (seen_h) -	    return 0; -	  if (seen_m) -	    return 0; -	  total += time * 60 *60; -	  time = 0; -	  seen_h = 1; -	} -      else if (str[i] == 'M' || str[i] == 'm') -	{ -	  if (seen_m) -	    return 0; -	  total += time * 60; -	  time = 0; -	  seen_h = 1; -	} -      else -	return 0; -    } -  return total + time; +	return total + time;  } -static int -bgp_dump_set (struct vty *vty, struct bgp_dump *bgp_dump, -              enum bgp_dump_type type, const char *path, -              const char *interval_str) +static int bgp_dump_set(struct vty *vty, struct bgp_dump *bgp_dump, +			enum bgp_dump_type type, const char *path, +			const char *interval_str)  { -  unsigned int interval; -   -  /* Don't schedule duplicate dumps if the dump command is given twice */ -  if (bgp_dump->filename && strcmp(path, bgp_dump->filename) == 0 -      && type == bgp_dump->type) -    { -      if (interval_str) -	{ -          if (bgp_dump->interval_str && -	      strcmp(bgp_dump->interval_str, interval_str) == 0) -            return CMD_SUCCESS; -        } -      else -        { -          if (!bgp_dump->interval_str) -            return CMD_SUCCESS; -        } -    } - -  /* Removing previous config */ -  bgp_dump_unset(bgp_dump); - -  if (interval_str) -    { -      /* Check interval string. */ -      interval = bgp_dump_parse_time (interval_str); -      if (interval == 0) -	{ -	  vty_out (vty, "Malformed interval string%s", VTY_NEWLINE); -	  return CMD_WARNING; +	unsigned int interval; + +	/* Don't schedule duplicate dumps if the dump command is given twice */ +	if (bgp_dump->filename && strcmp(path, bgp_dump->filename) == 0 +	    && type == bgp_dump->type) { +		if (interval_str) { +			if (bgp_dump->interval_str +			    && strcmp(bgp_dump->interval_str, interval_str) +				       == 0) +				return CMD_SUCCESS; +		} else { +			if (!bgp_dump->interval_str) +				return CMD_SUCCESS; +		}  	} -      /* Setting interval string */ -      bgp_dump->interval_str = XSTRDUP(MTYPE_BGP_DUMP_STR, interval_str); -    } -  else -    { -      interval = 0; -    } +	/* Removing previous config */ +	bgp_dump_unset(bgp_dump); + +	if (interval_str) { +		/* Check interval string. */ +		interval = bgp_dump_parse_time(interval_str); +		if (interval == 0) { +			vty_out(vty, "Malformed interval string%s", +				VTY_NEWLINE); +			return CMD_WARNING; +		} + +		/* Setting interval string */ +		bgp_dump->interval_str = +			XSTRDUP(MTYPE_BGP_DUMP_STR, interval_str); +	} else { +		interval = 0; +	} -  /* Set type. */ -  bgp_dump->type = type; +	/* Set type. */ +	bgp_dump->type = type; -  /* Set interval */ -  bgp_dump->interval = interval; +	/* Set interval */ +	bgp_dump->interval = interval; -  /* Set file name. */ -  bgp_dump->filename = XSTRDUP (MTYPE_BGP_DUMP_STR, path); +	/* Set file name. */ +	bgp_dump->filename = XSTRDUP(MTYPE_BGP_DUMP_STR, path); -  /* Create interval thread. */ -  bgp_dump_interval_add (bgp_dump, interval); +	/* Create interval thread. */ +	bgp_dump_interval_add(bgp_dump, interval); -  /* This should be called when interval is expired. */ -  bgp_dump_open_file (bgp_dump); +	/* This should be called when interval is expired. */ +	bgp_dump_open_file(bgp_dump); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -static int -bgp_dump_unset (struct bgp_dump *bgp_dump) +static int bgp_dump_unset(struct bgp_dump *bgp_dump)  { -  /* Removing file name. */ -  if (bgp_dump->filename) -    { -      XFREE(MTYPE_BGP_DUMP_STR, bgp_dump->filename); -      bgp_dump->filename = NULL; -    } +	/* Removing file name. */ +	if (bgp_dump->filename) { +		XFREE(MTYPE_BGP_DUMP_STR, bgp_dump->filename); +		bgp_dump->filename = NULL; +	} -  /* Closing file. */ -  if (bgp_dump->fp) -    { -      fclose (bgp_dump->fp); -      bgp_dump->fp = NULL; -    } +	/* Closing file. */ +	if (bgp_dump->fp) { +		fclose(bgp_dump->fp); +		bgp_dump->fp = NULL; +	} -  /* Removing interval thread. */ -  if (bgp_dump->t_interval) -    { -      thread_cancel (bgp_dump->t_interval); -      bgp_dump->t_interval = NULL; -    } +	/* Removing interval thread. */ +	if (bgp_dump->t_interval) { +		thread_cancel(bgp_dump->t_interval); +		bgp_dump->t_interval = NULL; +	} -  bgp_dump->interval = 0; +	bgp_dump->interval = 0; -  /* Removing interval string. */ -  if (bgp_dump->interval_str) -    { -      XFREE(MTYPE_BGP_DUMP_STR, bgp_dump->interval_str); -      bgp_dump->interval_str = NULL; -    } -   -  return CMD_SUCCESS; +	/* Removing interval string. */ +	if (bgp_dump->interval_str) { +		XFREE(MTYPE_BGP_DUMP_STR, bgp_dump->interval_str); +		bgp_dump->interval_str = NULL; +	} + +	return CMD_SUCCESS;  }  DEFUN (dump_bgp_all, @@ -742,40 +700,39 @@ DEFUN (dump_bgp_all,         "Output filename\n"         "Interval of output\n")  { -  int idx_dump_routes = 2; -  int idx_path = 3; -  int idx_interval = 4; -  int bgp_dump_type = 0; -  const char *interval = NULL; -  struct bgp_dump *bgp_dump_struct = NULL; -  const struct bgp_dump_type_map *map = NULL; - -  for (map = bgp_dump_type_map; map->str; map++) -    if (strcmp(argv[idx_dump_routes]->arg, map->str) == 0) -      bgp_dump_type = map->type; - -  switch (bgp_dump_type) -    { -      case BGP_DUMP_ALL: -      case BGP_DUMP_ALL_ET: -        bgp_dump_struct = &bgp_dump_all; -        break; -      case BGP_DUMP_UPDATES: -      case BGP_DUMP_UPDATES_ET: -        bgp_dump_struct = &bgp_dump_updates; -        break; -      case BGP_DUMP_ROUTES: -      default: -        bgp_dump_struct = &bgp_dump_routes; -        break; -    } +	int idx_dump_routes = 2; +	int idx_path = 3; +	int idx_interval = 4; +	int bgp_dump_type = 0; +	const char *interval = NULL; +	struct bgp_dump *bgp_dump_struct = NULL; +	const struct bgp_dump_type_map *map = NULL; + +	for (map = bgp_dump_type_map; map->str; map++) +		if (strcmp(argv[idx_dump_routes]->arg, map->str) == 0) +			bgp_dump_type = map->type; + +	switch (bgp_dump_type) { +	case BGP_DUMP_ALL: +	case BGP_DUMP_ALL_ET: +		bgp_dump_struct = &bgp_dump_all; +		break; +	case BGP_DUMP_UPDATES: +	case BGP_DUMP_UPDATES_ET: +		bgp_dump_struct = &bgp_dump_updates; +		break; +	case BGP_DUMP_ROUTES: +	default: +		bgp_dump_struct = &bgp_dump_routes; +		break; +	} -  /* When an interval is given */ -  if (argc == idx_interval + 1) -      interval = argv[idx_interval]->arg; +	/* When an interval is given */ +	if (argc == idx_interval + 1) +		interval = argv[idx_interval]->arg; -  return bgp_dump_set (vty, bgp_dump_struct, bgp_dump_type, -                       argv[idx_path]->arg, interval); +	return bgp_dump_set(vty, bgp_dump_struct, bgp_dump_type, +			    argv[idx_path]->arg, interval);  }  DEFUN (no_dump_bgp_all, @@ -792,41 +749,35 @@ DEFUN (no_dump_bgp_all,         "Output filename\n"         "Interval of output\n")  { -  int idx_dump_routes = 3; -  int bgp_dump_type = 0; -  const struct bgp_dump_type_map *map = NULL; -  struct bgp_dump *bgp_dump_struct = NULL; - -  for (map = bgp_dump_type_map; map->str; map++) -    if (strcmp(argv[idx_dump_routes]->arg, map->str) == 0) -      bgp_dump_type = map->type; - -  switch (bgp_dump_type) -    { -    case BGP_DUMP_ALL: -    case BGP_DUMP_ALL_ET: -      bgp_dump_struct = &bgp_dump_all; -      break; -    case BGP_DUMP_UPDATES: -    case BGP_DUMP_UPDATES_ET: -      bgp_dump_struct = &bgp_dump_updates; -      break; -    case BGP_DUMP_ROUTES: -    default: -      bgp_dump_struct = &bgp_dump_routes; -      break; -    } +	int idx_dump_routes = 3; +	int bgp_dump_type = 0; +	const struct bgp_dump_type_map *map = NULL; +	struct bgp_dump *bgp_dump_struct = NULL; + +	for (map = bgp_dump_type_map; map->str; map++) +		if (strcmp(argv[idx_dump_routes]->arg, map->str) == 0) +			bgp_dump_type = map->type; + +	switch (bgp_dump_type) { +	case BGP_DUMP_ALL: +	case BGP_DUMP_ALL_ET: +		bgp_dump_struct = &bgp_dump_all; +		break; +	case BGP_DUMP_UPDATES: +	case BGP_DUMP_UPDATES_ET: +		bgp_dump_struct = &bgp_dump_updates; +		break; +	case BGP_DUMP_ROUTES: +	default: +		bgp_dump_struct = &bgp_dump_routes; +		break; +	} -  return bgp_dump_unset (bgp_dump_struct); +	return bgp_dump_unset(bgp_dump_struct);  }  /* BGP node structure. */ -static struct cmd_node bgp_dump_node = -{ -  DUMP_NODE, -  "", -  1 -}; +static struct cmd_node bgp_dump_node = {DUMP_NODE, "", 1};  #if 0  char * @@ -854,75 +805,69 @@ config_time2str (unsigned int interval)  }  #endif -static int -config_write_bgp_dump (struct vty *vty) +static int config_write_bgp_dump(struct vty *vty)  { -  if (bgp_dump_all.filename) -    { -      const char *type_str = "all"; -      if (bgp_dump_all.type == BGP_DUMP_ALL_ET) -          type_str = "all-et"; - -      if (bgp_dump_all.interval_str) -	vty_out (vty, "dump bgp %s %s %s%s", type_str, -		 bgp_dump_all.filename, bgp_dump_all.interval_str, -		 VTY_NEWLINE); -      else -	vty_out (vty, "dump bgp %s %s%s", type_str, -		 bgp_dump_all.filename, VTY_NEWLINE); -    } -  if (bgp_dump_updates.filename) -    { -      const char *type_str = "updates"; -      if (bgp_dump_updates.type == BGP_DUMP_UPDATES_ET) -        type_str = "updates-et"; - -      if (bgp_dump_updates.interval_str) -	vty_out (vty, "dump bgp %s %s %s%s", type_str, -		 bgp_dump_updates.filename, bgp_dump_updates.interval_str, -		 VTY_NEWLINE); -      else -	vty_out (vty, "dump bgp %s %s%s", type_str, -		 bgp_dump_updates.filename, VTY_NEWLINE); -    } -  if (bgp_dump_routes.filename) -    { -      if (bgp_dump_routes.interval_str) -	vty_out (vty, "dump bgp routes-mrt %s %s%s",  -		 bgp_dump_routes.filename, bgp_dump_routes.interval_str, -		 VTY_NEWLINE); -      else -        vty_out (vty, "dump bgp routes-mrt %s%s", -                 bgp_dump_routes.filename, VTY_NEWLINE); - -    } -  return 0; +	if (bgp_dump_all.filename) { +		const char *type_str = "all"; +		if (bgp_dump_all.type == BGP_DUMP_ALL_ET) +			type_str = "all-et"; + +		if (bgp_dump_all.interval_str) +			vty_out(vty, "dump bgp %s %s %s%s", type_str, +				bgp_dump_all.filename, +				bgp_dump_all.interval_str, VTY_NEWLINE); +		else +			vty_out(vty, "dump bgp %s %s%s", type_str, +				bgp_dump_all.filename, VTY_NEWLINE); +	} +	if (bgp_dump_updates.filename) { +		const char *type_str = "updates"; +		if (bgp_dump_updates.type == BGP_DUMP_UPDATES_ET) +			type_str = "updates-et"; + +		if (bgp_dump_updates.interval_str) +			vty_out(vty, "dump bgp %s %s %s%s", type_str, +				bgp_dump_updates.filename, +				bgp_dump_updates.interval_str, VTY_NEWLINE); +		else +			vty_out(vty, "dump bgp %s %s%s", type_str, +				bgp_dump_updates.filename, VTY_NEWLINE); +	} +	if (bgp_dump_routes.filename) { +		if (bgp_dump_routes.interval_str) +			vty_out(vty, "dump bgp routes-mrt %s %s%s", +				bgp_dump_routes.filename, +				bgp_dump_routes.interval_str, VTY_NEWLINE); +		else +			vty_out(vty, "dump bgp routes-mrt %s%s", +				bgp_dump_routes.filename, VTY_NEWLINE); +	} +	return 0;  }  /* Initialize BGP packet dump functionality. */ -void -bgp_dump_init (void) +void bgp_dump_init(void)  { -  memset (&bgp_dump_all, 0, sizeof (struct bgp_dump)); -  memset (&bgp_dump_updates, 0, sizeof (struct bgp_dump)); -  memset (&bgp_dump_routes, 0, sizeof (struct bgp_dump)); +	memset(&bgp_dump_all, 0, sizeof(struct bgp_dump)); +	memset(&bgp_dump_updates, 0, sizeof(struct bgp_dump)); +	memset(&bgp_dump_routes, 0, sizeof(struct bgp_dump)); -  bgp_dump_obuf = stream_new ((BGP_MAX_PACKET_SIZE << 1) -                              + BGP_DUMP_MSG_HEADER + BGP_DUMP_HEADER_SIZE); +	bgp_dump_obuf = +		stream_new((BGP_MAX_PACKET_SIZE << 1) + BGP_DUMP_MSG_HEADER +			   + BGP_DUMP_HEADER_SIZE); -  install_node (&bgp_dump_node, config_write_bgp_dump); +	install_node(&bgp_dump_node, config_write_bgp_dump); -  install_element (CONFIG_NODE, &dump_bgp_all_cmd); -  install_element (CONFIG_NODE, &no_dump_bgp_all_cmd); +	install_element(CONFIG_NODE, &dump_bgp_all_cmd); +	install_element(CONFIG_NODE, &no_dump_bgp_all_cmd);  } -void -bgp_dump_finish (void) +void bgp_dump_finish(void)  { -  bgp_dump_unset (&bgp_dump_all); -  bgp_dump_unset (&bgp_dump_updates); -  bgp_dump_unset (&bgp_dump_routes); +	bgp_dump_unset(&bgp_dump_all); +	bgp_dump_unset(&bgp_dump_updates); +	bgp_dump_unset(&bgp_dump_routes); -  stream_free (bgp_dump_obuf); -  bgp_dump_obuf = NULL; +	stream_free(bgp_dump_obuf); +	bgp_dump_obuf = NULL;  }  | 
