📄 odmrp.pc
字号:
/* * FUNCTION RoutingOdmrpHandleData * PURPOSE Processing procedure when Data and Join Query is received. * * Paremeters: * node: Node handling the data packet. * msg: The data packet. */void RoutingOdmrpHandleData(GlomoNode *node, Message *msg){ GlomoNetworkIp* ipLayer = (GlomoNetworkIp *) node->networkData.networkVar; GlomoRoutingOdmrp* odmrp = (GlomoRoutingOdmrp *) ipLayer->routingProtocol; IpHeaderType *ipHdr = (IpHeaderType *)GLOMO_MsgReturnPacket(msg); NODE_ADDR sourceAddress; NODE_ADDR destinationAddress; unsigned char IpProtocol; unsigned int ttl; NetworkQueueingPriorityType priority; clocktype delay; NODE_ADDR srcAddr = ipHdr->ip_src; NODE_ADDR mcastAddr = ipHdr->ip_dst; OdmrpIpOptionType option = GetOdmrpIpOptionField(msg); Message *newMsg = NULL; if (option.query == TRUE) { RoutingOdmrpHandleJoinQuery(node, msg); return; } /* Handle the packet only if not a duplicate */ if (!RoutingOdmrpLookupMessageCache( srcAddr, option.seqNumber, &odmrp->messageCache)) { RoutingOdmrpInsertMessageCache( node, srcAddr, option.seqNumber, &odmrp->messageCache); /* Check if the node is the member of the group */ if (RoutingOdmrpLookupMembership(mcastAddr, &odmrp->memberFlag)) {#ifdef DEBUG printf("Node %ld received DATA\n", node->nodeAddr);#endif#ifdef DEBUG printf(" Member got it!\n");#endif odmrp->stats.numDataReceived++; newMsg = GLOMO_MsgCopy(node, msg); NetworkIpRemoveIpHeader(node, newMsg, &sourceAddress, &destinationAddress, &priority, &IpProtocol, &ttl); SendToUdp( node, newMsg, priority, sourceAddress, destinationAddress); } /* If the node is FG, forward the packet. */ if (RoutingOdmrpLookupFgFlag(mcastAddr, &odmrp->fgFlag)) {#ifdef DEBUG printf("Node %ld received DATA\n", node->nodeAddr);#endif#ifdef DEBUG printf(" FG. Forwarding it\n");#endif option.lastAddr = node->nodeAddr; option.hopCount++; SetOdmrpIpOptionField(msg, &option); delay = pc_erand(node->seed) * ODMRP_BROADCAST_JITTER; NetworkIpSendPacketToMacLayerWithDelay( node, msg, DEFAULT_INTERFACE, ANY_DEST, delay); odmrp->stats.numDataTxed++; } /* If FG */ } /* if not duplicate */ else { GLOMO_MsgFree(node, msg); }} /* RoutingOdmrpHandleData *//* * FUNCTION RoutingOdmrpHandleJoinQuery * PURPOSE Processing procedure when Data Join is received. * * Paremeters: * node: Node handling the data join packet. * msg: The data join packet. */void RoutingOdmrpHandleJoinQuery(GlomoNode *node, Message *msg){ GlomoNetworkIp* ipLayer = (GlomoNetworkIp *) node->networkData.networkVar; GlomoRoutingOdmrp* odmrp = (GlomoRoutingOdmrp *) ipLayer->routingProtocol; IpHeaderType *ipHdr = (IpHeaderType *)GLOMO_MsgReturnPacket(msg); NODE_ADDR sourceAddress; NODE_ADDR destinationAddress; unsigned char IpProtocol; unsigned int ttl; NetworkQueueingPriorityType priority; clocktype delay, jrDelay; ODMRP_MT_Node *mcastEntry; ODMRP_RPT_Node *mEntry; NODE_ADDR srcAddr = ipHdr->ip_src; NODE_ADDR mcastAddr = ipHdr->ip_dst; OdmrpIpOptionType option = GetOdmrpIpOptionField(msg); Message *newMsg = NULL; /* Process packet only if not duplicate. */ if (!RoutingOdmrpLookupMessageCache( srcAddr, option.seqNumber, &odmrp->messageCache)) {#ifdef DEBUG printf("Node %ld received Join Query from %d\n", node->nodeAddr, option.lastAddr);#endif RoutingOdmrpInsertMessageCache( node, srcAddr, option.seqNumber, &odmrp->messageCache); RoutingOdmrpInsertRouteTable( srcAddr, option.lastAddr, option.hopCount, &odmrp->routeTable); /* If the node is a member of the group */ if (RoutingOdmrpLookupMembership(mcastAddr, &odmrp->memberFlag)) {#ifdef DEBUG printf(" Member got it!\n");#endif odmrp->stats.numDataReceived++; /* Relay the Query if hop does not exceed TTL. */ if (option.hopCount < ODMRP_MAX_HOP) { option.lastAddr = node->nodeAddr; option.hopCount++; SetOdmrpIpOptionField(msg, &option); delay = pc_erand(node->seed) * ODMRP_BROADCAST_JITTER; NetworkIpSendPacketToMacLayerWithDelay( node, msg, DEFAULT_INTERFACE, ANY_DEST, delay); odmrp->stats.numDataTxed++; odmrp->stats.numQueryTxed++;#ifdef DEBUG printf(" Relaying it\n");#endif } /* If hop is less than TTL */ newMsg = GLOMO_MsgCopy(node, msg); NetworkIpRemoveIpHeader(node, newMsg, &sourceAddress, &destinationAddress, &priority, &IpProtocol, &ttl); SendToUdp( node, newMsg, priority, sourceAddress, destinationAddress); /* * Insert the source member to the table and send * a Join Reply. */ mcastEntry = RoutingOdmrpGetMTEntry(mcastAddr, &odmrp->memberTable); if (mcastEntry == NULL) { RoutingOdmrpInsertMemberTable( mcastAddr, srcAddr, &odmrp->memberTable); } else { RoutingOdmrpInsertMemberSource(srcAddr, mcastEntry); } RoutingOdmrpCheckSourceExpired(mcastAddr, &odmrp->memberTable); mEntry = RoutingOdmrpGetRPTEntry(mcastAddr, &odmrp->responseTable); if (mEntry == NULL) { RoutingOdmrpInsertResponseTable( mcastAddr, srcAddr, &odmrp->responseTable); } else { RoutingOdmrpInsertResponseSource(srcAddr, mEntry); } jrDelay = pc_erand(node->seed) * ODMRP_JR_JITTER; RoutingOdmrpSetTimer( node, MSG_NETWORK_SendReply, mcastAddr, jrDelay); } /* If multicast member */ /* Relay the Query if hop does not exceed TTL. */ else if (option.hopCount < ODMRP_MAX_HOP) { option.lastAddr = node->nodeAddr; option.hopCount++; SetOdmrpIpOptionField(msg, &option); delay = pc_erand(node->seed) * ODMRP_BROADCAST_JITTER; NetworkIpSendPacketToMacLayerWithDelay( node, msg, DEFAULT_INTERFACE, ANY_DEST, delay); odmrp->stats.numDataTxed++; odmrp->stats.numQueryTxed++;#ifdef DEBUG printf(" Relaying it\n");#endif } /* If hop is less than TTL */ else { GLOMO_MsgFree(node, msg); } } /* If not duplicate */ else { GLOMO_MsgFree(node, msg); }} /* RoutingOdmrpHandleJoinQuery *//* * FUNCTION RoutingOdmrpHandleReply * PURPOSE Processing procedure when Join Table is received. * * Paremeters: * node: Node handling the packet. * msg: The join reply packet. */void RoutingOdmrpHandleReply( GlomoNode *node, Message *msg, NODE_ADDR lastAddr, NODE_ADDR mcastAddr){ GlomoNetworkIp* ipLayer = (GlomoNetworkIp *) node->networkData.networkVar; GlomoRoutingOdmrp* odmrp = (GlomoRoutingOdmrp *) ipLayer->routingProtocol; Message *newMsg; ODMRP_Ack *ackPkt; ODMRP_JoinReply *replyPkt = (ODMRP_JoinReply *)GLOMO_MsgReturnPacket(msg); ODMRP_TT_Node *mcastEntry; ODMRP_RPT_Node *mEntry; clocktype delay; int i; char *pktPtr; int pktSize = sizeof(ODMRP_Ack); BOOL changed = FALSE; for (i = 0; i < replyPkt->count; i++) { /* if an explicit ack is required. */ if (replyPkt->ackReq[i] && replyPkt->nextAddr[i] == node->nodeAddr) { newMsg = GLOMO_MsgAlloc( node, GLOMO_MAC_LAYER, 0, MSG_MAC_FromNetwork); GLOMO_MsgPacketAlloc(node, newMsg, pktSize); pktPtr = (char *) GLOMO_MsgReturnPacket(newMsg); ackPkt = (ODMRP_Ack *) pktPtr; ackPkt->pktType = ODMRP_ACK; ackPkt->mcastAddr = mcastAddr; ackPkt->srcAddr = replyPkt->srcAddr[i]; NetworkIpSendRawGlomoMessageToMacLayer( node, newMsg, lastAddr, CONTROL, IPPROTO_ODMRP, 1, DEFAULT_INTERFACE, lastAddr); odmrp->stats.numAckSent++;#ifdef DEBUG printf("Node %ld received a Join Reply from node %ld\n", node->nodeAddr, lastAddr);#endif#ifdef DEBUG printf(" sending Exp Ack to node %ld\n", lastAddr); printf(" mcast = %u, src = %d\n", ackPkt->mcastAddr, ackPkt->srcAddr);#endif } /* Update the ack table entries if the table comes from a FG. */ if (replyPkt->IAmFG) { RoutingOdmrpDeleteAckTable(mcastAddr, replyPkt->srcAddr[i], lastAddr, &odmrp->ackTable); } /* If the node is a forwarding group. */ if (replyPkt->nextAddr[i] == node->nodeAddr && replyPkt->srcAddr[i] != node->nodeAddr) {#ifdef DEBUG printf("Node %ld received a Join Reply from node %ld\n", node->nodeAddr, lastAddr);#endif#ifdef DEBUG printf(" I'm a FG!\n");#endif if (RoutingOdmrpLookupFgFlag(mcastAddr, &odmrp->fgFlag)) { RoutingOdmrpUpdateFgFlag(mcastAddr, &odmrp->fgFlag); } else { RoutingOdmrpSetFgFlag(mcastAddr, &odmrp->fgFlag); } mcastEntry = RoutingOdmrpGetTTEntry( mcastAddr, &odmrp->tempTable); if (mcastEntry == NULL) {#ifdef DEBUG// printf(" Insert temp table\n");#endif RoutingOdmrpInsertTempTable( mcastAddr, replyPkt->srcAddr[i], &odmrp->tempTable); } else {#ifdef DEBUG// printf(" Insert temp source\n");#endif RoutingOdmrpInsertTempSource(replyPkt->srcAddr[i], mcastEntry); }/* if (RoutingOdmrpCheckTempChanged( mcastAddr, &odmrp->tempTable)) {#ifdef DEBUG printf(" Temp changed!\n");#endif */ mEntry = RoutingOdmrpGetRPTEntry( mcastAddr, &odmrp->responseTable); if (mEntry == NULL) { RoutingOdmrpInsertResponseTable(mcastAddr, replyPkt->srcAddr[i], &odmrp->responseTable); } else { RoutingOdmrpInsertResponseSource( replyPkt->srcAddr[i], mEntry); } changed = TRUE;/* }*/ RoutingOdmrpCheckTempExpired( mcastAddr, &odmrp->tempTable); } } /* for */ /* If table content has changed and i'm not collecting anymore. */ if (changed && !RoutingOdmrpCheckTempSent( mcastAddr, &odmrp->tempTable)) {#ifdef DEBUG printf(" Changed and temp sent!\n");#endif /* Start collecting. */ RoutingOdmrpSetTempSent(mcastAddr, &odmrp->tempTable); /* Unset */ delay = pc_erand(node->seed) * ODMRP_JR_JITTER + ODMRP_JR_PAUSE_TIME; RoutingOdmrpSetTimer( node, MSG_NETWORK_SendReply, mcastAddr, delay); } if (RoutingOdmrpLookupFgFlag(mcastAddr, &odmrp->fgFlag)) { RoutingOdmrpSetTimer( node, MSG_NETWORK_CheckFg, mcastAddr, ODMRP_FG_TIMEOUT); } GLOMO_MsgFree(node, msg);} /* RoutingOdmrpHandleReply *//* * FUNCTION RoutingOdmrpHandleAck * PURPOSE Processing explicit ack when received. * * Paremeters: * node: Node handling the ACK packet. * msg: The ack packet. * */void RoutingOdmrpHandleAck( GlomoNode *node, Message *msg, NODE_ADDR lastAddr, NODE_ADDR targetAddr){ GlomoNetworkIp* ipLayer = (GlomoNetworkIp *) node->networkData.networkVar; GlomoRoutingOdmrp* odmrp = (GlomoRoutingOdmrp *) ipLayer->routingProtocol; ODMRP_Ack *ackPkt = (ODMRP_Ack *)GLOMO_MsgReturnPacket(msg); /* Process only if I'm the target. */ if (targetAddr == node->nodeAddr) {#ifdef DEBUG printf("Node %ld got Ack from node %ld\n", node->nodeAddr, lastAddr);#endif /* Update the ack table entries. */ RoutingOdmrpDeleteAckTable( ackPkt->mcastAddr, ackPkt->srcAddr, lastAddr, &odmrp->ackTable); } GLOMO_MsgFree(node, msg);} /* RoutingOdmrpHandleAck *//* * FUNCTION RoutingOdmrpInitMembership * PURPOSE Initialize the Membership flag. * * Parameters: * memberFlag: Member flag. */void RoutingOdmrpInitMembership(ODMRP_Membership *memberFlag){ memberFlag->head = NULL; memberFlag->size = 0;} /* RoutingOdmrpInitMembership *//* * FUNCTION RoutingOdmrpInitFgFlag * PURPOSE Initialize the Fg flag. * * Parameters: * fgFlag: Fg flag. */void RoutingOdmrpInitFgFlag(ODMRP_FgFlag *fgFlag){ fgFlag->head = NULL; fgFlag->size = 0;} /* RoutingOdmrpInitFgFlag *//* * FUNCTION RoutingOdmrpInitMemberTable * PURPOSE Initialize the Member Table. Only group members maintain * the member table . * * Parameters: * node: Node that is initializing the member table. * memberTable: Member table. */void RoutingOdmrpInitMemberTable(ODMRP_MT *memberTable){ memberTable->head = NULL; memberTable->size = 0;} /* RoutingOdmrpInitMemberTable *//* * FUNCTION RoutingOdmrpInitResponseTable * PURPOSE Initialize the response table. * * Parameters: * responseTable: Response table. */void RoutingOdmrpInitResponseTable(ODMRP_RPT *responseTable){ responseTable->head = NULL; responseTable->size = 0;} /* RoutingOdmrpInitResponseTable *//* * FUNCTION RoutingOdmrpInitTempTable * PURPOSE Initialize the temp table. * * Parameters: * tempTable: Temp table.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -