| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140 | 
							- /*
 
-  Copyright (c) 2007 - 2010 RIPE NCC - All Rights Reserved
 
-  
 
-  Permission to use, copy, modify, and distribute this software and its
 
-  documentation for any purpose and without fee is hereby granted, provided
 
-  that the above copyright notice appear in all copies and that both that
 
-  copyright notice and this permission notice appear in supporting
 
-  documentation, and that the name of the author not be used in advertising or
 
-  publicity pertaining to distribution of the software without specific,
 
-  written prior permission.
 
-  
 
-  THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 
-  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
 
-  AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
 
-  DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
 
-  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 
-  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-  
 
- Parts of this code have been engineered after analiyzing GNU Zebra's
 
- source code and therefore might contain declarations/code from GNU
 
- Zebra, Copyright (C) 1999 Kunihiro Ishiguro. Zebra is a free routing
 
- software, distributed under the GNU General Public License. A copy of
 
- this license is included with libbgpdump.
 
- Original Author: Shufu Mao(msf98@mails.tsinghua.edu.cn) 
 
- */
 
- #include "bgpdump-config.h"
 
- #include "bgpdump_lib.h"
 
- #include "util.h"
 
- #include <time.h>
 
- #include <unistd.h>
 
- #include <fcntl.h>
 
- #include <stdlib.h>
 
- #include <netinet/in.h>
 
- #include <sys/socket.h>
 
- #include <arpa/inet.h>
 
- #include <stdbool.h>
 
- static void process(BGPDUMP_ENTRY *entry);
 
- static void process_bgpdump_mrtd_bgp(BGPDUMP_ENTRY *entry);
 
- static void show_ipv4_address(struct in_addr ip);
 
- static void show_attr(attributes_t *attr);
 
- static void show_prefixes(int count,struct prefix *prefix, int addpath);
 
- static void table_line_announce_1(struct mp_nlri *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str);
 
- static void table_line_announce(struct prefix *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str);
 
- static void mrtd_table_line_withdraw(struct prefix *prefix, int count, BGPDUMP_ENTRY *entry, char *time_str);
 
- static void mrtd_table_line_announce(struct prefix *prefix, int count, BGPDUMP_ENTRY *entry, char *time_str);
 
- static void table_line_withdraw(struct prefix *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str);
 
- static void table_line_mrtd_route(BGPDUMP_MRTD_TABLE_DUMP *route,BGPDUMP_ENTRY *entry);
 
- static void table_line_dump_v2_prefix(BGPDUMP_TABLE_DUMP_V2_PREFIX *e,BGPDUMP_ENTRY *entry);
 
- static char *describe_origin(int origin);
 
- static int  bgp4mp_message_direction_receive(BGPDUMP_ENTRY *entry);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
-     void show_prefixes6(int count,struct prefix *prefix, int addpath);
 
-     static void table_line_withdraw6(struct prefix *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str);
 
-     static void table_line_announce6(struct mp_nlri *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str);
 
- #endif
 
- static void show_line_prefix(const char* format, const char* time_str, const char* type);
 
- /* If no aspath was present as a string in the packet, return an empty string
 
-  * so everything stays machine parsable */
 
- static char *attr_aspath(attributes_t *a) {
 
-     if(a->flag & ATTR_FLAG_BIT(BGP_ATTR_AS_PATH) && a->aspath && a->aspath->str) {
 
-         return a->aspath->str;
 
-     }
 
-     return "";
 
- }
 
- /* Helper function to return the direction of a BGP4MP_MESSAGE
 
-  * returns true if it is a received message, false if it is a sent message */
 
- static int bgp4mp_message_direction_receive(BGPDUMP_ENTRY *entry) {
 
- 	switch(entry->subtype) {
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_LOCAL:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4_LOCAL:
 
- 			return 0;
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4:
 
- 		default:
 
- 			return 1;
 
- 	}
 
- }
 
- /* Helper function that returns the format of a BGP4MP_MESSAGE as a string:
 
-  - BGP4MP (Standard)
 
-  - BGP4MP_ET (Extended Header)
 
-  - BGP4MP_LOCAL (Local)
 
-  - BGP4MP_ET_LOCAL (Local and Extended Header)
 
-  - BGP4MP_AP (Standard, Additional Paths)
 
-  - BGP4MP_ET_AP (Extended Header, Additional Paths)
 
-  - BGP4MP_LOCAL_AP (Local, Additional Paths)
 
-  - BGP4MP_ET_LOCAL_AP (Local, Extended Header, Additional Paths)
 
-  */
 
- static const char* get_bgp4mp_format(BGPDUMP_ENTRY *entry) {
 
-     if (entry->type == BGPDUMP_TYPE_ZEBRA_BGP_ET && !bgp4mp_message_direction_receive(entry)) {
 
-         if (is_addpath(entry)) {
 
-             return "BGP4MP_ET_LOCAL_AP";
 
-         } else {
 
-             return "BGP4MP_ET_LOCAL";
 
-         }
 
-     } else if (entry->type == BGPDUMP_TYPE_ZEBRA_BGP_ET) {
 
-         if (is_addpath(entry)) {
 
-             return "BGP4MP_ET_AP";
 
-         } else {
 
-             return "BGP4MP_ET";
 
-         }
 
-     } else if (!bgp4mp_message_direction_receive(entry)) {
 
-         if (is_addpath(entry)) {
 
-             return "BGP4MP_LOCAL_AP";
 
-         } else {
 
-             return "BGP4MP_LOCAL";
 
-         }
 
-     } else if (is_addpath(entry)) {
 
-         return "BGP4MP_AP";
 
-     } else {
 
-         return "BGP4MP";
 
-     }
 
- }
 
- static const char* get_bgp_state_name(u_int16_t state) {
 
-     const char *bgp_state_name[] = {
 
-         "Unknown",
 
-         "Idle",
 
-         "Connect",
 
-         "Active",
 
-         "Opensent",
 
-         "Openconfirm",
 
-         "Established",
 
-         /* not defined in RFC 6396 but quagga puts them into update files */
 
-         "Clearing",
 
-         "Deleted",
 
-         NULL
 
-     };
 
-     if (state && state >= (sizeof(bgp_state_name)) / (sizeof(*bgp_state_name))) {
 
-         return "Unknown";
 
-     } else {
 
-         return bgp_state_name[state];
 
-     }
 
- }
 
- /* Check if -u (compact attributes) is enabled and append a field
 
-  * to the output to show any unknown attributes. */
 
- static void append_compact_unknown_attributes(attributes_t *attr) {
 
- 	for(int i = 0; i < attr->unknown_num; i++) {
 
- 		struct unknown_attr *ua = &(attr->unknown[i]);
 
- 		printf("%02x:%02x:", ua->type, ua->flag);
 
- 		for(size_t s = 0; s < ua->len; s++) {
 
- 			printf("%02x", (uint8_t)(ua->raw[s]));
 
- 		}
 
- 		if(i < attr->unknown_num - 1) {
 
- 			printf(" ");
 
- 		}
 
- 	}
 
- 	printf("|");
 
- }
 
- static int mode=0;
 
- static int timetype=0;
 
- static int show_packet_index = 0;
 
- static int show_large_comms = 0;
 
- static int show_unknown_attributes = 0;
 
- static int packet_index = 0;
 
- static const char USAGE[] = "\
 
- bgpdump version " PACKAGE_VERSION "\n\
 
- Usage: bgpdump [-m|-M] [-t dump|-t change] [-O <output-file>] <input-file>\n\
 
- bgpdump translates binary MRT files (possibly compressed) into readable output\n\
 
- Output mode:\n\
 
-     -H         multi-line, human-readable (the default)\n\
 
-     -m         one-line per entry with unix timestamps\n\
 
-     -M         one-line per entry with human readable timestamps\n\
 
-     (there are other differences between -m and -M)\n\
 
- \n\
 
- Common options:\n\
 
-     -O <file>  output to <file> instead of STDOUT\n\
 
-     -s         log to syslog (the default)\n\
 
-     -v         log to STDERR\n\
 
-     -q         quiet\n\
 
- \n\
 
- Options for -m and -M modes:\n\
 
-     -t dump    timestamps for RIB dumps reflect the time of the dump (the default)\n\
 
-     -t change  timestamps for RIB dumps reflect the last route modification\n\
 
-     -p         show packet index at second position\n\
 
-     -l         show large communities field after regular communities\n\
 
-     -u         show unassigned attributes in one-line mode\n\
 
- \n\
 
- Special options:\n\
 
-     -T         run unit tests and exit\n\
 
- \n";
 
- extern char *optarg;
 
- extern int optind;
 
- int main(int argc, char *argv[]) {
 
-     
 
-     int c;
 
-     int fd;
 
-     bool usage_error = false;
 
-     bool use_syslog = true;
 
-     bool quiet = false;
 
-  
 
-     log_to_stderr();
 
-     
 
-     while ((c=getopt(argc,argv,"if:o:t:mMHO:svTplqu"))!=-1)
 
- 	switch(c)
 
- 	{
 
-        case 'H':
 
-                 mode=0;
 
-                 break;
 
- 	case 'm':
 
-                 mode=1;
 
-                 break;
 
- 	case 'M':
 
-                 mode=2;
 
-                 break;
 
- 	case 't':
 
-                 if(strcmp(optarg,"dump")==0){
 
-                     timetype=0;
 
-                 } else if(strcmp(optarg,"change")==0){
 
-                     timetype=1;
 
-                 } else {
 
-                     printf("unknown -t option\n");
 
-                     exit(1);
 
-                 }
 
-                 break;
 
-         case 'O':
 
-                 fprintf(stderr, "redirecting output to '%s'\n", optarg); 
 
-                 fd = open(optarg, O_WRONLY|O_CREAT, 0666);
 
-                 if(fd < 0 || 0 > dup2(fd, STDOUT_FILENO)) {
 
-                         perror("can't open output file");
 
-                         exit(1);
 
-                 }
 
-                 break;
 
-         case 's':
 
-                 use_syslog = true;
 
-                 break;
 
-         case 'v':
 
-                 use_syslog = false;
 
-                 break;
 
-         case 'i':
 
-         case 'f':
 
-         case 'o':
 
-                 warn("ignoring option '-%c'", c);
 
-                 break;
 
-         case 'T':
 
-                 test_fmt_ip();
 
-                 test_utils();
 
-                 exit(0);
 
-         case 'p':
 
-                 show_packet_index = 1;
 
-                 break;
 
-         case 'l':
 
-                 show_large_comms = 1;
 
-                 break;
 
-         case 'u':
 
-                 show_unknown_attributes = 1;
 
-                 break;
 
-         case 'q':
 
-                 quiet = true;
 
-                 break;
 
-         case '?':
 
-         default:
 
-                 usage_error = true;
 
- 	}
 
-     argc -= optind;
 
-     argv += optind;
 
-     
 
-     if(use_syslog) {
 
-         if(!quiet)
 
-             debug("logging to syslog");
 
-         log_to_syslog();
 
-     }
 
-     
 
-     if(usage_error || argc != 1) {
 
-         if(argc != 1)
 
-             err("you must supply exactly one file to process");
 
-         fprintf(stderr, "%s", USAGE);
 
-         exit(1);        
 
-     }
 
-     // more efficient then line buffering
 
-     //    static char buffer[16000];
 
-     //    setbuffer(stdout, buffer, sizeof buffer);
 
-     
 
-     BGPDUMP *my_dump = bgpdump_open_dump(argv[0]);
 
-     if(! my_dump)
 
-         return 1;
 
-     
 
-     do {
 
-         BGPDUMP_ENTRY *my_entry = bgpdump_read_next(my_dump);
 
- 	if(my_entry) {
 
- 	    process(my_entry);
 
- 	    bgpdump_free_mem(my_entry);
 
-             packet_index++;
 
- 	}
 
-     } while(my_dump->eof==0);
 
-     bgpdump_close_dump(my_dump);
 
-     
 
-     return 0;
 
- }
 
