#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
Комментарии:
1. Вы проверили с помощью графического интерфейса структуру пакетов после добавления заголовка IPv4? Было бы полезно узнать о других шагах по отладке, которые вы предприняли. Вы запустили моделирование в режиме отладки?
ipv4Header
ДействительноfindAODVOption...
ли он населен?2. Я проверил структуру пакетов и запустил симуляцию в режиме отладки и все еще не знаю, что не так? Я добавил скриншоты к своему вопросу
3. Итак, я ясно вижу, что он добавляется правильно. Затем вам нужно войти
TlvOptions::findByType()
вTlvOptions.cc:58
систему .cOption
Значение на втором снимке экрана бесполезно, потому что оно просто инициализируется случайными данными, так как getCBFOptionFromNetworkDatagram еще не вернулся.