1 / 13

The SRIP SOURCE CODE

The SRIP SOURCE CODE. SUNMOON UNIVERSITY COMPUTER ENGINEERING Vladimir Cong0. Routing methods. ROUTING METHODS. SripInit SripHandleProtocolEvent SripHandleProtocolPacket SripFinalize SripRouterFunction. SripInit.

claude
Télécharger la présentation

The SRIP SOURCE CODE

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. The SRIP SOURCE CODE SUNMOON UNIVERSITY COMPUTER ENGINEERING Vladimir Cong0

  2. Routingmethods

  3. ROUTING METHODS • SripInit • SripHandleProtocolEvent • SripHandleProtocolPacket • SripFinalize • SripRouterFunction

  4. SripInit • void SripInit(Node* node, SripData** sripPtr, constNodeInput* nodeInput, intinterfaceIndex) { //This is the place where the protocol can be initialized and to make sure that //the right connection type will be setup in the following line of code the wireless //interface and interface of node are checked, memory will be allocatedif (MAC_IsWiredNetwork(node, interfaceIndex)) ERROR_ReportError("SRIP supports only wireless interfaces"); if (node->numberInterfaces > 1) ERROR_ReportError("SRIP only supports one interface of node"); srip = (SripData*) MEM_malloc(sizeof(SripData)); (*sripPtr) = srip; //In the following function the configuration file parameters will be known and applied IO_ReadTime(node->nodeId, ANY_ADDRESS, nodeInput, "SRIP-UPDATE-INTERVAL", &retVal, &(srip->updateInterval)); if (retVal == FALSE) ERROR_ReportError("SRIP-UPDATE-INTERVAL not specified!");

  5. //Allocate and initialize the routing table for this node srip->routingTable = (SripTableEntry*) MEM_malloc(sizeof(SripTableEntry)*(node->numNodes+1)); for (i = 1; i <= node->numNodes; i++) { srip->routingTable[i].destination = i; srip->routingTable[i].nextHop = INVALID_ADDRESS; srip->routingTable[i].distance = SRIP_INFINITY; } //The nodeIdstarts from 1 to numNodes in Qualnet.srip->routingTable[node->nodeId].nextHop = node->nodeId; srip->routingTable[node->nodeId].distance = 0; NetworkIpSetRouterFunction(node, &SripRouterFunction, interfaceIndex); //The very first route update broadcast after a random delay of 0 ~ srip->updateinterval-1newMsg= MESSAGE_Alloc(node, NETWORK_LAYER, ROUTING_PROTOCOL_SRIP, MSG_NETWORK_RTBroadcastAlarm); RandomSeedstartupSeed; RANDOM_SetSeed(startupSeed, node->globalSeed, node->nodeId, ROUTING_PROTOCOL_SRIP, interfaceIndex); clocktype delay = RANDOM_nrand(startupSeed)%srip->updateInterval; MESSAGE_Send(node, newMsg, delay); }

  6. SripHandleProtocolEvent void SripHandleProtocolEvent(Node* node, Message* msg) { inti, numEntries = 0, pktSize; Message* newMsg; char* pktPtr; //Obtain the pointer SripData* srip = (SripData*) NetworkIpGetRoutingProtocol(node, ROUTING_PROTOCOL_SRIP); //Only one message type is used by SRIP assert(msg->eventType == MSG_NETWORK_RTBroadcastAlarm); //Count the number of valid entries and calculate the packet size for (i = 1; i <= node->numNodes; i++) { if (srip->routingTable[i].distance < SRIP_INFINITY) numEntries++; }

  7. //Prepare a route update according to the following format: Number of entries, destination, next hop and distance newMsg= MESSAGE_Alloc(node, 0, 0, 0); pktSize= sizeof(unsigned int) + sizeof(SripTableEntry)*numEntries; MESSAGE_PacketAlloc(node, newMsg, pktSize, TRACE_ANY_PROTOCOL); pktPtr= newMsg->packet; memcpy(pktPtr, &numEntries, sizeof(unsigned int)); /* number of entries */ pktPtr+= sizeof(unsigned int); //Here the packet will be filled with valid table entries previously initialized for (i = 1; i <= node->numNodes; i++) { if (srip->routingTable[i].distance < SRIP_INFINITY) { memcpy(pktPtr, &(srip->routingTable[i]), sizeof(SripTableEntry)); pktPtr+= sizeof(SripTableEntry); } } NetworkIpSendRawMessageToMacLayer(node, newMsg, node->nodeId, ANY_DEST 0, //CONTROL, IPPROTO_SRIP, 1, DEFAULT_INTERFACE, ANY_DEST); /*Stat*/ srip->numRouteUpdatesBroadcast++; newMsg = MESSAGE_Alloc(node, NETWORK_LAYER, ROUTING_PROTOCOL_SRIP, MSG_NETWORK_RTBroadcastAlarm); MESSAGE_Send(node, newMsg, srip->updateInterval); //Free the old message after being processed// MESSAGE_Free(node, msg); }

  8. SripHandleProtocolPacket void SripHandleProtocolPacket(Node* node, Message* msg, NodeAddresssourceAddress) { inti, numEntries; char *pktPtr; SripTableEntryentry; //Obtain the pointer SripData* srip = (SripData*) NetworkIpGetRoutingProtocol(node, ROUTING_PROTOCOL_SRIP) pktPtr = msg->packet; memcpy(&numEntries, pktPtr, sizeof(unsigned int)); pktPtr+= sizeof(unsigned int);

  9. //Scan the entry list and update routing table only with entries with shorter distance for (i = 0; i < numEntries; i++) { memcpy(&entry, pktPtr, sizeof(SripTableEntry)); entry.distance++; if (entry.distance < srip->routingTable[entry.destination].distance) { srip->routingTable[entry.destination].distance = entry.distance; srip->routingTable[entry.destination].nextHop = sourceAddress; } pktPtr+= sizeof(SripTableEntry); } //This is the packet’s final destination MESSAGE_Free(node, msg); }

  10. SripFinalize void SripFinalize(Node *node) { char buf[MAX_STRING_LENGTH]; //Obtain the pointer SripData* srip = (SripData*) NetworkIpGetRoutingProtocol(node, ROUTING_PROTOCOL_SRIP); assert(srip!= NULL); //Stats report sprintf(buf, "Number of Route Updates Broadcast = %u", srip->numRouteUpdatesBroadcast); IO_PrintStat(node, "Network", "SRIP", ANY_DEST, -1, buf);

  11. //The routing table on scree for debug use printf("Routing table for node %d\n", node->nodeId); printf("============================================\n"); printf(" Destination NextHop Distance\n"); printf("--------------------------------------------\n"); for (inti = 1; i <= node->numNodes; i++) { printf(" %d %d %d\n", srip->routingTable[i].destination, srip->routingTable[i].nextHop, srip->routingTable[i].distance); } printf("\n\n"); }

  12. SripRouterFunction void SripRouterFunction(Node* node, Message* msg, NodeAddressdestAddr, NodeAddresspreviousHopAddress, BOOL* packetWasRouted) { IpHeaderType *ipHeader = (IpHeaderType *) msg->packet; //Obtain the pointer SripData* srip = (SripData*) NetworkIpGetRoutingProtocol(node, ROUTING_PROTOCOL_SRIP); //The following line of code is to prevent self sent message if (ipHeader->ip_p == IPPROTO_SRIP || ipHeader->ip_dst == node->nodeId) return; //Rout the packt only when the destination is considered reachable if (srip->routingTable[ipHeader->ip_dst].distance < SRIP_INFINITY) { *packetWasRouted = TRUE; NetworkIpSendPacketToMacLayer( node, msg, DEFAULT_INTERFACE, srip->routingTable[ipHeader->ip_dst].nextHop); } }

  13. THANK YOU!

More Related