- void process(BGPDUMP_ENTRY *entry) {
 
- 	struct tm *date;
 
- 	char time_str[128];
 
- 	char time_str2[128];
 
- 	char time_str_fixed[128];
 
-     char prefix[BGPDUMP_ADDRSTRLEN];
 
-     char *bgp4mp_format;
 
-     char *bgp4mp_subtype_format;
 
-     int len;
 
- 	
 
- 	date=gmtime(&entry->time);
 
- 	time2str(date,time_str_fixed);
 
-     
 
-     if (mode == 1) {
 
-         // Timestamp mode
 
-         len = sprintf(time_str, "%lld", (long long)entry->time);
 
-     } else {
 
-         len = time2str(date,time_str);
 
-     }
 
-     // Appending microseconds to time_str if needed
 
-     if (entry->type == BGPDUMP_TYPE_ZEBRA_BGP_ET) {
 
-         sprintf(time_str + len, ".%06ld", entry->ms);
 
-     }
 
-     
 
- 	if (mode==0)
 
- 	{
 
- 		printf("TIME: %s\n", time_str);
 
- 	}	
 
-     //printf("TIME: %s",asctime(gmtime(&entry->time)));
 
-     //printf("LENGTH          : %u\n", entry->length);
 
-     switch(entry->type) {
 
- 	case BGPDUMP_TYPE_MRTD_TABLE_DUMP:
 
- 	     if(mode==0){
 
- 	        const char *prefix_str = NULL;
 
- 		switch(entry->subtype){
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 	    	case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP6:
 
- 	    		printf("TYPE: TABLE_DUMP/INET6\n");
 
- 			prefix_str = fmt_ipv6(entry->body.mrtd_table_dump.prefix,prefix);
 
- 		break;
 
- 	    	case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP6_32BIT_AS:
 
- 	    		printf("TYPE: TABLE_DUMP/INET6_32BIT_AS\n");
 
- 			prefix_str = fmt_ipv6(entry->body.mrtd_table_dump.prefix,prefix);
 
- 		break;
 
- #endif
 
- 		case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP:
 
- 			printf("TYPE: TABLE_DUMP/INET\n");
 
- 			prefix_str = inet_ntoa(entry->body.mrtd_table_dump.prefix.v4_addr);
 
- 		break;
 
- 		case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP_32BIT_AS:
 
- 			printf("TYPE: TABLE_DUMP/INET_32BIT_AS\n");
 
- 			prefix_str = inet_ntoa(entry->body.mrtd_table_dump.prefix.v4_addr);
 
- 		break;
 
- 		default:
 
- 			printf("Error: unknown table type %d\n", entry->subtype);
 
- 		return;
 
- 		}
 
- 		printf("VIEW: %d\n",entry->body.mrtd_table_dump.view);
 
- 	    	printf("SEQUENCE: %d\n",entry->body.mrtd_table_dump.sequence);
 
- 	    	printf("PREFIX: %s/%d\n",prefix_str,entry->body.mrtd_table_dump.mask);
 
- 	    	printf("FROM:");
 
- 		switch(entry->subtype)
 
- 		{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 		case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP6:
 
- 		case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP6_32BIT_AS:
 
- 			fmt_ipv6(entry->body.mrtd_table_dump.peer_ip,prefix);
 
- 			printf("%s ",prefix);
 
- 			break;
 
- #endif
 
- 		case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP:
 
- 		case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP_32BIT_AS:
 
- 			if (entry->body.mrtd_table_dump.peer_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    		printf("%s ",inet_ntoa(entry->body.mrtd_table_dump.peer_ip.v4_addr));
 
- 			else
 
- 				printf("N/A ");
 
- 		}
 
- 		printf("AS%u\n",entry->body.mrtd_table_dump.peer_as);
 
- 		//printf("FROM: %s AS%d\n",inet_ntoa(entry->body.mrtd_table_dump.peer_ip.v4_addr),entry->body.mrtd_table_dump.peer_as);
 
- 	 	//time2str(localtime(&entry->body.mrtd_table_dump.uptime),time_str2);
 
- 		time2str(gmtime(&entry->body.mrtd_table_dump.uptime),time_str2);
 
- 		printf("ORIGINATED: %s\n",time_str2); 	
 
- 		if (entry->attr && entry->attr->len)
 
- 				    	show_attr(entry->attr);
 
- 		printf("STATUS: 0x%x\n",entry->body.mrtd_table_dump.status);
 
- 	    
 
- 		
 
- 		//printf("    UPTIME      : %s",asctime(gmtime(&entry->body.mrtd_table_dump.uptime)));
 
- 	    //printf("    PEER IP     : %s\n",inet_ntoa(entry->body.mrtd_table_dump.peer_ip));
 
- 	    //printf("    PEER IP     : %s\n",inet_ntoa(entry->body.mrtd_table_dump.peer_ip.v4_addr));
 
- 	    //printf("    PEER AS     : %d\n",entry->body.mrtd_table_dump.peer_as);
 
- 	     }
 
- 	     else if (mode ==1 || mode ==2) // -m -M
 
- 	     {
 
- 	        table_line_mrtd_route(&entry->body.mrtd_table_dump,entry);	     
 
- 	     }
 
- 	    break;
 
- 	case BGPDUMP_TYPE_TABLE_DUMP_V2:
 
- 		if(mode == 0){
 
- 			char peer_ip[BGPDUMP_ADDRSTRLEN];
 
- 			//char time_str[30];
 
- 			int i;
 
-             int addpath = is_addpath(entry);
 
- 			BGPDUMP_TABLE_DUMP_V2_PREFIX *e;
 
- 			e = &entry->body.mrtd_table_dump_v2_prefix;
 
- 			if(e->afi == AFI_IP){
 
- 				strncpy(prefix, inet_ntoa(e->prefix.v4_addr), BGPDUMP_ADDRSTRLEN);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 			} else if(e->afi == AFI_IP6){
 
- 				fmt_ipv6(e->prefix, prefix);
 
- #endif
 
- 			}
 
- 			for(i = 0; i < e->entry_count; i++){
 
- 				// This is slightly nasty - as we want to print multiple entries
 
- 				// for multiple peers, we may need to print another TIME ourselves
 
- 				if(i) printf("\nTIME: %s\n",time_str_fixed);
 
- 				if(e->afi == AFI_IP){
 
-                     if (addpath)
 
-     				    printf("TYPE: TABLE_DUMP_V2/IPV4_UNICAST_ADDPATH\n");
 
-                     else  
 
-     				    printf("TYPE: TABLE_DUMP_V2/IPV4_UNICAST\n");
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 				} else if(e->afi == AFI_IP6){
 
-                     if (addpath)
 
-     				    printf("TYPE: TABLE_DUMP_V2/IPV6_UNICAST_ADDPATH\n");
 
-                     else
 
-     				    printf("TYPE: TABLE_DUMP_V2/IPV6_UNICAST\n");
 
- #endif
 
- 				}
 
- 	    		printf("PREFIX: %s/%d",prefix, e->prefix_length);
 
-                 if (addpath)
 
-                     printf(" PATH_ID: %u", e->entries[i].path_id);
 
-                 printf("\n");
 
-     			printf("SEQUENCE: %d\n",e->seq);
 
- 				if(e->entries[i].peer->afi == AFI_IP){
 
- 					fmt_ipv4(e->entries[i].peer->peer_ip, peer_ip);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 				} else if (e->entries[i].peer->afi == AFI_IP6){
 
- 					fmt_ipv6(e->entries[i].peer->peer_ip, peer_ip);
 
- #endif
 
- 				} else {
 
- 					sprintf(peer_ip, "[N/A, unsupported AF]");
 
- 				}
 
-     			printf("FROM: %s AS%u\n", peer_ip, e->entries[i].peer->peer_as);
 
- 				time_t time_temp = (time_t)((e->entries[i]).originated_time);
 
- 				time2str(gmtime(&time_temp),time_str);
 
- 				printf("ORIGINATED: %s\n",time_str); 	
 
- 				if (e->entries[i].attr && e->entries[i].attr->len)
 
- 			    	show_attr(e->entries[i].attr);
 
- 			}
 
- 		} else if (mode==1 || mode==2) { // -m -M
 
-                     table_line_dump_v2_prefix(&entry->body.mrtd_table_dump_v2_prefix,entry);	     
 
- 		}
 
- 	    break;
 
-         case BGPDUMP_TYPE_MRTD_BGP:
 
-             process_bgpdump_mrtd_bgp(entry);
 
-             break;
 
- 	    
 
- 	case BGPDUMP_TYPE_ZEBRA_BGP:
 
-     case BGPDUMP_TYPE_ZEBRA_BGP_ET:
 
-         if (entry->type == BGPDUMP_TYPE_ZEBRA_BGP) {
 
-             bgp4mp_format = "BGP4MP";
 
-         } else {
 
-             bgp4mp_format = "BGP4MP_ET";
 
-         }
 
-         int addpath = is_addpath(entry);
 
- 	    
 
- 	    switch(entry->subtype) 
 
- 	    {
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_LOCAL:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4_LOCAL:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_ADDPATH:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4_ADDPATH:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_LOCAL_ADDPATH:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4_LOCAL_ADDPATH:
 
-             if (addpath) {
 
-                 if (bgp4mp_message_direction_receive(entry))
 
-                     bgp4mp_subtype_format = "MESSAGE_ADDPATH";
 
-                 else
 
-                     bgp4mp_subtype_format = "MESSAGE_LOCAL_ADDPATH";
 
-             } else {
 
-                 if (bgp4mp_message_direction_receive(entry))
 
-                     bgp4mp_subtype_format = "MESSAGE";
 
-                 else
 
-                     bgp4mp_subtype_format = "MESSAGE_LOCAL";
 
-             }
 
- 		    switch(entry->body.zebra_message.type) 
 
- 		    {
 
- 			case BGP_MSG_UPDATE:
 
- 			   if (mode ==0)
 
- 		    	   {
 
-                 printf("TYPE: %s/%s/Update\n", bgp4mp_format, bgp4mp_subtype_format);
 
- 				if (entry->body.zebra_message.source_as)
 
- 			        {
 
- 					printf("FROM:");
 
- 					switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.source_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.source_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 					printf("AS%u\n",entry->body.zebra_message.source_as);
 
-                                 }
 
- 				if (entry->body.zebra_message.destination_as)
 
- 				{
 
- 					printf("TO:");
 
- 					switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.destination_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.destination_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}	
 
- 		    			printf("AS%u\n",entry->body.zebra_message.destination_as);
 
- 				}
 
- 				if (entry->attr && entry->attr->len)
 
- 				    	show_attr(entry->attr);
 
- 				if (entry->body.zebra_message.cut_bytes)
 
- 				{
 
- 					u_int16_t cutted,idx;
 
- 					u_int8_t buf[128];
 
- 					
 
- 					printf("   INCOMPLETE PACKET: %d bytes cutted\n",entry->body.zebra_message.cut_bytes);
 
- 					printf("   INCOMPLETE PART: ");
 
- 					if (entry->body.zebra_message.incomplete.orig_len)
 
- 					{
 
- 					 	cutted=entry->body.zebra_message.incomplete.prefix.len/8+1;
 
- 						buf[0]=entry->body.zebra_message.incomplete.orig_len;
 
- 						memcpy(buf+1,&entry->body.zebra_message.incomplete.prefix.address,cutted-1);
 
- 						
 
- 						for (idx=0;idx<cutted;idx++)
 
- 						{
 
- 							if (buf[idx]<0x10)
 
- 								printf("0%x ",buf[idx]);
 
- 							else
 
- 								printf("%x ",buf[idx]);
 
- 						}
 
- 					}
 
- 					printf("\n");
 
- 				}
 
-                                if(! entry->attr)
 
-                                    return;
 
- 				if ((entry->body.zebra_message.withdraw_count) || (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_UNREACH_NLRI))) 
 
- 				{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 					if ((entry->body.zebra_message.withdraw_count)||(entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->prefix_count) || (entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->prefix_count) || (entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count) ||(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->prefix_count) || (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->prefix_count) || (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count) )
 
- #else
 
- 					if ((entry->body.zebra_message.withdraw_count)||(entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->prefix_count) || (entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->prefix_count) || (entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count))
 
- #endif				
 
- 						printf("WITHDRAW\n");
 
- 					if (entry->body.zebra_message.withdraw_count)
 
-                         
 
-                             // old style
 
- 			    			show_prefixes(entry->body.zebra_message.withdraw_count,entry->body.zebra_message.withdraw, addpath);
 
-                             // MP
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->prefix_count)
 
-                                                 show_prefixes(entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->prefix_count,entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->nlri, addpath);
 
-                                 
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->prefix_count)
 
-                                                 show_prefixes(entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->prefix_count,entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->nlri, addpath);
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 show_prefixes(entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count,entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->nlri, addpath);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->prefix_count)
 
-                                                 show_prefixes6(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->prefix_count,entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->nlri, addpath);
 
-                                 
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->prefix_count)
 
-                                                 show_prefixes6(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->prefix_count,entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->nlri, addpath);
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 show_prefixes6(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count,entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->nlri, addpath);
 
- #endif
 
- 				}
 
