Ошибка: TLVoptions не найдены в дейтаграмме

#omnet #veins #inet

Вопрос:

Я модифицировал протокол AODV, чтобы добавить дополнительную информацию в пакет данных.Опция GPSR является простым примером , поэтому я создал класс, наследуемый от TlvOptionBase, установил свои переменные и вставил его в заголовок ipv4, как указано в протоколе GPSR.

Почему TlvOption не может быть найдено в дейтаграмме

Вот часть моего кода:

 void Aodv::setCBFOptionOnNetworkDatagram(Packet *packet, const Ptr<const NetworkHeaderBase>amp; networkHeader, CBFOption *cbfOption)
{
    packet->trimFront();
    if (dynamicPtrCast<const Ipv4Header>(networkHeader)) {
        auto ipv4Header = removeNetworkProtocolHeader<Ipv4Header>(packet);
        cbfOption->setType(IPOPTION_TLV_GPSR);
        B oldHlen = ipv4Header->calculateHeaderByteLength();
        EV_INFO << "old header length "<<oldHlen << endl;
        ASSERT(ipv4Header->getHeaderLength() == oldHlen);
        ipv4Header->addOption(cbfOption);
        B newHlen = ipv4Header->calculateHeaderByteLength();
        EV_INFO << "new header length "<<newHlen << endl;
        ipv4Header->setHeaderLength(newHlen);
        ipv4Header->addChunkLength(newHlen - oldHlen);
        ipv4Header->setTotalLengthField(ipv4Header->getTotalLengthField()   newHlen - oldHlen);
        insertNetworkProtocolHeader(packet, Protocol::ipv4, ipv4Header);
    }
}

const CBFOption *Aodv::getCBFOptionFromNetworkDatagram(const Ptr<const NetworkHeaderBase>amp; networkHeader) const
{
    const CBFOption *cbfOption = findCBFOptionInNetworkDatagram(networkHeader);
    if (cbfOption == nullptr)
        throw cRuntimeError("Tlvoption not found in datagram");
    return cbfOption;
}

CBFOption *Aodv::findCBfOptionInNetworkDatagramForUpdate(const Ptr<NetworkHeaderBase>amp; networkHeader)
{
    CBFOption *cbfOption = nullptr;
if (auto ipv4Header = dynamicPtrCast<Ipv4Header>(networkHeader)) {
        cbfOption = check_and_cast_nullable<CBFOption *>(ipv4Header->findMutableOptionByType(IPOPTION_TLV_GPSR));
}   
 return cbfOption;
} 

INetfilter::IHook::Result Aodv::ensureRouteForDatagram(Packet *datagram)
{........
        CBFOption *cbfOption = createCBFOption(networkHeader->getDestinationAddress());
        setCBFOptionOnNetworkDatagram(datagram, networkHeader, cbfOption);
        auto cOption = const_cast<CBFOption *>(getCBFOptionFromNetworkDatagram(networkHeader));

 

Я использую INET veins-5.1-i2

параметры tlv существуют в структуре пакетов
После запуска режима отладки
введите описание изображения здесь

Комментарии:

1. Вы проверили с помощью графического интерфейса структуру пакетов после добавления заголовка IPv4? Было бы полезно узнать о других шагах по отладке, которые вы предприняли. Вы запустили моделирование в режиме отладки? ipv4Header Действительно findAODVOption... ли он населен?

2. Я проверил структуру пакетов и запустил симуляцию в режиме отладки и все еще не знаю, что не так? Я добавил скриншоты к своему вопросу

3. Итак, я ясно вижу, что он добавляется правильно. Затем вам нужно войти TlvOptions::findByType() в TlvOptions.cc:58 систему . cOption Значение на втором снимке экрана бесполезно, потому что оно просто инициализируется случайными данными, так как getCBFOptionFromNetworkDatagram еще не вернулся.