123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019 |
- /*
- 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];
- }
- }
- static int mode=0;
- static int timetype=0;
- static int show_packet_index = 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\
- \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\
- \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;
-
- log_to_stderr();
-
- while ((c=getopt(argc,argv,"if:o:t:mMHO:svTp"))!=-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 '?':
- default:
- usage_error = true;
- }
- argc -= optind;
- argv += optind;
-
- if(use_syslog) {
- 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);
- }
-
- }
- 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 tmp2[20];
- unsigned int npref;
- unsigned int nmed;
- if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
- sprintf(tmp2,"AG");
- else
- sprintf(tmp2,"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|%s|",entry->attr->community->str+1,tmp2);
- else
- printf("|%s|",tmp2);
-
- 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
- {
- 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 tmp2[20];
- unsigned int npref;
- unsigned int nmed;
- if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
- sprintf(tmp2,"AG");
- else
- sprintf(tmp2,"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|%s|",entry->attr->community->str+1,tmp2);
- else
- printf("|%s|",tmp2);
- }
- 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|%s|",entry->attr->community->str+1,tmp2);
- else
- printf("|%s|",tmp2);
- }
- 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
- {
- 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 tmp2[20];
- unsigned int npref;
- unsigned int nmed;
- if (entry->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
- sprintf(tmp2,"AG");
- else
- sprintf(tmp2,"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|%s|",entry->attr->community->str+1,tmp2);
- else
- printf("|%s|",tmp2);
- 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
- {
- 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 tmp2[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(tmp2,"AG");
- else
- sprintf(tmp2,"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|%s|",entry->attr->community->str+1,tmp2);
- else
- printf("|%s|",tmp2);
-
- 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("%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|%s|",attr->community->str+1,aggregate);
- else
- printf("|%s|",aggregate);
-
- if (attr->aggregator_addr.s_addr != -1)
- printf("%u %s|\n",attr->aggregator_as,inet_ntoa(attr->aggregator_addr));
- else
- 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);
-
- }
- }
-
- }
|