- 				if ( (entry->body.zebra_message.announce_count) || (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI))) 
 
- 				{
 
- 					printf("ANNOUNCE\n");
 
- 			    		if (entry->body.zebra_message.announce_count)
 
-                             
 
-                             // old style
 
- 			    			show_prefixes(entry->body.zebra_message.announce_count,entry->body.zebra_message.announce, addpath);
 
-                             // MP
 
-                                         if (entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST] && entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->prefix_count)
 
-                                                 show_prefixes(entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->prefix_count,entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nlri, addpath);
 
-                                 
 
-                                         if (entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST] && entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->prefix_count)
 
-                                                 show_prefixes(entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->prefix_count,entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nlri, addpath);
 
-                                         if (entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 show_prefixes(entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count,entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nlri, addpath);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
-                                         if (entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST] && entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->prefix_count)
 
-                                                 show_prefixes6(entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->prefix_count,entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nlri, addpath);
 
-                                 
 
-                                         if (entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST] && entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->prefix_count)
 
-                                                 show_prefixes6(entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->prefix_count,entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nlri, addpath);
 
-                                         if (entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 show_prefixes6(entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count,entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nlri, addpath);
 
- #endif					
 
- 				}
 
- 			   }
 
- 			   else if (mode == 1  || mode == 2) //-m -M
 
- 			   {
 
- 				if ((entry->body.zebra_message.withdraw_count) || (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_UNREACH_NLRI)))
 
- 				{
 
-                     // old style
 
- 					table_line_withdraw(entry->body.zebra_message.withdraw,entry->body.zebra_message.withdraw_count,entry,time_str);
 
-                     
 
-                     // MP
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->prefix_count)
 
-                                                 table_line_withdraw(entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->nlri,entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST]->prefix_count,entry,time_str);	
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->prefix_count)
 
-                                                 table_line_withdraw(entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->nlri,entry->attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST]->prefix_count,entry,time_str);
 
-                                         
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 table_line_withdraw(entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->nlri,entry->attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count,entry,time_str);
 
- #ifdef BGPDUMP_HAVE_IPV6						
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->prefix_count)
 
-                                                 table_line_withdraw6(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->nlri,entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST]->prefix_count,entry,time_str);	
 
-                                         
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->prefix_count)
 
-                                                 table_line_withdraw6(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->nlri,entry->attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST]->prefix_count,entry,time_str);
 
-                                         
 
-                                         if (entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 table_line_withdraw6(entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->nlri,entry->attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count,entry,time_str);
 
- #endif	
 
-                         
 
- 				}
 
- 				if ( (entry->body.zebra_message.announce_count) || (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI)))
 
- 				{
 
-                     // old style
 
- 					table_line_announce(entry->body.zebra_message.announce,entry->body.zebra_message.announce_count,entry,time_str);
 
-                     // MP
 
-                                         if (entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST] && entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->prefix_count)
 
-                                                 table_line_announce_1(entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST],entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->prefix_count,entry,time_str);	
 
-                                         if (entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST] && entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->prefix_count)
 
-                                                 table_line_announce_1(entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST],entry->attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->prefix_count,entry,time_str);
 
-                                         if (entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 table_line_announce_1(entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST],entry->attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->prefix_count,entry,time_str);
 
- #ifdef BGPDUMP_HAVE_IPV6						
 
-                                         if (entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST] && entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->prefix_count)
 
-                                                 table_line_announce6(entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST],entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->prefix_count,entry,time_str);	
 
-                                         if (entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST] && entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->prefix_count)
 
-                                                 table_line_announce6(entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST],entry->attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->prefix_count,entry,time_str);
 
-                                         if (entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST] && entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count)
 
-                                                 table_line_announce6(entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST],entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->prefix_count,entry,time_str);
 
- #endif
 
- 					
 
- 				}  
 
- 			   }
 
- 			   break;
 
- 		    
 
- 			case BGP_MSG_OPEN:
 
- 			    if (mode != 0)
 
- 				    break;
 
-                 printf("TYPE: %s/%s/Open\n", bgp4mp_format, bgp4mp_subtype_format);
 
- 			    if (entry->body.zebra_message.source_as)
 
- 			    {
 
- 				printf("FROM:");
 
- 				switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.source_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.source_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 				printf("AS%u\n",entry->body.zebra_message.source_as);
 
- 			    }
 
- 			    if (entry->body.zebra_message.destination_as)
 
- 			    {
 
- 				printf("TO:");
 
- 				switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.destination_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.destination_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 		    		printf("AS%u\n",entry->body.zebra_message.destination_as);
 
-                             }
 
- 			    printf("VERSION: %d\n",entry->body.zebra_message.version);
 
- 			    printf("AS: %u\n",entry->body.zebra_message.my_as);
 
- 			    printf("HOLD_TIME: %d\n",entry->body.zebra_message.hold_time);
 
- 			    printf("ID: %s\n",inet_ntoa(entry->body.zebra_message.bgp_id));
 
- 			    printf("OPT_PARM_LEN: %d\n",entry->body.zebra_message.opt_len);
 
- 			    break;
 
- 			
 
- 			case BGP_MSG_NOTIFY:
 
- 			    if (mode != 0)
 
- 				    break;
 
-                 printf("TYPE: %s/%s/Notify\n", bgp4mp_format, bgp4mp_subtype_format);
 
- 			    if (entry->body.zebra_message.source_as)
 
- 			    {
 
- 				printf("FROM:");
 
- 				switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.source_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.source_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 				printf("AS%u\n",entry->body.zebra_message.source_as);
 
- 	                    }
 
- 			    if (entry->body.zebra_message.destination_as)
 
- 		            {
 
- 				printf("TO:");
 
- 				switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.destination_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.destination_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 		    		printf("AS%u\n",entry->body.zebra_message.destination_as);
 
-                             }
 
- 		            switch (entry->body.zebra_message.error_code)
 
- 			    {
 
- 			    case 	1:
 
- 				    printf("    ERROR CODE  : 1 (Message Header Error)\n");
 
- 				    switch(entry->body.zebra_message.sub_error_code)
 
- 				    {
 
- 				    case	1:
 
- 					    printf("    SUB ERROR   : 1 (Connection Not Synchronized)\n");
 
- 					    break;
 
- 					    
 
- 				    case	2:
 
- 					    printf("    SUB ERROR   : 2 (Bad Message Length)\n");
 
- 					    break;
 
- 				    case	3:
 
- 					    printf("    SUB ERROR   : 3 (Bad Message Type)\n");
 
- 					    break;
 
- 					    
 
- 				    default:
 
- 					    printf("    SUB ERROR   : %d\n",entry->body.zebra_message.sub_error_code);
 
- 					    break;
 
- 			            }
 
- 				    break;
 
- 			    case	2:
 
-                                     printf("    ERROR CODE  : 2 (OPEN Message Error)\n");
 
- 				    switch(entry->body.zebra_message.sub_error_code)
 
- 				    {
 
- 				    case	1:
 
- 					    printf("    SUB ERROR   : 1 (Unsupported Version Number)\n");
 
- 					    break;
 
- 					    
 
- 				    case	2:
 
- 					    printf("    SUB ERROR   : 2 (Bad Peer AS)\n");
 
- 					    break;
 
- 				    case	3:
 
- 					    printf("    SUB ERROR   : 3 (Bad BGP Identifier)\n");
 
- 					    break;
 
- 			           
 
- 				    case	4:
 
- 					    printf("    SUB ERROR   : 4 (Unsupported Optional Parameter)\n");
 
- 					    break;
 
- 				    case	5:
 
- 					    printf("    SUB ERROR   : 5 (Authentication Failure)\n");
 
- 					    break;
 
- 				    case	6:
 
- 					    printf("    SUB ERROR   : 6 (Unacceptable Hold Time)\n");
 
- 					    break;
 
- 					    
 
- 				    default:
 
- 					    printf("    SUB ERROR   : %d\n",entry->body.zebra_message.sub_error_code);
 
- 					    break;
 
- 			            }
 
- 				    break;
 
- 			    case	3:
 
- 				    printf("    ERROR CODE  : 3 (UPDATE Message Error)\n");
 
- 				    switch(entry->body.zebra_message.sub_error_code)
 
- 				    {
 
- 				    case	1:
 
- 					    printf("    SUB ERROR   : 1 (Malformed Attribute List)\n");
 
- 					    break;
 
- 					    
 
- 				    case	2:
 
- 					    printf("    SUB ERROR   : 2 (Unrecognized Well-known Attribute)\n");
 
- 					    break;
 
- 				    case	3:
 
- 					    printf("    SUB ERROR   : 3 (Missing Well-known Attribute)\n");
 
- 					    break;
 
- 			           
 
- 				    case	4:
 
- 					    printf("    SUB ERROR   : 4 (Attribute Flags Error)\n");
 
- 					    break;
 
- 				    case	5:
 
- 					    printf("    SUB ERROR   : 5 (Attribute Length Error)\n");
 
- 					    break;
 
- 				    case	6:
 
- 					    printf("    SUB ERROR   : 6 (Invalid ORIGIN Attribute)\n");
 
- 					    break;
 
- 				
 
- 				    case	7:
 
- 					    printf("    SUB ERROR   : 7 (AS Routing Loop)\n");
 
- 					    break;
 
- 					    
 
- 				    case	8:
 
- 					    printf("    SUB ERROR   : 8 (Invalid NEXT-HOP Attribute)\n");
 
- 					    break;
 
- 				    case	9:
 
- 					    printf("    SUB ERROR   : 9 (Optional Attribute Error)\n");
 
- 					    break;
 
- 			           
 
- 				    case	10:
 
- 					    printf("    SUB ERROR   : 10 (Invalid Network Field)\n");
 
- 					    break;
 
- 				    case	11:
 
- 					    printf("    SUB ERROR   : 11 (Malformed AS-PATH)\n");
 
- 					    break;
 
- 	    
 
- 				    default:
 
- 					    printf("    SUB ERROR   : %d\n",entry->body.zebra_message.sub_error_code);
 
- 					    break;
 
- 			            }
 
- 				    break;
 
- 			    case	4:
 
- 				    printf("    ERROR CODE  : 4 (Hold Timer Expired)\n");
 
- 				    break;
 
- 			    case	5:
 
- 				    printf("    ERROR CODE  : 5 (Finite State Machine Error)\n");
 
- 				    break;
 
- 			    case	6:
 
-                                     printf("    ERROR CODE  : 6 (Cease)\n");
 
- 				    break;
 
- 			    default:
 
- 				    printf("    ERROR CODE  : %d\n",entry->body.zebra_message.error_code);	
 
- 				    break;
 
- 					    
 
- 			    }
 
- 			    break;
 
- 			    
 
- 			case BGP_MSG_KEEPALIVE:
 
- 			    	if ( mode != 0)
 
- 					break;
 
-                 printf("TYPE: %s/%s/Keepalive\n", bgp4mp_format, bgp4mp_subtype_format);
 
- 				if (entry->body.zebra_message.source_as)
 
- 				{
 
- 					printf("FROM:");
 
- 					switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.source_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.source_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 					printf("AS%u\n",entry->body.zebra_message.source_as);
 
- 				}
 
- 				if (entry->body.zebra_message.destination_as)
 
- 				{
 
- 					printf("TO:");
 
- 					switch(entry->body.zebra_message.address_family)
 
- 					{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 						case AFI_IP6:
 
- 							fmt_ipv6(entry->body.zebra_message.destination_ip,prefix);
 
- 							printf(" %s ",prefix);
 
- 							break;
 
- #endif
 
- 						case AFI_IP:
 
- 						default:
 
- 							if (entry->body.zebra_message.destination_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    						printf(" %s ",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr));
 
- 							else
 
- 								printf(" N/A ");
 
- 					}
 
- 		    			printf("AS%u\n",entry->body.zebra_message.destination_as);
 
- 				}
 
- 			    	break;
 
- 		    }
 
- 		    break;
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_STATE_CHANGE:
 
- 		case BGPDUMP_SUBTYPE_ZEBRA_BGP_STATE_CHANGE_AS4:
 
- 		    if (mode==0)
 
- 		    {
 
- 		    	printf("TYPE: %s/STATE_CHANGE\n", bgp4mp_format);
 
- 		    	printf("PEER:");
 
- 			switch(entry->body.zebra_state_change.address_family)
 
- 			{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 			case AFI_IP6:
 
- 				fmt_ipv6(entry->body.zebra_state_change.source_ip,prefix);
 
- 				printf(" %s ",prefix);
 
- 				break;
 
- #endif
 
- 			case AFI_IP:
 
- 			default:
 
- 				if (entry->body.zebra_state_change.source_ip.v4_addr.s_addr != 0x00000000L)
 
- 		    			printf(" %s ",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr));
 
- 				else
 
- 					printf(" N/A ");
 
- 			}	
 
- 		    	//if (entry->body.zebra_message.source_ip.s_addr != 0x00000000L)
 
- 		    	//	printf(" %s ",inet_ntoa(entry->body.zebra_message.source_ip));
 
- 		    	//else
 
- 			//	printf(" N/A ");
 
- 		    	printf("AS%u\n",entry->body.zebra_state_change.source_as);
 
- 		    	printf("STATE: %s/%s\n",get_bgp_state_name(entry->body.zebra_state_change.old_state),get_bgp_state_name(entry->body.zebra_state_change.new_state));
 
- 		    }
 
- 		    else if (mode==1 || mode==2 ) //-m -M
 
- 		    {
 
- 			switch(entry->body.zebra_state_change.address_family)
 
- 			{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 				case AFI_IP6:
 
-                     fmt_ipv6(entry->body.zebra_state_change.source_ip, prefix);
 
- 					break;
 
- #endif
 
- 				case AFI_IP:
 
- 				default:
 
-                     sprintf(prefix, "%s", inet_ntoa(entry->body.zebra_state_change.source_ip.v4_addr));
 
- 					break;
 
- 			}
 
-             show_line_prefix(bgp4mp_format, time_str, "STATE");
 
-             printf("%s|%u|%d|%d\n", prefix,
 
-                     entry->body.zebra_state_change.source_as,
 
-                     entry->body.zebra_state_change.old_state,
 
-                     entry->body.zebra_state_change.new_state);
 
-                 
 
- 		    }
 
- 		    break;
 
- 		
 
- 	    } 
 
- 	    break;
 
-     }
 
-     if (mode==0)
 
-     	printf("\n");
 
- }
 
- // print line prefix with respect of mode and show_packet_index flags
 
- // output will have format:
 
- // format|[packet_index|]time|type|
 
- void show_line_prefix(const char* format, const char* time_str, const char* type)
 
- {
 
-     printf("%s|", format);
 
-     if (show_packet_index)
 
-         printf("%d|", packet_index);
 
-     
 
-     printf("%s|%s|", time_str, type);
 
- } 
 
