|
INET Framework for OMNeT++/OMNEST
|
#include <Ipv4Encap.h>
◆ decapsulate()
| void inet::Ipv4Encap::decapsulate |
( |
Packet * |
packet | ) |
|
|
protectedvirtual |
207 const auto& ipv4Header = packet->popAtFront<Ipv4Header>();
210 packet->addTagIfAbsent<DscpInd>()->setDifferentiatedServicesCodePoint(ipv4Header->getDscp());
211 packet->addTagIfAbsent<EcnInd>()->setExplicitCongestionNotification(ipv4Header->getEcn());
212 packet->addTagIfAbsent<TosInd>()->setTos(ipv4Header->getTypeOfService());
219 auto l3AddressInd = packet->addTagIfAbsent<
L3AddressInd>();
220 l3AddressInd->setSrcAddress(ipv4Header->getSrcAddress());
221 l3AddressInd->setDestAddress(ipv4Header->getDestAddress());
222 packet->addTagIfAbsent<HopLimitInd>()->setHopLimit(ipv4Header->getTimeToLive());
Referenced by handleMessage().
◆ encapsulate()
| void inet::Ipv4Encap::encapsulate |
( |
Packet * |
packet | ) |
|
|
protectedvirtual |
127 const auto& ipv4Header = makeShared<Ipv4Header>();
129 auto l3AddressReq = transportPacket->removeTag<L3AddressReq>();
130 Ipv4Address src = l3AddressReq->getSrcAddress().toIpv4();
131 Ipv4Address dest = l3AddressReq->getDestAddress().toIpv4();
135 auto hopLimitReq = transportPacket->removeTagIfPresent<
HopLimitReq>();
136 short ttl = (hopLimitReq !=
nullptr) ? hopLimitReq->getHopLimit() : -1;
137 bool dontFragment =
false;
138 if (
auto dontFragmentReq = transportPacket->removeTagIfPresent<FragmentationReq>())
139 dontFragment = dontFragmentReq->getDontFragment();
142 ipv4Header->setDestAddress(dest);
146 if (!src.isUnspecified())
147 ipv4Header->setSrcAddress(src);
150 if (
auto& tosReq = transportPacket->removeTagIfPresent<TosReq>()) {
151 ipv4Header->setTypeOfService(tosReq->getTos());
152 if (transportPacket->findTag<
DscpReq>())
153 throw cRuntimeError(
"TosReq and DscpReq found together");
154 if (transportPacket->findTag<EcnReq>())
155 throw cRuntimeError(
"TosReq and EcnReq found together");
157 if (
auto& dscpReq = transportPacket->removeTagIfPresent<
DscpReq>())
158 ipv4Header->setDscp(dscpReq->getDifferentiatedServicesCodePoint());
159 if (
auto& ecnReq = transportPacket->removeTagIfPresent<EcnReq>())
160 ipv4Header->setEcn(ecnReq->getExplicitCongestionNotification());
162 ipv4Header->setMoreFragments(
false);
163 ipv4Header->setDontFragment(dontFragment);
164 ipv4Header->setFragmentOffset(0);
169 else if (ipv4Header->getDestAddress().isLinkLocalMulticast())
171 else if (ipv4Header->getDestAddress().isMulticast())
175 ipv4Header->setTimeToLive(ttl);
176 ipv4Header->setTotalLengthField(ipv4Header->getChunkLength() + transportPacket->getDataLength());
177 ipv4Header->setCrcMode(
crcMode);
178 ipv4Header->setCrc(0);
182 ipv4Header->setCrc(0xC00D);
186 ipv4Header->setCrc(0xBAAD);
189 MemoryOutputStream ipv4HeaderStream;
193 ipv4Header->setCrc(crc);
198 throw cRuntimeError(
"Unknown CRC mode");
Referenced by handleMessage().
◆ handleMessage()
| void inet::Ipv4Encap::handleMessage |
( |
cMessage * |
msg | ) |
|
|
overrideprotectedvirtual |
43 if (
auto request =
dynamic_cast<Request *
>(msg))
45 else if (msg->getArrivalGate()->isName(
"upperLayerIn")) {
46 auto packet = check_and_cast<Packet *>(msg);
47 EV <<
"Encapsulating\n";
50 send(packet,
"lowerLayerOut");
53 auto packet = check_and_cast<Packet *>(msg);
54 auto ipv4HeaderPosition = packet->getFrontOffset();
55 const auto& ipv4Header = packet->peekAtFront<Ipv4Header>();
56 const Protocol *
protocol = ipv4Header->getProtocol();
57 auto remoteAddress(ipv4Header->getSrcAddress());
58 auto localAddress(ipv4Header->getDestAddress());
61 bool hasSocket =
false;
63 if (elem.second->protocolId ==
protocol->getId() &&
64 (elem.second->localAddress.isUnspecified() || elem.second->localAddress == localAddress) &&
65 (elem.second->remoteAddress.isUnspecified() || elem.second->remoteAddress == remoteAddress))
67 auto *packetCopy = packet->dup();
68 packetCopy->addTagIfAbsent<SocketInd>()->setSocketId(elem.second->socketId);
69 EV_INFO <<
"Passing up to socket " << elem.second->socketId <<
"\n";
71 send(packetCopy,
"upperLayerOut");
76 EV_INFO <<
"Passing up to protocol " <<
protocol <<
"\n";
78 send(packet,
"upperLayerOut");
84 EV_ERROR <<
"Transport protocol '" <<
protocol->getName() <<
"' not connected, discarding packet\n";
85 packet->setFrontOffset(ipv4HeaderPosition);
89 send(packet,
"upperLayerOut");
◆ handleRequest()
| void inet::Ipv4Encap::handleRequest |
( |
Request * |
request | ) |
|
|
protectedvirtual |
95 auto ctrl = request->getControlInfo();
97 throw cRuntimeError(
"Request '%s' arrived without controlinfo", request->getName());
98 else if (Ipv4SocketBindCommand *command =
dynamic_cast<Ipv4SocketBindCommand *
>(
ctrl)) {
99 int socketId = request->getTag<SocketReq>()->getSocketId();
100 SocketDescriptor *descriptor =
new SocketDescriptor(socketId, command->getProtocol()->getId(), command->getLocalAddress());
104 else if (Ipv4SocketConnectCommand *command =
dynamic_cast<Ipv4SocketConnectCommand *
>(
ctrl)) {
105 int socketId = request->getTag<SocketReq>()->getSocketId();
107 throw cRuntimeError(
"Ipv4Socket: should use bind() before connect()");
111 else if (
dynamic_cast<Ipv4SocketCloseCommand *
>(
ctrl) !=
nullptr) {
113 request->getTag<SocketReq>()->getSocketId();
122 throw cRuntimeError(
"Unknown command: '%s' with %s", request->getName(),
ctrl->getClassName());
Referenced by handleMessage().
◆ initialize()
| void inet::Ipv4Encap::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
30 cSimpleModule::initialize(stage);
◆ numInitStages()
| virtual int inet::Ipv4Encap::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ crcMode
◆ defaultMCTimeToLive
| int inet::Ipv4Encap::defaultMCTimeToLive = -1 |
|
protected |
◆ defaultTimeToLive
| int inet::Ipv4Encap::defaultTimeToLive = -1 |
|
protected |
◆ socketIdToSocketDescriptor
◆ upperProtocols
| std::set<const Protocol *> inet::Ipv4Encap::upperProtocols |
|
protected |
The documentation for this class was generated from the following files:
int getProtocolNumber(const Protocol *protocol) const
Definition: ProtocolGroup.cc:46
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
std::map< int, SocketDescriptor * > socketIdToSocketDescriptor
Definition: Ipv4Encap.h:34
CrcMode crcMode
Definition: Ipv4Encap.h:30
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DscpReq
Definition: IUdp-gates.txt:25
static const Protocol ipv4
Definition: Protocol.h:93
std::set< const Protocol * > upperProtocols
Definition: Ipv4Encap.h:33
@ CRC_COMPUTED
Definition: CrcMode_m.h:59
static void serialize(MemoryOutputStream &stream, const Ptr< const Chunk > &chunk, b offset=b(0), b length=b(-1))
Serializes a chunk into the given stream.
Definition: Chunk.cc:175
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
INET_API InitStage INITSTAGE_NETWORK_LAYER
Initialization of network layer protocols.
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
int defaultMCTimeToLive
Definition: Ipv4Encap.h:32
void registerService(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a service primitive (SDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:14
void insertNetworkProtocolHeader(Packet *packet, const Protocol &protocol, const Ptr< NetworkHeaderBase > &header)
Definition: L3Tools.cc:70
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
removed ctrl
Definition: IUdp-gates.txt:7
bool contains(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:65
removed HopLimitReq
Definition: IUdp-gates.txt:11
virtual void handleRequest(Request *request)
Definition: Ipv4Encap.cc:93
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
int defaultTimeToLive
Definition: Ipv4Encap.h:31
static uint16_t checksum(const void *addr, unsigned int count)
Definition: TcpIpChecksum.h:33
@ CRC_DECLARED_CORRECT
Definition: CrcMode_m.h:57
@ CRC_DECLARED_INCORRECT
Definition: CrcMode_m.h:58
virtual void decapsulate(Packet *packet)
Definition: Ipv4Encap.cc:204
static ProtocolGroup ipprotocol
Definition: ProtocolGroup.h:42
const Protocol * getProtocol(int protocolNumber) const
Definition: ProtocolGroup.cc:31
virtual void encapsulate(Packet *packet)
Definition: Ipv4Encap.cc:125
IpProtocolId
Enum generated from inet/networklayer/common/IpProtocolId.msg:17 by opp_msgtool.
Definition: IpProtocolId_m.h:90
bool containsKey(const std::map< K, V, _C > &m, const Tk &a)
Definition: stlutils.h:80