Network Simulation Using GlomoSim Presented By Akarapon Kunpisut 1 Outline Introduction to Glomosim Glomosim Structure Editing the code Installation Conclusion 2 Introduction 3 methods to analysis network protocol Mathematical Analysis Network Simulator (NS, GloMoSim, …) Test bed 3 Network Simulator (GloMoSim) Requires 2 components GloMoSim (Global Mobile Information Systems Simulation Library) Network Simulation Environment Parsec (Parallel Simulation Environment for Complex Systems) C-Base Simulation Language 4 GloMoSim (Scalable Mobile Network Simulator ) a scalable simulation environment supports Wire & Wireless network layered approach Standard APIs parallel discrete-event simulation 5 Parsec C-based simulation language sequential and parallel execution discrete-event simulation models can be used as a parallel programming language. developed by the Parallel Computing Laboratory at UCLA 6 GloMoSim Simulation Layers Application Traffic Generator RTP, TCP, UTP RSVP IP, Mobile IP Wireless Network Layer Clustering (optional) Multicast Routing -------------QoS Routing VC Connection Management Call Acceptance Control, Rate Control Packet Store / Forward Congestion Control, Rate Control Data Link MAC Radio Model Propagation Model/Mobility Model 7 Models Currently Available in GloMoSim Application: TCPLIB (telnet, ftp) , CBR (Constant Bit Rate traffic), Replicated file system, HTTP Transport: TCP (Free BSD), UDP, NS TCP (Tahoe) and others Unicast Routing: AODV, Bellman-Ford, DSR, Fisheye, Flooding, LAR (Scheme 1), NS DSDV, OSPF, WRP MAC Layer: CSMA, FAMA, MACA, IEEE 802.11 Radio: Radio with and without capture capacity Propagation: Free Space, Rayleigh, Ricean, SIRCIM Mobility: Random Waypoint, Random Drunken, ECRV, Group Mobility 8 GloMoSim Layered Architecture collection of network nodes each node has it’s own protocol stack parameters and statistics struct glomo_node_str{ double position_x; GlomoMac macData[xxx]; GlomoNetwork NetworkData; … } GlomoNode; Include\api.h 9 Data Structure for a Layer each layer has its own data structure base on protocol in the layer struct glomo_mac_str { MAC_PROTOCOL macProtocol; int interfaceIndex; BOOL macStats; … void *macVar; } GlomoMac; mac\mac.h 10 Layer Interaction with Events Packets & Message going through layers are annotated with information that simulate inter-layer parameter passing 11 Scheduling Events Two types of Message Non-Packet Messages Inter-layer event messages Self scheduled (timer) events Packets/ Cell Messages Inter-node packets Inter-layer packets 12 Non-packet Message MSG_MAC_TimerExpired Self scheduled (timer) events GLOMO_MacLayer() MAC Mac802_11StartTimer() typedef enum { RADIO_IDLE, RADIO_SENSING, RADIO_RECEIVING, RADIO_TRANSMITTING } RadioStatusType; GLOMO_MacReceiveRadioS tatusChangeNotification() Inter-layer event messages Radio RadioAccnoiseLayer() 13 Packet/cell Message NetworkIpSend PacketToMacLayer() Network Inter-layer packets GLOMO_MacNetwork LayerHasPacketToSend() Add Header Network NetworkIpReceive PacketFromMacLayer() Inter-layer packets Mac802_11ProcessFrame() MAC MAC GLOMO_MacReceive PacketFromRadio () Mac802_11TransmitDataFrame() Inter-layer packets GLOMO_RadioStartTransmittingPacket() Radio Layer Remove Header Inter-layer packets RadioAccnoiseLayer () Radio Layer Inter-Node Packet 14 Packet/cell Message NetworkIpSend PacketToMacLayer() Network Inter-layer packets (Network Layer Packet) /* Data frames. NetworkIpReceive */ Header + Data Network typedef struct M802_mac_frame PacketFromMacLayer() { M802_11FrameHdr hdr; Inter-layer packets char payload[ MAX_NW_PKT_SIZE]; GLOMO_MacNetwork LayerHasPacketToSend() Mac802_11ProcessFrame() } M802_11_MacFrame; Remove Header Add Header MAC MAC typedef struct _Mac802_11FrameHdr GLOMO_MacReceive {unsigned short frameType; Mac802_11TransmitDataFrame() PacketFromRadio () char Padding1[2]; int duration; (MAC Inter-layer Headerpackets Frame) + NODE_ADDR destAddr; Inter-layer packets (Network Layer Packet) NODE_ADDR sourceAddr; GLOMO_RadioStartTransmittingPacket() RadioAccnoiseLayer () … } M802_11FrameHdr; Radio Layer Radio Layer Inter-Node Packet 15 Data Structure for Layer Interaction Enumerate event type enum { /* for Channel layer */ MSG_CHANNEL_FromChannel, MSG_CHANNEL_FromRadio, /* Message Types for MAC layer */ MSG_MAC_FromNetwork, MSG_MAC_TimerExpired, … /* Default Message */ MSG_DEFAULT include\structmsg.h }; 16 Data Structure for Layer Interaction Message Structure (general information) struct message_str { short layerType; // Layer will received message short protocolType; short eventType; char* packet; char* payLoad; … } message; include\message.h 17 Data Structure for Layer Interaction Message header (for packet) typedef struct _Mac802_11LCtrlFrame { unsigned short frameType; char Padding[2]; int duration; NODE_ADDR destAddr; NODE_ADDR sourceAddr; char FCS[4]; } M802_11LongControlFrame; \mac\802_11.h 18 Message Parameters Message Destination: Node ID Layer in that node Protocol in that layer (optional) Instance (Interface) optional Message Event Type Event Specific Parameters called info Both packets and non-packet messages Packet payload Current header position 19 Scheduling an Event Allocate the GloMoSim Message: Message* msg = GLOMO_MsgAlloc(node, MyID, MyLayer, MyProtocol, MSG_LAYER_PROTO_MY_EVENT); Set the Event Specific Information: MyEventInfoType* MyEventInfo; GLOMO_MsgInfoAlloc(node, msg, sizeof(MyEventInfoType)); MyEventInfo-> MyFirstParameter =1; … Schedule the Event: GLOMO_MsgSend(node, message, MyChosenDelay); 20 Scheduling an Event (Example) Allocate the GloMoSim Message void Mac802_11StartTimer( GlomoNode *node, GlomoMac802_11 *M802, clocktype timerDelay) Set the Event Specific Information { Message *newMsg; Schedule the Event M802->timerSequenceNumber++; newMsg = GLOMO_MsgAlloc(node, GLOMO_MAC_LAYER, MAC_PROTOCOL_802_11, MSG_MAC_TimerExpired); GLOMO_MsgSetInstanceId(newMsg, M802->myGlomoMac>interfaceIndex); GLOMO_MsgInfoAlloc(node, newMsg, sizeof(M802>timerSequenceNumber)); *((int*)(newMsg->info)) = M802->timerSequenceNumber; GLOMO_MsgSend(node, newMsg, timerDelay); } Destination Layer 21 Message Scheduling GLOMO_MsgSend(node, *msg, delay) GLOMO_CallLayer( node, msg) if delay == 0 (msg)->layerType GLOMO_RADIO_LAYER: GLOMO_RadioLayer(node, msg) GLOMO_MAC_LAYER: GLOMO_MacLayer(node, msg); … GLOMO_APP_LAYER: GLOMO_AppLayer(node, msg); 22 Processing Message Events void Mac802_11Layer(GlomoNode *node, int interfaceIndex, Message *msg) { switch (msg->eventType) { case MSG_MAC_TimerExpired) Mac802_11HandleTimeout(node, M802); case MSG_MAC_TimerExpired_PCF) Mac802_11HandleTimeout_PCF(node, M802); … } GLOMO_MsgFree(node, msg); } 23 Transmitting Packet Allocate Message Message* pktToRadio = GLOMO_MsgAlloc(node, 0, 0, 0); Set Header Information hdr.frameType = M802_11_DATA; hdr.sourceAddr = node->nodeAddr; hdr.destAddr = destAddr; … Allocate Packet & Set information GLOMO_MsgPacketAlloc(node, pktToRadio, topPacket- >packetSize); memcpy(pktToRadio->packet, topPacket->packet, topPacket->packetSize); 24 Transmitting Packet (cont’d) Add Header & Set information GLOMO_MsgAddHeader(node, pktToRadio, sizeof(M802_11FrameHdr) ); memcpy(pktToRadio->packet, &hdr, sizeof(M802_11FrameHdr)); Transmit Packet StartTransmittingPacket(node, M802, pktToRadio, M802_11_DIFS); 25 Processing Packet Mac802_11ReceivePacketFromRadio(){ if (hdr->destAddr == node->nodeAddr) { switch (hdr->frameType) { case M802_11_RTS: … case M802_11_DATA: } else if (hdr->destAddr == ANY_DEST){ switch (hdr->frameType) { case M802_11_DATA: Mac802_11ProcessFrame(node, M802, msg); … } 26 Message Function GLOMO_MsgAlloc(node, destId, layer, protocol, enent_type); Functions to retrieve and set parameters individually. GLOMO_MsgInfoAlloc(node, msg, info_size); GLOMO_MsgPacketAlloc(node, msg, packet_size); GLOMO_MsgAddHeader(node, msg, header_size); GLOMO_MsgRemoveHeader(node, msg, header_size); GLOMO_MsgSend(node, msg, delay); GLOMO_MsgFree(node, msg); GLOMO_MsgCopy(node, msg); 27 Editing your code 28 Basic Structure /doc contains the documentation /scenarios contains directories of various sample configuration topologies /main contains the basic framework design /bin for executable and input/output files /include contains common include files 29 Basic Structure (cont’d) /application contains code for the application layer /transport contains the code for the transport layer /network contains the code for the network layer /mac contains the code for the mac laye /radio contains the code for the physical layer 30 Configuration file (\bin\ Config.in) General Simulation Parameter Scenario Topology & Mobility Radio & Propagation Model MAC Protocol Routing Protocol Transport Protocol Application (Traffic Generators) Statistical & GUI options 31 Configuration file (Example) [config.in] NUMBER-OF-NODES NODE-PLACEMENT NODE-PLACEMENT-FILE #NODE-PLACEMENT MAC-PROTOCOL NETWORK-PROTOCOL ROUTING-PROTOCOL APP-CONFIG-FILE RADIO-TYPE [nodes.input] 0 0 (20.2, 0.9, 0.11) 1 0 (80.4, 90.8, 0.17) 2 0 (60.7, 30.4, 0.10) 3 FILE ./nodes.input UNIFORM 802.11 IP BELLMANFORD ./app.conf RADIO-ACCNOISE [app.conf] #CBR # # <src_node> <dest_node> <items> <item_size> <interval_time> <start_time> <end_time> CBR 0 1 10 512 1S 0S 0S 32 In the directory Application Transport … MAC Radio (.h) Basic Definition of functions and data objects 802_11 .h cama.h (.pc) Actual Functions 802_11 .pc csma .pc (Layer.pc) Layer Interface mac .pc 33 Adding a model or protocol to a layer Needs 3 functions GLOMOPartition() Upper Layer Initialization Function Simulation Event Handling Function Finalization Function Lower Layer 34 Data structure in specific layer typedef struct glomo_mac_802_11_str { GlomoMac* myGlomoMac; int state; /* Statistics collection variables. */ long pktsSentUnicast; … } GlomoMac802_11; 35 Initialization Function void Mac802_11Init (GlomoNode *node, int interfaceIndex, const GlomoNodeInput *nodeInput) { GlomoMac802_11 *M802 = (GlomoMac802_11*) checked_pc_malloc(sizeof(GlomoMac802_11)); M802->myGlomoMac = node->macData[interfaceIndex]; M802->myGlomoMac->macVar = (void *)M802; // Init Data here M802->pktsSentUnicast = 0; } 36 Event Handling Function void Mac802_11Layer (GlomoNode *node, int interfaceIndex, Message *msg) { int timerSequenceNumber = *(int*)(msg->info); // handle simulation “message” Mac802_11HandleTimeout(node, M802); GLOMO_MsgFree(node, msg); } 37 Finalization Function void Mac802_11Finalize (GlomoNode *node, int interfaceIndex) { GlomoMac802_11 *M802 = (GlomoMac802_11*)node->macData[interfaceIndex]->macVar; if (M802->myGlomoMac->macStats == TRUE) { Mac802_11PrintStats(node, M802); } sprintf(buf, "UCAST (non-frag) pkts sent " "to chanl: %ld", M802->pktsSentUnicast); GLOMO_PrintStat(node, "802.11", buf); } 38 Obtaining the information Select what layer you want the statistics for APPLICATION-STATISTICS TCP-STATISTICS NETWORK-LAYER-STATISTICS MAC-LAYER-STATISTICS RADIO-LAYER-STATISTICS CHANNEL-LAYER-STATISTICS MOBILITY-STATISTICS YES NO YES YES NO NO NO config.in 39 Sifting through the Data Sample Output from 1 node: Glomo.stat Node: Node: Node: 0, Layer: 0, Layer: 0, Layer: Node: 0, Layer: Node: Node: Node: 1, Layer: 1, Layer: 1, Layer: 802.11, pkts from network: 0 802.11, BCAST pkts sent to chanl: 69 NetworkIp, Number of Packets Routed For Another Node: 0 NetworkIp, Number of Packets Delivered To this Node: 4549 802.11, pkts from network: 0 802.11, UCAST (non-frag) pkts sent to chanl: 2499 802.11, BCAST pkts sent to chanl: 67 … 40 Sifting through the Data Stats Printed for Each Node You’ll Probably need to add Statistics 41 Adding Stats Go through Header and add for Statistic Variables typedef struct glomo_mac_802_11_str { GlomoMac* myGlomoMac; int state; /* Statistics collection variables. */ long pktsSentUnicast; … <---------- Add Stat here !!! } GlomoMac802_11; 802_11.h 42 Adding Stats Initialize your extra stat to zero in the initialize function void Mac802_11Init(){ M802->myGlomoMac = node->macData[interfaceIndex]; M802->state = M802_11_S_IDLE; /* initial Statistic Variable to zero */ M802->pktsSentUnicast = 0; M802->pktsSentBroadcast = 0; M802->pktsGotUnicast = 0; … } 43 Adding Stats Add code to increment your counter void Mac802_11ProcessFrame(){ hdr = (M802_11FrameHdr *)frame ->packet; if (hdr->destAddr == ANY_DEST) { M802->pktsGotBroadcast++; } else{ M802->pktsGotUnicast++; … GLOMO_MsgFree(node, frame); } 44 Adding Stats Add a print statement in “Finalize” function void Mac802_11Finalize(){ M802 = node->macData[interfaceIndex]->macVar; sprintf(buf, "UCAST (non-frag) pkts sent " "to chanl: %ld", M802->pktsSentUnicast); GLOMO_PrintStat(node, "802.11", buf); sprintf(buf, "BCAST pkts sent to chanl: “, "%ld", M802->pktsSentBroadcast); GLOMO_PrintStat(node, "802.11", buf); … } 45 Obtaining Glomosim/Parsec Web site: http://pcl.cs.ucla.edu/projects/parsec http://pcl.cs.ucla.edu/projects/glomosim Questions: PARSEC: parsec@cs.ucla.edu GloMoSim: glomosim@pcl.cs.ucla.edu Scalable Mobile Network Simulator 46 Inside the Source Program glomosim-2.0 \glomosim \parsec 47 Installing Parsec copy correct directory to be parsec in … Linux Windows /usr/local/parsec C:\Parsec \glomosim-2.0\parsec\ 48 Installing Parsec Windows (Set Environment Variable) path %path%;c:\devstudio\vc\bin; c:\devstudio\sharedide\bin set INCLUDE=c:\devstudio\vc\include set LIB=c:\devstudio\vc\lib 49 Installing GloMoSim UNIX (go to /glomosim/main) Run "make depend" to create list of depndencies in the Makefile. Make sure that the right path for the Parsec compiler is specified in the Makefile for the "PAR" variable. Run "make" to create the executable Windows (go to c:\glomosim\main Run “makent” to create the executable 50 Compiling GloMoSim (optional) compiles only specific layer by “make _layerName” or “makent _layerName” for example prompt> makent MAC 51 Runnig Program Go to directory glomosim/bin -> type: “glomosim config.in“ 52 For gcc v.2.96 and higher setenv (or set or export, depending on your shell) the environment variable PCC_PP_OPTIONS "-D__builtin_va_list= void* -D__STRICT_ANSI__ -E -U__GNUC__ -I." 53 End 54