- void process_bgpdump_mrtd_bgp(BGPDUMP_ENTRY *entry) {
 
-     struct tm *date;
 
-     char time_str[128];
 
-     date=gmtime(&entry->time);
 
-     if (mode == 1) {
 
-         sprintf(time_str, "%lld", (long long)entry->time);
 
-     } else {
 
-         
 
-         time2str(date, time_str);
 
-     }
 
-     
 
-     switch (entry->subtype) {
 
-     case BGPDUMP_SUBTYPE_MRTD_BGP_UPDATE:
 
-     case BGPDUMP_SUBTYPE_MRTD_BGP_KEEPALIVE:
 
-         if (mode == 0) {
 
-             if (entry->subtype == BGPDUMP_SUBTYPE_MRTD_BGP_UPDATE)
 
-                 printf("TYPE: BGP/MESSAGE/Update\n");
 
-             else
 
-                 printf("TYPE: BGP/MESSAGE/Keepalive\n"); 
 
-             if (entry->body.mrtd_message.source_as) {
 
-                 printf("FROM:");
 
-                 show_ipv4_address(entry->body.mrtd_message.source_ip);
 
-                 printf("AS%u\n", entry->body.mrtd_message.source_as);
 
-             }
 
-             if (entry->body.mrtd_message.destination_as) {
 
-                 printf("TO:");
 
-                 show_ipv4_address(entry->body.mrtd_message.destination_ip);
 
-                 printf("AS%u\n", entry->body.mrtd_message.destination_as);                
 
-             }
 
-             if (entry->attr && entry->attr->len)
 
-                 show_attr(entry->attr);
 
-             if (entry->body.mrtd_message.withdraw_count) {
 
-                 printf("WITHDRAW\n");
 
-                 show_prefixes(entry->body.mrtd_message.withdraw_count, entry->body.mrtd_message.withdraw, 0);
 
-             }
 
-             if (entry->body.mrtd_message.announce_count) {
 
-                 printf("ANNOUNCE\n");
 
-                 show_prefixes(entry->body.mrtd_message.announce_count, entry->body.mrtd_message.announce, 0);
 
-             }
 
-         }
 
-         else {
 
-             if (entry->subtype != BGPDUMP_SUBTYPE_MRTD_BGP_UPDATE)
 
-                 break;
 
-             if (entry->body.mrtd_message.withdraw_count)
 
-                 mrtd_table_line_withdraw(entry->body.mrtd_message.withdraw, entry->body.mrtd_message.withdraw_count,
 
-                                          entry, time_str);
 
-             if (entry->body.mrtd_message.announce_count)
 
-                 mrtd_table_line_announce(entry->body.mrtd_message.announce, entry->body.mrtd_message.announce_count,
 
-                                          entry, time_str);
 
-         }
 
-         break;
 
-     case BGPDUMP_SUBTYPE_MRTD_BGP_STATE_CHANGE:
 
-         if (mode == 0) {
 
-             printf("TYPE: BGP/STATE_CHANGE\n");
 
-             printf("PEER:");
 
-             show_ipv4_address(entry->body.mrtd_state_change.destination_ip);
 
-             printf("AS%u\n", entry->body.mrtd_state_change.destination_as);
 
-             printf("STATE: %s/%s\n", get_bgp_state_name(entry->body.mrtd_state_change.old_state),
 
-                    get_bgp_state_name(entry->body.mrtd_state_change.new_state));
 
-         }
 
-         else if (mode == 1 || mode == 2) {
 
-             show_line_prefix("BGP", time_str, "STATE");
 
-             printf("%s|%u|%d|%d\n",
 
-                    inet_ntoa(entry->body.mrtd_state_change.destination_ip),
 
-                    entry->body.mrtd_state_change.destination_as,
 
-                    entry->body.mrtd_state_change.old_state,
 
-                    entry->body.mrtd_state_change.new_state);
 
-         }
 
-         break;
 
-     default:
 
-         if (mode == 0) {
 
-             printf("TYPE: Subtype %d not supported yet\n", entry->subtype);
 
-         }
 
-     }
 
- }
 
- void mrtd_table_line_withdraw(struct prefix *prefix, int count, BGPDUMP_ENTRY *entry, char *time_str) {
 
-     int i;
 
-     for (i = 0; i < count; i++) {
 
-         show_line_prefix("BGP", time_str, "W");
 
-         printf("%s|%u|%s/%d\n", inet_ntoa(entry->body.mrtd_message.source_ip),
 
-                entry->body.mrtd_message.source_as,
 
-                inet_ntoa(prefix[i].address.v4_addr), prefix[i].len);
 
-     }
 
- }
 
- void mrtd_table_line_announce(struct prefix *prefix, int count, BGPDUMP_ENTRY *entry, char *time_str) {
 
-     int i, npref, nmed;
 
-     char *aggregate = entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE) ? "AG" : "NAG";
 
-     for (i = 0; i < count; i++) {
 
-         show_line_prefix("BGP", time_str, "A");
 
-         printf("%s|%u", inet_ntoa(entry->body.mrtd_message.source_ip),
 
-                entry->body.mrtd_message.source_as);
 
-         printf("|%s/%d|%s|%s", inet_ntoa(prefix[i].address.v4_addr), prefix[i].len,
 
-                attr_aspath(entry->attr), describe_origin(entry->attr->origin));
 
-         if (mode == 1) {
 
-             npref = ((entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)) == 0) ? 0 : entry->attr->local_pref;
 
-             nmed  = ((entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC)) == 0) ? 0 : entry->attr->med;
 
-             printf("|%s|%u|%u", inet_ntoa(entry->attr->nexthop), npref, nmed);
 
-             if ((entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES)) != 0)
 
-                 printf("%s|%s|", entry->attr->community->str+1, aggregate);
 
-             else
 
-                 printf("|%s|", aggregate);
 
- 				
 
-             if (entry->attr->aggregator_addr.s_addr != -1)
 
-                 printf("%u %s|\n", entry->attr->aggregator_as, inet_ntoa(entry->attr->aggregator_addr));
 
-             else
 
-                 printf("|\n");
 
-         }
 
-         else
 
-             printf("\n");
 
-     }
 
- }
 
- void show_ipv4_address(struct in_addr ip) {
 
-     if (ip.s_addr != 0x00000000L)
 
-         printf(" %s ", inet_ntoa(ip));
 
-     else
 
-         printf(" N/A ");
 
- }
 
- void show_attr(attributes_t *attr) {
 
-     
 
-     if(attr != NULL) {
 
- 	    if( (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGIN) ) !=0 )
 
- 	    {
 
- 		    switch (attr->origin)
 
- 		    {
 
- 	            case 0:
 
- 			    printf("ORIGIN: IGP\n");
 
- 			    break;
 
- 		    case 1:
 
- 			    printf("ORIGIN: EGP\n");
 
- 		 	    break;
 
- 	            case 2:
 
- 			    printf("ORIGIN: INCOMPLETE\n");
 
- 				    
 
- 		    }
 
- 		   
 
- 	    }
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_AS_PATH) ) !=0)		
 
- 		    printf("ASPATH: %s\n",attr->aspath->str);
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP) ) !=0)		
 
- 		    printf("NEXT_HOP: %s\n",inet_ntoa(attr->nexthop));
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) !=0)	
 
- 		    printf("MULTI_EXIT_DISC: %u\n",attr->med);
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) !=0)		
 
- 		    printf("LOCAL_PREF: %u\n",attr->local_pref);
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE) ) !=0)	
 
- 		    printf("ATOMIC_AGGREGATE\n");
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR) ) !=0)		
 
- 		    printf("AGGREGATOR: AS%u %s\n",attr->aggregator_as,inet_ntoa(attr->aggregator_addr));
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID) ) !=0)
 
- 			printf("ORIGINATOR_ID: %s\n",inet_ntoa(attr->originator_id));
 
- 	
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST) ) !=0)
 
- 		{
 
- 			int cluster_index;
 
- 			printf("CLUSTER_LIST: ");
 
- 			for (cluster_index = 0;cluster_index<attr->cluster->length;cluster_index++)
 
- 				printf("%s ",inet_ntoa(attr->cluster->list[cluster_index]));
 
- 			printf("\n");
 
- 		}
 
-             int idx;
 
-             for (idx=0;idx<attr->unknown_num;idx++)
 
-             {
 
-                 struct unknown_attr *unknown = attr->unknown + idx;
 
-                 printf("   UNKNOWN_ATTR(%i, %i, %i):", unknown->flag, unknown->type, unknown->len);
 
-                 int b;
 
-                 for(b = 0; b < unknown->len; ++b)
 
-                     printf(" %02x", unknown->raw[b]);
 
-                 printf("\n");
 
-             }
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI) )!=0)
 
- 	    {
 
- 		    printf("MP_REACH_NLRI");
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 		    if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST] || attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST] || attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST])
 
- 		    {
 
- 			   char buf[128];
 
- 			    
 
- 			   if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST])
 
- 			   {
 
- 				   printf("(IPv6 Unicast)\n");
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_len==4)
 
-                         printf("NEXT_HOP: %s\n",inet_ntoa(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop.v4_addr));
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_len==16)
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop,buf));
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_len==32) {
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop,buf));
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_local,buf));
 
-                     }
 
- 			   }
 
- 			   else if (attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST])	 
 
- 		  	   {
 
- 			   	   printf("(IPv6 Multicast)\n");
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop_len==4)
 
-                         printf("NEXT_HOP: %s\n",inet_ntoa(attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop.v4_addr));
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop_len==16)
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop,buf));
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop_len==32) {
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop,buf));
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_MULTICAST]->nexthop_local,buf));
 
-                     }
 
-                }
 
-                else
 
-                {
 
-                    printf("(IPv6 Both unicast and multicast)\n");
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop_len==4)
 
-                         printf("NEXT_HOP: %s\n",inet_ntoa(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop.v4_addr));
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop_len==16)
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop,buf));
 
-                     if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop_len==32) {
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop,buf));
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST_MULTICAST]->nexthop_local,buf));
 
-                     }
 
- 			   }
 
- 		    }
 
- 		    else
 
- #endif
 
- 		    {
 
- 			   char buf[128];
 
-                if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST])
 
-                {
 
-                     printf("(IPv4 Unicast)\n");
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_len==4)
 
-                         printf("NEXT_HOP: %s\n",inet_ntoa(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop.v4_addr));
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_len==16)
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop,buf));
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_len==32) {
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop,buf));
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_local,buf));
 
-                     }
 
-                 }
 
-                else if (attr->mp_info->announce[AFI_IP][SAFI_MULTICAST])	 
 
-                 {
 
-                     printf("(IPv4 Multicast)\n");
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop_len==4)
 
-                         printf("NEXT_HOP: %s\n",inet_ntoa(attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop.v4_addr));
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop_len==16)
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop,buf));
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop_len==32) {
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop,buf));
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_MULTICAST]->nexthop_local,buf));
 
-                     }
 
-                 }
 
-                 else if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST])
 
-                 {
 
-                     printf("(IPv4 Both unicast and multicast)\n");
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop_len==4)
 
-                         printf("NEXT_HOP: %s\n",inet_ntoa(attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop.v4_addr));
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop_len==16)
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop,buf));
 
-                     if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop_len==32) {
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop,buf));
 
