⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 odmrp.pc

📁 simulator for ad hoc
💻 PC
📖 第 1 页 / 共 5 页
字号:
/* * 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 + -