Skip to content

Commit

Permalink
Experiment with rewriting Dumper with visitor pattern
Browse files Browse the repository at this point in the history
Initial part of the rewriting, code is not compiling yet
  • Loading branch information
cawka committed Sep 29, 2010
1 parent c431fb8 commit b2a0664
Show file tree
Hide file tree
Showing 100 changed files with 3,216 additions and 717 deletions.
2 changes: 1 addition & 1 deletion Makefile.am
@@ -1,4 +1,4 @@
SUBDIRS=parser dumper examples
SUBDIRS=parser dumper2

ACLOCAL_AMFLAGS = -I m4

Expand Down
2 changes: 1 addition & 1 deletion configure.ac
Expand Up @@ -81,6 +81,6 @@ dnl AC_FUNC_REALLOC

AC_OUTPUT(Makefile bgpparser.pc
parser/Makefile
dumper/Makefile
dumper2/Makefile
examples/Makefile
)
2 changes: 1 addition & 1 deletion dumper/AttributeTypeAggregatorDumper.cpp
Expand Up @@ -81,6 +81,6 @@ string AttributeTypeAggregatorDumper::genAscii()

node << (int)as << " " << FORMAT_IPv4_ADDRESS( attr->getAggregatorBGPSpeakerIPAddress().ipv4 );
return node.str( );
}
}