-                         printf("NEXT_HOP: %s\n",fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST_MULTICAST]->nexthop_local,buf));
 
-                     }
 
-                 }
 
-             }
 
-         }
 
- 	    
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_UNREACH_NLRI) )!=0)
 
- 	    {
 
- 		    printf("MP_UNREACH_NLRI");
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 		    if (attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST] || attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST] || attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST_MULTICAST])
 
- 		    {
 
- 			    
 
- 			   if (attr->mp_info->withdraw[AFI_IP6][SAFI_UNICAST])
 
- 			   {
 
- 				   printf("(IPv6 Unicast)\n");
 
- 			   }
 
- 			   else if (attr->mp_info->withdraw[AFI_IP6][SAFI_MULTICAST])	 
 
- 		  	   {
 
- 			   	   printf("(IPv6 Multicast)\n");
 
- 		           }
 
- 			   else
 
- 		           {
 
- 				   printf("(IPv6 Both unicast and multicast)\n");
 
- 			   }
 
- 		    }
 
- 		    else
 
- #endif
 
- 		    {
 
- 			   
 
- 			   if (attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST])
 
- 			   {
 
- 				   printf("(IPv4 Unicast)\n");
 
- 			  
 
- 			   }
 
- 			   else if (attr->mp_info->withdraw[AFI_IP][SAFI_MULTICAST])	 
 
- 		  	   {
 
- 			   	   printf("(IPv4 Multicast)\n");
 
- 			  
 
- 		
 
- 		           }
 
- 			   else if (attr->mp_info->withdraw[AFI_IP][SAFI_UNICAST_MULTICAST])
 
- 		           {
 
- 				   printf("(IPv4 Both unicast and multicast)\n");
 
- 			  
 
- 			   }
 
-   
 
- 		    }
 
- 	    } 
 
- 	    if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
- 		    printf("COMMUNITY:%s\n",attr->community->str);
 
-         if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0)    
 
-             printf("LARGE_COMMUNITY:%s\n",attr->lcommunity->str);
 
-        
 
-     }
 
-  
 
- }
 
- void show_prefixes(int count,struct prefix *prefix, int addpath) {
 
-     int i;
 
-     for(i=0;i<count;i++)
 
-         if (addpath)
 
- 	        printf("  %s/%d PATH_ID: %u\n",inet_ntoa(prefix[i].address.v4_addr),prefix[i].len, prefix[i].path_id);
 
-         else
 
- 	        printf("  %s/%d\n",inet_ntoa(prefix[i].address.v4_addr),prefix[i].len);
 
- }
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- void show_prefixes6(int count,struct prefix *prefix, int addpath)
 
- {
 
- 	int i;
 
- 	char buf[128];
 
- 	for (i=0;i<count;i++)
 
-         if (addpath)
 
- 	        printf("  %s/%d PATH_ID: %u\n",fmt_ipv6(prefix[i].address,buf),prefix[i].len, prefix[i].path_id);
 
-         else
 
- 	        printf("  %s/%d\n",fmt_ipv6(prefix[i].address,buf),prefix[i].len);
 
- }
 
- #endif
 
- static void table_line_withdraw(struct prefix *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str)
 
- {
 
- 	int idx;
 
- 	char buf[128];
 
- 	
 
- 	for (idx=0;idx<count;idx++)
 
- 	{
 
-         show_line_prefix(get_bgp4mp_format(entry), time_str, "W");
 
- 		switch(entry->body.zebra_message.address_family) {
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 			case AFI_IP6:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",
 
- 						fmt_ipv6(entry->body.zebra_message.source_ip,buf),
 
- 						entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",
 
- 						fmt_ipv6(entry->body.zebra_message.destination_ip,buf),
 
- 						entry->body.zebra_message.destination_as);
 
- 				break;
 
- #endif
 
-             		case AFI_IP:
 
-             		default:
 
- 				bgp4mp_message_direction_receive(entry)
 
-                 			? printf("%s|%u|",
 
-                        				inet_ntoa(entry->body.zebra_message.source_ip.v4_addr),
 
-                        				entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",
 
-                       				inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr),
 
-                       				entry->body.zebra_message.destination_as);
 
-                 		break;
 
- 		}
 
-         is_addpath(entry)
 
-             ? printf("%s/%d|%u\n",inet_ntoa(prefix[idx].address.v4_addr),prefix[idx].len,prefix[idx].path_id)
 
-             : printf("%s/%d\n",inet_ntoa(prefix[idx].address.v4_addr),prefix[idx].len);
 
-         }
 
- }
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- static void table_line_withdraw6(struct prefix *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str)
 
- {
 
- 	int idx;
 
- 	char buf[128];
 
- 	char buf1[128];
 
- 	for (idx=0;idx<count;idx++)
 
- 	{
 
- 		show_line_prefix(get_bgp4mp_format(entry), time_str, "W");
 
- 		switch(entry->body.zebra_message.address_family) {
 
- 			case AFI_IP6:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|%s/%d",
 
- 						fmt_ipv6(entry->body.zebra_message.source_ip,buf1),
 
- 						entry->body.zebra_message.source_as,
 
- 						fmt_ipv6(prefix[idx].address,buf),prefix[idx].len)
 
- 					: printf("%s|%u|%s/%d",
 
- 						fmt_ipv6(entry->body.zebra_message.destination_ip,buf1),
 
- 						entry->body.zebra_message.destination_as,
 
- 						fmt_ipv6(prefix[idx].address,buf),prefix[idx].len);
 
- 				break;
 
-             		case AFI_IP:
 
-             		default:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|%s/%d",
 
- 						fmt_ipv4(entry->body.zebra_message.source_ip,buf1),
 
- 						entry->body.zebra_message.source_as,
 
- 						fmt_ipv6(prefix[idx].address,buf),prefix[idx].len)
 
- 					: printf("%s|%u|%s/%d",
 
- 						fmt_ipv6(entry->body.zebra_message.destination_ip,buf1),
 
- 						entry->body.zebra_message.destination_as,
 
- 						fmt_ipv6(prefix[idx].address,buf),prefix[idx].len);
 
-                 		break;
 
- 		}
 
-         is_addpath(entry)
 
-             ? printf("|%u\n", prefix[idx].path_id)
 
-             : printf("\n");
 
-         }	
 
- }
 
- #endif
 
- static void table_line_announce(struct prefix *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str)
 
- {
 
- 	int idx  ;
 
- 	char buf[128];
 
- 	char aggregate[20];
 
- 	unsigned int npref;
 
- 	unsigned int nmed;
 
- 	if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
 
- 		sprintf(aggregate,"AG");
 
- 	else
 
- 		sprintf(aggregate,"NAG");
 
- 	for (idx=0;idx<count;idx++)
 
- 	{
 
-         show_line_prefix(get_bgp4mp_format(entry), time_str, "A");
 
- 		if (mode == 1)
 
- 		{
 
- 			switch(entry->body.zebra_message.address_family)
 
- 			{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 			case AFI_IP6:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.source_ip,buf),entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf),entry->body.zebra_message.destination_as);
 
- 				break;
 
- #endif
 
- 			case AFI_IP:
 
- 			default:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr),entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr),entry->body.zebra_message.destination_as);
 
- 				break;
 
- 			}
 
-             is_addpath(entry)
 
-                 ? printf("%s/%d|%u|%s|%s|",inet_ntoa(prefix[idx].address.v4_addr),prefix[idx].len,prefix[idx].path_id,attr_aspath(entry->attr),describe_origin(entry->attr->origin))
 
-                 : printf("%s/%d|%s|%s|",inet_ntoa(prefix[idx].address.v4_addr),prefix[idx].len,attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 		    npref=entry->attr->local_pref;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
- 	            npref=0;
 
- 		    nmed=entry->attr->med;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
- 	            nmed=0;
 
- 			    
 
- 			printf("%s|%u|%u|",inet_ntoa(entry->attr->nexthop),npref,nmed);
 
- 			if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
- 		    	printf("%s|",entry->attr->community->str+1);
 
-             else
 
-                 printf("|");
 
-             if (show_large_comms) {
 
-                 if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0) 
 
-                     printf("%s|",entry->attr->lcommunity->str+1);
 
-                 else
 
-                     printf("|");
 
-             }
 
- 		    printf("%s|", aggregate); /* AG/NAG */
 
- 			if (entry->attr->aggregator_addr.s_addr != -1) {
 
- 				printf("%u %s",entry->attr->aggregator_as,inet_ntoa(entry->attr->aggregator_addr));
 
- 			}
 
- 			printf("|");
 
- 			if (show_unknown_attributes) {
 
- 				append_compact_unknown_attributes(entry->attr);
 
- 			}
 
- 			printf("\n");
 
- 		}
 
- 		else
 
- 		{
 
- 			switch(entry->body.zebra_message.address_family)
 
- 			{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 			case AFI_IP6:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.source_ip,buf),entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf),entry->body.zebra_message.destination_as);
 
- 				break;
 
- #endif
 
- 			case AFI_IP:
 
- 			default:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr),entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr),entry->body.zebra_message.destination_as);
 
- 				break;
 
- 			}
 
-             is_addpath(entry)
 
-                 ? printf("%s/%d|%u|%s|%s\n",inet_ntoa(prefix[idx].address.v4_addr),prefix[idx].len,prefix[idx].path_id,attr_aspath(entry->attr),describe_origin(entry->attr->origin))
 
-                 : printf("%s/%d|%s|%s\n",inet_ntoa(prefix[idx].address.v4_addr),prefix[idx].len,attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 				
 
- 		}
 
- 	}
 
- }
 
- static void table_line_announce_1(struct mp_nlri *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str)
 
- {
 
- 	int idx  ;
 
- 	char buf[128];
 
- 	char aggregate[20];
 
- 	unsigned int npref;
 
- 	unsigned int nmed;
 
- 	if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
 
- 		sprintf(aggregate,"AG");
 
- 	else
 
- 		sprintf(aggregate,"NAG");
 
- 	for (idx=0;idx<count;idx++)
 
- 	{
 
-         show_line_prefix(get_bgp4mp_format(entry), time_str, "A");
 
- 		if (mode == 1)
 
- 		{
 
- 			if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI))
 
- 			{
 
- 				switch(entry->body.zebra_message.address_family)
 
- 				{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 				case AFI_IP6:
 
- 					bgp4mp_message_direction_receive(entry)
 
- 						? printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.source_ip,buf),entry->body.zebra_message.source_as)
 
- 						: printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf),entry->body.zebra_message.destination_as);
 
