Как send() работает в omnet++

Ли send() в omnet++ установить адрес источника пакета на текущий адрес хоста?

Почему я спрашиваю? потому что я пытаюсь закодировать класс для вредоносного хоста "Eve", который выполняет атаку воспроизведения.

void MalAODVRouter::handleMessage(cMessage *msg)
{

    cMessage *ReplayMsg = msg->dup();
    AODVRouting::handleMessage(msg);

    capturedMsgs++;
    if (capturedMsgs==10) // One out of every 10 packets (frequency of replay)
    {
            //we can add a delay before sending the copy of the message again (1 time unit)
            sendDelayed(ReplayMsg, 1,"ipOut");
            ReplayedMsgs++;
            std::cout<<"Launched Replay Packet!\n";
            ev<<"Launched Replay Packet!\n";

            this->capturedMsgs=0;
       // }
    }

}

Вы можете увидеть в начале моего фрагмента кода, который я попытался с помощью функции dup() дублировать пакет (msg) Ева получает, пока она на пути к законному месту назначения. Теперь я могу отправить дублированный пакет позже, и он будет иметь исходный адрес источника ИЛИ я должен копать глубже в слои, чтобы подделать адрес источника, чтобы вместо адреса Евы был адрес Боба? как ниже:

/*UDPPacket *udpPacket = dynamic_cast<UDPPacket *>(msg);
            AODVControlPacket *ctrlPacket = check_and_cast<AODVControlPacket *>(udpPacket->decapsulate());
            IPv4ControlInfo *udpProtocolCtrlInfo = dynamic_cast<IPv4ControlInfo *>(udpPacket->getControlInfo());
            ASSERT(udpProtocolCtrlInfo != NULL);
            IPv4Address sourceAddr = udpProtocolCtrlInfo->getSrcAddr();         //get Source Address
            IPv4Address destinationAddr = udpProtocolCtrlInfo->getDestAddr();   //get Destination Address
            IPv4Address addr = getSelfIPAddress();
            if (addr != destinationAddr)      // if it is not destined for "Eve"
            {
                UDPPacket *ReplayUDPPacket = udpPacket;
                AODVControlPacket *ReplayCtrlPacket = check_and_cast<AODVControlPacket *>(ReplayUDPPacket->decapsulate());
                IPv4ControlInfo *ReplayUDPProtocolCtrlInfo = dynamic_cast<IPv4ControlInfo *>(ReplayUDPPacket->getControlInfo());
                ASSERT(ReplayUDPProtocolCtrlInfo != NULL);
                ReplayUDPProtocolCtrlInfo->setSrcAddr(sourceAddr);          //Forge Source
                ReplayUDPProtocolCtrlInfo->setDestAddr(destinationAddr);    //Keep Destination

    */

                //we can add a delay before sending the copy of the message again (1 time unit)
                sendDelayed(ReplayMsg, 1,"ipOut");
                ReplayedMsgs++;
                std::cout<<"Launched Replay Packet!\n";
                ev<<"Launched Replay Packet!\n";

                this->capturedMsgs=0;

Ли send() метод автоматически устанавливает исходный адрес исходящего пакета на текущий адрес хоста? Если так, то моя попытка воспроизведения не работает...

1 ответ

Решение

send() это вызов API OMNeT++. Поскольку OMNeT++ - это просто универсальная среда моделирования дискретных событий, она ничего не знает о коде модели (поэтому она не может и не должна манипулировать им). IP-адрес определен в инфраструктуре INET, поэтому только код из инфраструктуры INET может его изменить.

С другой стороны, модули на стандартном хосте ниже вашего модуля могут делать все, что захотят, до того, как пакет будет отправлен в сеть. Теперь в этом фактическом случае IP-адрес источника определяется управляющей информацией, которая прикреплена к пакету. dup()-ing пакет также копирует эту информацию, поэтому IP-адрес будет таким же.

Другие вопросы по тегам