// vim: sw=4 ts=4 sts=4 expandtab
4 changes: 2 additions & 2 deletions dumper/BGPMessageDumper.cpp
Expand Up @@ -114,11 +114,11 @@ string BGPMessageDumper::genAscii()
string src_addr, dst_addr;
switch(afi)
{
case AFI_IPv4:
case AFI_IPv4:
src_addr=FORMAT_IPv4_ADDRESS( local_addr.ipv4 );
dst_addr=FORMAT_IPv4_ADDRESS( peer_addr.ipv4 );
break;
case AFI_IPv6:
case AFI_IPv6:
src_addr=FORMAT_IPv6_ADDRESS( local_addr.ipv6 );
dst_addr=FORMAT_IPv6_ADDRESS( peer_addr.ipv6 );
break;
Expand Down
5 changes: 1 addition & 4 deletions dumper/BGPUpdateDumper.cpp
Expand Up @@ -126,9 +126,6 @@ list<string> BGPUpdateDumper::genAsciiMsg(string peer_addr, string peer_as, bool
BGPUpdatePtr bgp_update = dynamic_pointer_cast<BGPUpdate>( bgp_msg );
list<string> bgp_msg_list;

// list<Route> NLRI;
// list<Route> WITHDRAWN;

/* BGP Update node */
// Attributes
string as_path = "";
Expand Down Expand Up @@ -157,7 +154,7 @@ list<string> BGPUpdateDumper::genAsciiMsg(string peer_addr, string peer_as, bool
case 6: agg = attr_dumper->genAscii(); break;
case 7: aggregator = attr_dumper->genAscii(); break;
case 8: communities = attr_dumper->genAscii(); break;

case 14:
mp_reach = attr;
break;
Expand Down
32 changes: 3 additions & 29 deletions dumper/Makefile.am
Expand Up @@ -21,33 +21,7 @@ bgpparser_SOURCES = \
FakeBGPUpdate.cpp FakeBGPUpdate.h \
FakeBGPAttribute.cpp FakeBGPAttribute.h \
FakeAttributeTypeMPReachNLRI.cpp FakeAttributeTypeMPReachNLRI.h \
AttributeTypeASPathDumper.cpp \
AttributeTypeAggregatorDumper.cpp \
AttributeTypeAtomicAggregateDumper.cpp \
AttributeTypeClusterListDumper.cpp \
AttributeTypeCommunitiesDumper.cpp \
AttributeTypeDumper.cpp \
AttributeTypeLocalPrefDumper.cpp \
AttributeTypeMPReachNLRIDumper.cpp \
AttributeTypeMPUnreachNLRIDumper.cpp \
AttributeTypeMultiExitDiscDumper.cpp \
AttributeTypeNextHopDumper.cpp \
AttributeTypeOriginDumper.cpp \
AttributeTypeOriginatorIDDumper.cpp \
BGPAttributeDumper.cpp \
BGPDumper.cpp \
BGPKeepAliveDumper.cpp \
BGPMessageDumper.cpp \
BGPNotificationDumper.cpp \
BGPOpenDumper.cpp \
BGPRouteRefreshDumper.cpp \
BGPStateChangeDumper.cpp \
BGPUpdateDumper.cpp \
Dumper.cpp \
MRTBgp4MPMessageDumper.cpp \
MRTBgp4MPStateChangeDumper.cpp \
MRTTblDumpV1Dumper.cpp \
MRTTblDumpV2Dumper.cpp \
mrt2xml.cpp \
xmlinternal.c
AsciiVisitor.cpp XMLVisitor.cpp \
xmlinternal.c \
main.cpp

127 changes: 5 additions & 122 deletions dumper/mrt2xml.cpp
Expand Up @@ -40,18 +40,9 @@

/* MRT classes */
#include "MRTCommonHeader.h"
#include "MRTBgp4MPStateChange.h"
#include "MRTBgp4MPMessage.h"
#include "MRTTblDump.h"
#include "MRTTblDumpV2PeerIndexTbl.h"
#include "Exceptions.h"

/* Dumper class */
#include "Dumper.h"
#include "MRTTblDumpV1Dumper.h"
#include "MRTTblDumpV2Dumper.h"
#include "MRTBgp4MPMessageDumper.h"
#include "MRTBgp4MPStateChangeDumper.h"
#include "AsciiVisitor.h"

//#define MAX_MRT_TYPE_NUM 49
//#define MAX_MRT_SUBTYPE_NUM 6
Expand Down Expand Up @@ -256,125 +247,17 @@ int main(int argc, char** argv)

unsigned int unTotalBytesRead = 0;

AsciiVisitor visitor;

shared_ptr<MRTTblDumpV2Dumper> mrt_tblv2_dumper( new MRTTblDumpV2Dumper() );
while( in.peek()!=-1 )
{
try
{
MRTMessagePtr msg = MRTCommonHeader::newMessage( in );

switch( msg->getType() )
{
// -------------------------- //
// TABLE_DUMP //
// -------------------------- //
case TABLE_DUMP:
{
// dump_type = 1;
switch(msg->getSubType())
{
case AFI_IPv4:
case AFI_IPv6:
{
// Prepare BGP4MP Message pointer ./
MRTTblDumpPtr tblDump = dynamic_pointer_cast<MRTTblDump>( msg );

// Dumper for BGP Message ./
MRTTblDumpV1DumperPtr mrt_tblv1_dumper( new MRTTblDumpV1Dumper() );
mrt_tblv1_dumper->setTblDumpMsg( tblDump );
procMsg( mrt_tblv1_dumper, flag_format, flag_newline, flag_bgpdump );
}
break;

default:
LOG4CXX_ERROR( _log, "Undefined Subtype (TABLE_DUMP_V1) :" << msg->getSubType() );
break;
}
}
break;

// -------------------------- //
// TABLE_DUMP_V2 //
// -------------------------- //
case TABLE_DUMP_V2:
{
// dump_type = 2;
// Dumper for Table Dumper v2 //
switch (msg->getSubType())
{
case RIB_IPV4_UNICAST:
case RIB_IPV4_MULTICAST:
case RIB_IPV6_UNICAST:
case RIB_IPV6_MULTICAST:
{
MRTTblDumpV2RibHeaderPtr tblDumpHeader =
dynamic_pointer_cast<MRTTblDumpV2RibHeader>( msg );

mrt_tblv2_dumper->setTblDumpMsg( tblDumpHeader );
procMsg( mrt_tblv2_dumper, flag_format, flag_newline, flag_bgpdump );
}
break;

case PEER_INDEX_TABLE:
{
MRTTblDumpV2PeerIndexTblPtr peerIndexTbl
= dynamic_pointer_cast<MRTTblDumpV2PeerIndexTbl>( msg );

mrt_tblv2_dumper->setPeerIndexTbl( peerIndexTbl );
}
break;

default:
LOG4CXX_ERROR(_log, "Undefined Subtype (TABLE_DUMP_V2) :" << msg->getSubType() );
break;
}
break;
}
break;

// -------------------------- //
// BGP4MP //
// -------------------------- //
case BGP4MP:
{
// dump_type = 0;
switch (msg->getSubType())
{
case BGP4MP_MESSAGE:
case BGP4MP_MESSAGE_AS4:
{
// Prepare BGP4MP Message pointer ./
MRTBgp4MPMessagePtr bgp4MPmsg = dynamic_pointer_cast<MRTBgp4MPMessage>( msg );

// Dumper for BGP Message ./
MRTBgp4MPMessageDumperPtr mrt_bgp4mp_msg_dumper = MRTBgp4MPMessageDumper::newDumper( bgp4MPmsg );
procMsg( mrt_bgp4mp_msg_dumper, flag_format, flag_newline, flag_bgpdump );
}
break;

case BGP4MP_STATE_CHANGE:
case BGP4MP_STATE_CHANGE_AS4:
{
// Prepare BGP4MP State Change pointer //
MRTBgp4MPStateChangePtr bgp4MPmsg = dynamic_pointer_cast<MRTBgp4MPStateChange>( msg );

// Dumper for BGP State Change //
MRTBgp4MPStateChangeDumperPtr mrt_bgp4mp_sc_dumper = MRTBgp4MPStateChangeDumper::newDumper( bgp4MPmsg );
procMsg( mrt_bgp4mp_sc_dumper, flag_format, flag_newline, flag_bgpdump );
}
break;

default:
LOG4CXX_ERROR( _log,"Undefined Subtype (BGP4MP) :" << msg->getSubType() );
break;
}
}
break;

default:
LOG4CXX_ERROR(_log, "Undefined Type:" << msg->getType());
break;
}
msg->accept( visitor );

}
catch( BGPParserError &e )
{
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions dumper2/ASSegmentVisitor.cpp
@@ -0,0 +1,4 @@

#include <bgpparser.h>

#include "ASSegmentVisitor.h"
40 changes: 40 additions & 0 deletions dumper2/ASSegmentVisitor.h
@@ -0,0 +1,40 @@

#ifndef _ASCII_ATTRS_VISITOR_H_
#define _ASCII_ATTRS_VISITOR_H_

#include <visitors/GJDepthFirst.h>

class ASSegmentVisitor : public GJDepthFirst
{
virtual boost::any& visit( AttributeTypeASPathSegment &n, boost::any &param )
{
string head = "";
string tail = "";
string sep = " ";

switch( n.getPathSegmentType() )
{
case AttributeTypeASPathSegment::AS_SEQUENCE: head = ""; tail=""; sep=" "; break;
case AttributeTypeASPathSegment::AS_SET: head = "{"; tail="}", sep=","; break;
case AttributeTypeASPathSegment::AS_CONFED_SEQUENCE: head = "("; tail=")"; sep=" "; break;
case AttributeTypeASPathSegment::AS_CONFED_SET: head = "["; tail="]"; sep=","; break;
}

ostringstream os;

os << head;
bool isFirst=true;
BOOST_FOREACH( uint32_t asn, as_seg->getPathSegmentValue() )
{
if( isFirst )
isFirst=false;
else
os << sep;

os << asn;
}
os << tail;
}
};

#endif
2 changes: 2 additions & 0 deletions dumper2/AsciiBGPVisitor.cpp
@@ -0,0 +1,2 @@

#include "AsciiBGPVisitor.h"
84 changes: 84 additions & 0 deletions dumper2/AsciiBGPVisitor.h
@@ -0,0 +1,84 @@

#include <bgpparser.h>
#include <visitors/GJVoidDepthFirst.h>

#include "AttrsVisitor.h"

#include "Params.h"


class AsciiBGPVisitor : public AttrsVisitor
{
virtual void visit( BGPOpen &n, boost::any &param )
{
// prevent visiting optional headers
}

virtual void visit( BGPUpdate &n, boost::any &param )
{
BOOST_FOREACH( const BGPAttributePtr &attr, n.getPathAttributes() )
{
attr->accept( *this, param );
}

param.afi=AFI_IPv4;

BOOST_FOREACH( const RoutePtr &route, n.getWithdrawnRoutes() )
{
route->accept( *this, param );
}

BOOST_FOREACH( const RoutePtr &route, n.getNlriRoutes() )
{
route->accept( *this, param );
}
}

virtual void visit( AttributeTypeMPReachNLRI &n, boost::any &param )
{
param.afi = n.getAFI( );
param.next_hop = FORMAT_IP_ADDRESS( n.getNextHopAddress(), n.getAFI() );

BOOST_FOREACH( const NLRIReachablePtr& route, n.getNLRI() )
{
route->accept( *this, param );
}

BOOST_FOREACH( const NLRIReachablePtr& route, n.getSNPA() )
{
route->accept( *this, param );
}
}
virtual void visit( AttributeTypeMPUnreachNLRI &n, boost::any &param )
{
param.afi = n.getAFI( );

BOOST_FOREACH( const NLRIUnReachablePtr &route, n.getNLRI() )
{
route->accept( *this, param );
}
}

virtual void visit( Route &n, boost::any &param )
{
// n.getLength( )
// n.getPrefix( )
// n.getNumOctets( )
// + helper methods available, see Route
}

virtual void visit( NLRIReachable &n, boost::any &param )
{
// n.getLength( )
// n.getPrefix( )
// n.getNumOctets( )
// + helper methods available, see Route
}
virtual void visit( NLRIUnReachable &n, boost::any &param )
{
std::cout
<< param.mrt_type << "|" << param.timestamp << "|"
<< "W" + "|" + param.peer_addr + "|" + param.peer_as + "|" + n.toString( params.afi )
<< std::endl;
}
};
4 changes: 4 additions & 0 deletions dumper2/AsciiVisitor.cpp
@@ -0,0 +1,4 @@

#include <bgpparser.h>

#include <AsciiVisitor.h>

0 comments on commit b2a0664

Please sign in to comment.