- 					break;
 
- #endif
 
- 				case AFI_IP:
 
- 				default:
 
- 					bgp4mp_message_direction_receive(entry)
 
- 						? printf("%s|%u|",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr),entry->body.zebra_message.source_as)
 
- 						: printf("%s|%u|",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr),entry->body.zebra_message.destination_as);
 
- 					break;
 
- 				}
 
-                 is_addpath(entry)
 
-                     ? printf("%s/%d|%u|%s|%s|",inet_ntoa(prefix->nlri[idx].address.v4_addr),prefix->nlri[idx].len,prefix->nlri[idx].path_id,attr_aspath(entry->attr),describe_origin(entry->attr->origin))
 
-                     : printf("%s/%d|%s|%s|",inet_ntoa(prefix->nlri[idx].address.v4_addr),prefix->nlri[idx].len,attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 		    npref=entry->attr->local_pref;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
- 	            npref=0;
 
- 		    nmed=entry->attr->med;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
- 	            nmed=0;
 
- 			    
 
-                 if (prefix->nexthop_len == 4)
 
-                     printf("%s|%d|%d|",inet_ntoa(prefix->nexthop.v4_addr),npref,nmed);
 
-                 else if ((prefix->nexthop_len == 16) || (prefix->nexthop_len == 32))
 
-                     printf("%s|%d|%d|",fmt_ipv6(prefix->nexthop,buf),npref,nmed);
 
-                 
 
- 				//printf("%s|%d|%d|",inet_ntoa(prefix->nexthop.v4_addr),entry->attr->local_pref,entry->attr->med);
 
- 				if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
- 		    		printf("%s|",entry->attr->community->str+1);
 
- 				else
 
- 					printf("|");
 
-                 if (show_large_comms) {
 
-                     if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0) 
 
-                         printf("%s|",entry->attr->lcommunity->str+1);
 
-                     else
 
-                         printf("|");
 
-                 }
 
-                 printf("%s|", aggregate); /* AG/NAG */
 
- 			}
 
- 			else 
 
- 			{
 
-                 // I'm not convinced this code block is actually ever executed
 
-                 // it appears to handle old-style (non-MP) yet this function isn't
 
-                 // called for that type.....
 
-                 // cpetrie@ 2016-08-12
 
- 				switch(entry->body.zebra_message.address_family)
 
- 				{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 				case AFI_IP6:
 
- 					bgp4mp_message_direction_receive(entry)
 
- 						? printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.source_ip,buf),entry->body.zebra_message.source_as)
 
- 						: printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf),entry->body.zebra_message.destination_as);
 
- 					break;
 
- #endif
 
- 				case AFI_IP:
 
- 				default:
 
- 					bgp4mp_message_direction_receive(entry)
 
- 						? printf("%s|%u|",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr),entry->body.zebra_message.source_as)
 
- 						: printf("%s|%u|",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr),entry->body.zebra_message.destination_as);
 
- 					break;
 
- 				}
 
-                 is_addpath(entry)
 
-                     ? printf("%s/%d|%u|%s|%s|",inet_ntoa(prefix->nlri[idx].address.v4_addr),prefix->nlri[idx].len,prefix->nlri[idx].path_id,attr_aspath(entry->attr),describe_origin(entry->attr->origin))
 
-                     : printf("%s/%d|%s|%s|",inet_ntoa(prefix->nlri[idx].address.v4_addr),prefix->nlri[idx].len,attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 		    npref=entry->attr->local_pref;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
- 	            npref=0;
 
- 		    nmed=entry->attr->med;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
- 	            nmed=0;
 
- 			    
 
- 			    printf("%s|%d|%d|",inet_ntoa(entry->attr->nexthop),npref,nmed);
 
- 				//printf("%s|%d|%d|",inet_ntoa(entry->attr->nexthop),entry->attr->local_pref,entry->attr->med);
 
- 				if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
- 		    		printf("%s|",entry->attr->community->str+1);
 
- 				else
 
- 					printf("|");
 
-                 if (show_large_comms) {
 
-                     if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0) 
 
-                         printf("%s|",entry->attr->lcommunity->str+1);
 
-                     else
 
-                         printf("|");
 
-                 }
 
-                 printf("%s|",aggregate); /* AG/NAG */
 
- 			}
 
- 			if (entry->attr->aggregator_addr.s_addr != -1) {
 
- 				printf("%u %s",entry->attr->aggregator_as,inet_ntoa(entry->attr->aggregator_addr));
 
- 			}
 
- 			printf("|");
 
- 			if (show_unknown_attributes) {
 
- 				append_compact_unknown_attributes(entry->attr);
 
- 			}
 
- 			printf("\n");
 
- 		}
 
- 		else
 
- 		{
 
- 			switch(entry->body.zebra_message.address_family)
 
- 			{
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 			case AFI_IP6:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.source_ip,buf),entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf),entry->body.zebra_message.destination_as);
 
- 				break;
 
- #endif
 
- 			case AFI_IP:
 
- 			default:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|",inet_ntoa(entry->body.zebra_message.source_ip.v4_addr),entry->body.zebra_message.source_as)
 
- 					: printf("%s|%u|",inet_ntoa(entry->body.zebra_message.destination_ip.v4_addr),entry->body.zebra_message.destination_as);
 
- 				break;
 
- 			}
 
-             is_addpath(entry)
 
-                 ? printf("%s/%d|%u|%s|%s\n",inet_ntoa(prefix->nlri[idx].address.v4_addr),prefix->nlri[idx].len,prefix->nlri[idx].path_id,attr_aspath(entry->attr),describe_origin(entry->attr->origin))
 
-                 : printf("%s/%d|%s|%s\n",inet_ntoa(prefix->nlri[idx].address.v4_addr),prefix->nlri[idx].len,attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 				
 
- 		}
 
- 	}
 
- }
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- static void table_line_announce6(struct mp_nlri *prefix,int count,BGPDUMP_ENTRY *entry,char *time_str)
 
- {
 
- 	int idx  ;
 
- 	char buf[128];
 
- 	char buf1[128];
 
- 	char buf2[128];
 
- 	char aggregate[20];
 
- 	unsigned int npref;
 
- 	unsigned int nmed;
 
- 	if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
 
- 		sprintf(aggregate,"AG");
 
- 	else
 
- 		sprintf(aggregate,"NAG");
 
- 	for (idx=0;idx<count;idx++)
 
- 	{
 
-         show_line_prefix(get_bgp4mp_format(entry), time_str, "A");
 
- 		if (mode == 1)
 
- 		{
 
- 			switch(entry->body.zebra_message.address_family)
 
- 			{
 
- 			case AFI_IP6:
 
- 				
 
- 		    npref=entry->attr->local_pref;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
- 	            npref=0;
 
- 		    nmed=entry->attr->med;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
- 	            nmed=0;
 
- 			    
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|%s/%d|",fmt_ipv6(entry->body.zebra_message.source_ip,buf1),entry->body.zebra_message.source_as,fmt_ipv6(prefix->nlri[idx].address,buf2),prefix->nlri[idx].len)
 
- 					: printf("%s|%u|%s/%d|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf1),entry->body.zebra_message.destination_as,fmt_ipv6(prefix->nlri[idx].address,buf2),prefix->nlri[idx].len);
 
- 				break;
 
- 			case AFI_IP:
 
- 			default:
 
- 		    npref=entry->attr->local_pref;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
- 	            npref=0;
 
- 		    nmed=entry->attr->med;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
- 	            nmed=0;
 
- 			    
 
- 			//printf("%s|%d|%d|",inet_ntoa(entry->attr->nexthop),nprof,nmed);
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|%s/%d|",fmt_ipv4(entry->body.zebra_message.source_ip,buf1),entry->body.zebra_message.source_as,fmt_ipv6(prefix->nlri[idx].address,buf2),prefix->nlri[idx].len)
 
- 					: printf("%s|%u|%s/%d|",fmt_ipv4(entry->body.zebra_message.destination_ip,buf1),entry->body.zebra_message.destination_as,fmt_ipv6(prefix->nlri[idx].address,buf2),prefix->nlri[idx].len);
 
- 				break;
 
- 			}
 
-             if (is_addpath(entry))
 
-                 printf("%u|", prefix->nlri[idx].path_id);
 
-             if (prefix->nexthop_len == 4)
 
-                 printf("%s|%s|%s|%u|%u|", attr_aspath(entry->attr),describe_origin(entry->attr->origin),inet_ntoa(prefix->nexthop.v4_addr),npref,nmed);
 
-             else if ((prefix->nexthop_len == 16) || (prefix->nexthop_len == 32))
 
-                 printf("%s|%s|%s|%u|%u|", attr_aspath(entry->attr),describe_origin(entry->attr->origin),fmt_ipv6(prefix->nexthop,buf),npref,nmed);
 
- 			if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
- 		    		printf("%s|",entry->attr->community->str+1);
 
- 			else
 
- 				printf("|");
 
-             if (show_large_comms) {
 
-                 if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0) 
 
-                     printf("%s|",entry->attr->lcommunity->str+1);
 
-                 else
 
-                     printf("|");
 
-             }
 
-             printf("%s|", aggregate); /* AG/NAG */
 
- 			if (entry->attr->aggregator_addr.s_addr != -1) {
 
- 				printf("%u %s",entry->attr->aggregator_as,inet_ntoa(entry->attr->aggregator_addr));
 
- 			}
 
- 			printf("|");
 
- 			if (show_unknown_attributes) {
 
- 				append_compact_unknown_attributes(entry->attr);
 
- 			}
 
- 			printf("\n");
 
- 		}
 
- 		else
 
- 		{
 
- 			switch(entry->body.zebra_message.address_family)
 
- 			{
 
- 			case AFI_IP6:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|%s/%d|",fmt_ipv6(entry->body.zebra_message.source_ip,buf1),entry->body.zebra_message.source_as,fmt_ipv6(prefix->nlri[idx].address,buf),prefix->nlri[idx].len)
 
- 					: printf("%s|%u|%s/%d|",fmt_ipv6(entry->body.zebra_message.destination_ip,buf1),entry->body.zebra_message.destination_as,fmt_ipv6(prefix->nlri[idx].address,buf),prefix->nlri[idx].len);
 
- 				break;
 
- 			case AFI_IP:
 
- 			default:
 
- 				bgp4mp_message_direction_receive(entry)
 
- 					? printf("%s|%u|%s/%d|",fmt_ipv4(entry->body.zebra_message.source_ip,buf1),entry->body.zebra_message.source_as,fmt_ipv6(prefix->nlri[idx].address,buf),prefix->nlri[idx].len)
 
- 					: printf("%s|%u|%s/%d|",fmt_ipv4(entry->body.zebra_message.destination_ip,buf1),entry->body.zebra_message.destination_as,fmt_ipv6(prefix->nlri[idx].address,buf),prefix->nlri[idx].len);
 
- 				break;
 
- 			}
 
-             if (is_addpath(entry))
 
-                 printf("%u|", prefix->nlri[idx].path_id);
 
-             printf("%s|%s\n",attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 		}		
 
- 	}
 
- }
 
- #endif
 
- static void table_line_mrtd_route(BGPDUMP_MRTD_TABLE_DUMP *route,BGPDUMP_ENTRY *entry)
 
- {
 
- 	
 
- 	struct tm *date = NULL;
 
- 	char aggregate[20];	
 
- 	unsigned int npref;
 
- 	unsigned int nmed;
 
- 	char  time_str[20];
 
-         char peer[BGPDUMP_ADDRSTRLEN], prefix[BGPDUMP_ADDRSTRLEN], nexthop[BGPDUMP_ADDRSTRLEN];
 
- 	if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
 
- 		sprintf(aggregate,"AG");
 
- 	else
 
- 		sprintf(aggregate,"NAG");
 
-     time_t *t;
 
-     if (timetype==0) {
 
-         t = &entry->time;
 
-     } else {
 
-         t = &route->uptime;
 
-     }
 
-     if (mode == 1) {
 
-         sprintf(time_str, "%lld", (long long)*t);
 
-     } else {
 
-         date=gmtime(t);
 
-         time2str(date, time_str);
 
-     }
 
-     show_line_prefix("TABLE_DUMP", time_str, "B");
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 	    	if (entry->subtype == AFI_IP6)
 
- 		{
 
- 		    fmt_ipv6(route->peer_ip,peer);
 
- 		    fmt_ipv6(route->prefix,prefix);
 
- 		}
 
- 	    	else
 
- #endif
 
-                 {
 
- 		    strncpy(peer, inet_ntoa(route->peer_ip.v4_addr), BGPDUMP_ADDRSTRLEN);
 
-                     strncpy(prefix, inet_ntoa(route->prefix.v4_addr), BGPDUMP_ADDRSTRLEN);
 
- 		}
 
- 		if (mode == 1)
 
- 		{
 
-                     printf("%s|%u|",peer,route->peer_as);
 
-                     printf("%s/%d|%s|%s|",prefix,route->mask,
 
-                            attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 		    npref=entry->attr->local_pref;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
- 	            npref=0;
 
- 		    nmed=entry->attr->med;
 
- 	            if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
- 	            nmed=0;
 
- 			    
 
- #ifdef BGPDUMP_HAVE_IPV6
 
- 	    	if ((entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI)) && entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST])
 
- 		{
 
- 		    fmt_ipv6(entry->attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop,nexthop);
 
- 		}
 
- 	    	else
 
- #endif
 
-                 {
 
- 		    strncpy(nexthop, inet_ntoa(entry->attr->nexthop), BGPDUMP_ADDRSTRLEN);
 
- 		}
 
- 		   printf("%s|%u|%u|",nexthop,npref,nmed);
 
- 		   if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
- 		    		printf("%s|",entry->attr->community->str+1);
 
- 			else
 
- 				printf("|");
 
-             if (show_large_comms) {
 
-                 if( (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0)  
 
-                     printf("%s|",entry->attr->lcommunity->str+1);
 
-                 else
 
-                     printf("|");
 
-             }
 
-             printf("%s|",aggregate); /* AG/NAG */
 
- 				
 
-             if (entry->attr->aggregator_addr.s_addr != -1) {
 
-                 printf("%u %s",entry->attr->aggregator_as,inet_ntoa(entry->attr->aggregator_addr));
 
-             }
 
-             printf("|");
 
-             if (show_unknown_attributes) {
 
-                 append_compact_unknown_attributes(entry->attr);
 
-             }
 
-             printf("\n");
 
- 		}
 
- 		else
 
- 		{
 
- 	 	    printf("%s|%u|",peer,route->peer_as);
 
-                     printf("%s/%d|%s|%s\n",prefix,route->mask,attr_aspath(entry->attr),describe_origin(entry->attr->origin));
 
- 		}
 
- }
 
- static char *describe_origin(int origin) {
 
-     if(origin == 0) return "IGP";
 
-     if(origin == 1) return "EGP";
 
-     return "INCOMPLETE";
 
- }
 
- static void table_line_dump_v2_prefix(BGPDUMP_TABLE_DUMP_V2_PREFIX *e,BGPDUMP_ENTRY *entry)
 
- {
 
-     struct tm *date = NULL;
 
-     unsigned int npref;
 
-     unsigned int nmed;
 
-     char  time_str[20];
 
-     char peer[BGPDUMP_ADDRSTRLEN], prefix[BGPDUMP_ADDRSTRLEN], nexthop[BGPDUMP_ADDRSTRLEN];
 
-     
 
-     int i;
 
-     int addpath = is_addpath(entry);
 
-     
 
-     for(i = 0; i < e->entry_count; i++) {
 
-         attributes_t *attr = e->entries[i].attr;
 
-         if(! attr)
 
-             continue;
 
-         
 
-         char *origin = describe_origin(attr->origin);
 
-         char *aspath_str = (attr->aspath) ? attr->aspath->str: "";
 
-         char *aggregate = attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE) ? "AG" : "NAG";
 
-         
 
-         if(e->entries[i].peer->afi == AFI_IP){
 
-             fmt_ipv4(e->entries[i].peer->peer_ip, peer);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
-         } else if(e->entries[i].peer->afi == AFI_IP6){
 
-             fmt_ipv6(e->entries[i].peer->peer_ip, peer);
 
- #endif
 
-         }
 
-         
 
-         if(e->afi == AFI_IP) {
 
-             fmt_ipv4(e->prefix, prefix);
 
- #ifdef BGPDUMP_HAVE_IPV6
 
-         } else if(e->afi == AFI_IP6) {
 
-             fmt_ipv6(e->prefix, prefix);
 
- #endif
 
-         }
 
-         time_t *t;
 
-         if (timetype==0) {
 
-             t = &entry->time;
 
-         } else {
 
-             time_t tmp = (time_t)((e->entries[i]).originated_time);
 
-             t = &tmp;
 
-         }
 
-         if (mode == 1) {
 
-             sprintf(time_str, "%lld", (long long)*t);
 
-         } else {
 
-             date=gmtime(t);
 
-             time2str(date, time_str);
 
-         }
 
-         (addpath)
 
-             ? show_line_prefix("TABLE_DUMP2_AP", time_str, "B")
 
-             : show_line_prefix("TABLE_DUMP2", time_str, "B");
 
-         if (mode == 1)
 
-         {
 
-             printf("%s|%u|",peer,e->entries[i].peer->peer_as);
 
-             (addpath)
 
-                 ? printf("%s/%d|%u|%s|%s|",prefix,e->prefix_length,e->entries[i].path_id,aspath_str,origin)
 
-                 : printf("%s/%d|%s|%s|",prefix,e->prefix_length,aspath_str,origin);
 
-             
 
-             npref=attr->local_pref;
 
-             if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF) ) ==0)
 
-                 npref=0;
 
-             nmed=attr->med;
 
-             if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ) ==0)
 
-                 nmed=0;
 
-             
 
-             if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI)) && attr->mp_info->announce[AFI_IP6][SAFI_UNICAST])
 
-             {
 
-                 if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_len == 4)
 
-                     strncpy(nexthop, inet_ntoa(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop.v4_addr), BGPDUMP_ADDRSTRLEN);
 
-                 else if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_len == 16)
 
-                     fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop,nexthop);
 
-                 else if (attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop_len == 32)
 
-                     fmt_ipv6(attr->mp_info->announce[AFI_IP6][SAFI_UNICAST]->nexthop,nexthop);
 
-             }
 
-             else if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MP_REACH_NLRI)) && attr->mp_info->announce[AFI_IP][SAFI_UNICAST])
 
-             {
 
-                 if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_len == 4)
 
-                     strncpy(nexthop, inet_ntoa(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop.v4_addr), BGPDUMP_ADDRSTRLEN);
 
-                 else if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_len == 16)
 
-                     fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop,nexthop);
 
-                 else if (attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop_len == 32)
 
-                     fmt_ipv6(attr->mp_info->announce[AFI_IP][SAFI_UNICAST]->nexthop,nexthop);
 
-             }
 
-             else
 
-             {
 
-                 strncpy(nexthop, inet_ntoa(attr->nexthop), BGPDUMP_ADDRSTRLEN);
 
-             }
 
-             printf("%s|%u|%u|",nexthop,npref,nmed);
 
-             
 
-             if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES) ) !=0)	
 
-                 printf("%s|",attr->community->str+1);
 
-             else
 
-                 printf("|");
 
-             if (show_large_comms) {
 
-                 if( (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES) ) !=0)    
 
-                     printf("%s|",attr->lcommunity->str+1);
 
-                 else
 
-                     printf("|");
 
-             }
 
-             
 
-             printf("%s|",aggregate);
 
-             if (attr->aggregator_addr.s_addr != -1) {
 
-                 printf("%u %s",attr->aggregator_as,inet_ntoa(attr->aggregator_addr));
 
-             }
 
-             printf("|");
 
-             if (show_unknown_attributes) {
 
-                 append_compact_unknown_attributes(attr);
 
-             }
 
-             printf("\n");
 
-         }
 
-         else
 
-         {
 
-             printf("%s|%u|",peer,e->entries[i].peer->peer_as);
 
-             (addpath)
 
-                 ? printf("%s/%d|%u|%s|%s\n",prefix,e->prefix_length,e->entries[i].path_id,aspath_str,origin)
 
-                 : printf("%s/%d|%s|%s\n",prefix,e->prefix_length,aspath_str,origin);
 
-             
 
-         }
 
-     }
 
-     
 
- }
 
 
  |