INET Framework for OMNeT++/OMNEST
inet::Udp Class Reference

Implements the Udp protocol: encapsulates/decapsulates user data into/from Udp. More...

#include <Udp.h>

Inheritance diagram for inet::Udp:
inet::TransportProtocolBase inet::LayeredProtocolBase inet::OperationalBase inet::OperationalMixin< cSimpleModule > inet::ILifecycle

Classes

struct  MulticastMembership
 
struct  SockDesc
 

Public Types

enum  PortRange { EPHEMERAL_PORTRANGE_START = 1024, EPHEMERAL_PORTRANGE_END = 5000 }
 
typedef std::vector< MulticastMembership * > MulticastMembershipTable
 
typedef std::list< SockDesc * > SockDescList
 
typedef std::map< int, SockDesc * > SocketsByIdMap
 
typedef std::map< int, SockDescListSocketsByPortMap
 

Public Member Functions

 Udp ()
 
virtual ~Udp ()
 
- Public Member Functions inherited from inet::TransportProtocolBase
 TransportProtocolBase ()
 
- Public Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual ~OperationalMixin ()
 }@ More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 

Static Public Member Functions

static void insertCrc (const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< UdpHeader > &udpHeader, Packet *udpPayload)
 
static bool verifyCrc (const Protocol *networkProtocol, const Ptr< const UdpHeader > &udpHeader, Packet *packet)
 
static uint16_t computeCrc (const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< const UdpHeader > &udpHeader, const Ptr< const Chunk > &udpData)
 
static bool isCorrectPacket (Packet *packet, const Ptr< const UdpHeader > &udpHeader)
 

Protected Member Functions

virtual void refreshDisplay () const override
 
virtual SockDescgetSocketById (int sockId)
 
virtual SockDescgetOrCreateSocket (int sockId)
 
virtual SockDesccreateSocket (int sockId, const L3Address &localAddr, int localPort)
 
virtual void bind (int sockId, const L3Address &localAddr, int localPort)
 
virtual void connect (int sockId, const L3Address &remoteAddr, int remotePort)
 
virtual void close (int sockId)
 
virtual void destroySocket (int sockId)
 
void destroySocket (SocketsByIdMap::iterator it)
 
virtual void clearAllSockets ()
 
virtual void setTimeToLive (SockDesc *sd, int ttl)
 
virtual void setDscp (SockDesc *sd, short dscp)
 
virtual void setTos (SockDesc *sd, short tos)
 
virtual void setBroadcast (SockDesc *sd, bool broadcast)
 
virtual void setMulticastOutputInterface (SockDesc *sd, int interfaceId)
 
virtual void setMulticastLoop (SockDesc *sd, bool loop)
 
virtual void setReuseAddress (SockDesc *sd, bool reuseAddr)
 
virtual void joinMulticastGroups (SockDesc *sd, const std::vector< L3Address > &multicastAddresses, const std::vector< int > interfaceIds)
 
virtual void leaveMulticastGroups (SockDesc *sd, const std::vector< L3Address > &multicastAddresses)
 
virtual void blockMulticastSources (SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
 
virtual void unblockMulticastSources (SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
 
virtual void joinMulticastSources (SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
 
virtual void leaveMulticastSources (SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
 
virtual void setMulticastSourceFilter (SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, UdpSourceFilterMode filterMode, const std::vector< L3Address > &sourceList)
 
virtual void addMulticastAddressToInterface (NetworkInterface *ie, const L3Address &multicastAddr)
 
virtual ushort getEphemeralPort ()
 
virtual SockDescfindSocketForUnicastPacket (const L3Address &localAddr, ushort localPort, const L3Address &remoteAddr, ushort remotePort)
 
virtual std::vector< SockDesc * > findSocketsForMcastBcastPacket (const L3Address &localAddr, ushort localPort, const L3Address &remoteAddr, ushort remotePort, bool isMulticast, bool isBroadcast)
 
virtual SockDescfindFirstSocketByLocalAddress (const L3Address &localAddr, ushort localPort)
 
virtual void sendUp (Ptr< const UdpHeader > &header, Packet *payload, SockDesc *sd, ushort srcPort, ushort destPort)
 
virtual void processUndeliverablePacket (Packet *udpPacket)
 
virtual void sendUpErrorIndication (SockDesc *sd, const L3Address &localAddr, ushort localPort, const L3Address &remoteAddr, ushort remotePort)
 
virtual void processICMPv4Error (Packet *icmpPacket)
 
virtual void processICMPv6Error (Packet *icmpPacket)
 
virtual void processUDPPacket (Packet *udpPacket)
 
virtual void handleUpperPacket (Packet *appData) override
 
virtual void handleLowerPacket (Packet *appData) override
 
virtual void handleUpperCommand (cMessage *msg) override
 
virtual UdpHeadercreateUDPPacket ()
 
virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
virtual void initialize (int stage) override
 
virtual int numInitStages () const override
 
- Protected Member Functions inherited from inet::TransportProtocolBase
virtual bool isUpperMessage (cMessage *message) const override
 
virtual bool isLowerMessage (cMessage *message) const override
 
virtual bool isInitializeStage (int stage) const override
 
virtual bool isModuleStartStage (int stage) const override
 
virtual bool isModuleStopStage (int stage) const override
 
- Protected Member Functions inherited from inet::LayeredProtocolBase
virtual void handleMessageWhenUp (cMessage *message) override
 
virtual void handleSelfMessage (cMessage *message)
 
virtual void handleUpperMessage (cMessage *message)
 
virtual void handleLowerMessage (cMessage *message)
 
virtual void handleLowerCommand (cMessage *message)
 
- Protected Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual int numInitStages () const override
 
virtual void refreshDisplay () const override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void handleMessageWhenDown (cMessage *msg)
 
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
virtual State getInitialOperationalState () const
 Returns initial operational state: OPERATING or NOT_OPERATING. More...
 
virtual void handleActiveOperationTimeout (cMessage *message)
 
virtual bool isUp () const
 utility functions More...
 
virtual bool isDown () const
 
virtual void setOperationalState (State newState)
 
virtual void scheduleOperationTimeout (simtime_t timeout)
 
virtual void setupActiveOperation (LifecycleOperation *operation, IDoneCallback *doneCallback, State)
 
virtual void delayActiveOperationFinish (simtime_t timeout)
 
virtual void startActiveOperationExtraTime (simtime_t delay=SIMTIME_ZERO)
 
virtual void startActiveOperationExtraTimeOrFinish (simtime_t extraTime)
 
virtual void finishActiveOperation ()
 

Protected Attributes

CrcMode crcMode = CRC_MODE_UNDEFINED
 
SocketsByIdMap socketsByIdMap
 
SocketsByPortMap socketsByPortMap
 
ushort lastEphemeralPort = EPHEMERAL_PORTRANGE_START
 
ModuleRefByPar< IInterfaceTableift
 
int numSent = 0
 
int numPassedUp = 0
 
int numDroppedWrongPort = 0
 
int numDroppedBadChecksum = 0
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Friends

std::ostream & operator<< (std::ostream &os, const Udp::SockDesc &sd)
 

Additional Inherited Members

- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 

Detailed Description

Implements the Udp protocol: encapsulates/decapsulates user data into/from Udp.

More info in the NED file.

Member Typedef Documentation

◆ MulticastMembershipTable

◆ SockDescList

typedef std::list<SockDesc *> inet::Udp::SockDescList

◆ SocketsByIdMap

typedef std::map<int, SockDesc *> inet::Udp::SocketsByIdMap

◆ SocketsByPortMap

typedef std::map<int, SockDescList> inet::Udp::SocketsByPortMap

Member Enumeration Documentation

◆ PortRange

Enumerator
EPHEMERAL_PORTRANGE_START 
EPHEMERAL_PORTRANGE_END 
59  {
62  };

Constructor & Destructor Documentation

◆ Udp()

inet::Udp::Udp ( )
53 {
54 }

◆ ~Udp()

inet::Udp::~Udp ( )
virtual
57 {
59 }

Member Function Documentation

◆ addMulticastAddressToInterface()

void inet::Udp::addMulticastAddressToInterface ( NetworkInterface ie,
const L3Address multicastAddr 
)
protectedvirtual
488 {
489  ASSERT(ie && ie->isMulticast());
490  ASSERT(multicastAddr.isMulticast());
491 
492  if (multicastAddr.getType() == L3Address::IPv4) {
493 #ifdef INET_WITH_IPv4
494  ie->getProtocolDataForUpdate<Ipv4InterfaceData>()->joinMulticastGroup(multicastAddr.toIpv4());
495 #endif // ifdef INET_WITH_IPv4
496  }
497  else if (multicastAddr.getType() == L3Address::IPv6) {
498 #ifdef INET_WITH_IPv6
499  ie->getProtocolDataForUpdate<Ipv6InterfaceData>()->assignAddress(multicastAddr.toIpv6(), false, SimTime::getMaxTime(), SimTime::getMaxTime());
500 #endif // ifdef INET_WITH_IPv6
501  }
502  else
503  ie->joinMulticastGroup(multicastAddr);
504 }

Referenced by joinMulticastGroups().

◆ bind()

void inet::Udp::bind ( int  sockId,
const L3Address localAddr,
int  localPort 
)
protectedvirtual
295 {
296  if (sockId == -1)
297  throw cRuntimeError("sockId in BIND message not filled in");
298 
299  if (localPort < -1 || localPort > 65535) // -1: ephemeral port
300  throw cRuntimeError("bind: invalid local port number %d", localPort);
301 
302  auto it = socketsByIdMap.find(sockId);
303  SockDesc *sd = it != socketsByIdMap.end() ? it->second : nullptr;
304 
305  // to allow two sockets to bind to the same address/port combination
306  // both of them must have reuseAddr flag set
307  SockDesc *existing = findFirstSocketByLocalAddress(localAddr, localPort);
308  if (existing != nullptr && (!sd || !sd->reuseAddr || !existing->reuseAddr))
309  throw cRuntimeError("bind: local address/port %s:%u already taken", localAddr.str().c_str(), localPort);
310 
311  if (sd) {
312  if (sd->isBound)
313  throw cRuntimeError("bind: socket is already bound (sockId=%d)", sockId);
314 
315  sd->isBound = true;
316  sd->localAddr = localAddr;
317  if (localPort != -1 && sd->localPort != localPort) {
318  socketsByPortMap[sd->localPort].remove(sd);
319  sd->localPort = localPort;
320  socketsByPortMap[sd->localPort].push_back(sd);
321  }
322  }
323  else {
324  sd = createSocket(sockId, localAddr, localPort);
325  sd->isBound = true;
326  }
327 }

Referenced by handleUpperCommand().

◆ blockMulticastSources()

void inet::Udp::blockMulticastSources ( SockDesc sd,
NetworkInterface ie,
L3Address  multicastAddress,
const std::vector< L3Address > &  sourceList 
)
protectedvirtual
541 {
542  ASSERT(ie && ie->isMulticast());
543  ASSERT(multicastAddress.isMulticast());
544 
545  MulticastMembership *membership = sd->findMulticastMembership(multicastAddress, ie->getInterfaceId());
546  if (!membership)
547  throw cRuntimeError("Udp::blockMulticastSources(): not a member of %s group on interface '%s'",
548  multicastAddress.str().c_str(), ie->getFullName());
549 
550  if (membership->filterMode != UDP_EXCLUDE_MCAST_SOURCES)
551  throw cRuntimeError("Udp::blockMulticastSources(): socket was not joined to all sources of %s group on interface '%s'",
552  multicastAddress.str().c_str(), ie->getFullName());
553 
554  std::vector<L3Address> oldSources(membership->sourceList);
555  std::vector<L3Address>& excludedSources = membership->sourceList;
556  bool changed = false;
557  for (auto& elem : sourceList) {
558  const L3Address& sourceAddress = elem;
559  if (!contains(excludedSources, sourceAddress)) {
560  excludedSources.push_back(sourceAddress);
561  changed = true;
562  }
563  }
564 
565  if (changed) {
566  ie->changeMulticastGroupMembership(multicastAddress, MCAST_EXCLUDE_SOURCES, oldSources, MCAST_EXCLUDE_SOURCES, excludedSources);
567  }
568 }

Referenced by handleUpperCommand().

◆ clearAllSockets()

void inet::Udp::clearAllSockets ( )
protectedvirtual
1324 {
1325  EV_INFO << "Clear all sockets\n";
1326 
1327  for (auto& elem : socketsByIdMap)
1328  delete elem.second;
1329 
1330  socketsByIdMap.clear();
1331  socketsByPortMap.clear();
1332 }

Referenced by handleCrashOperation(), handleStopOperation(), and ~Udp().

◆ close()

void inet::Udp::close ( int  sockId)
protectedvirtual
872 {
873  // remove from socketsByIdMap
874  auto it = socketsByIdMap.find(sockId);
875  if (it == socketsByIdMap.end()) {
876  EV_ERROR << "socket id=" << sockId << " doesn't exist (already closed?)\n";
877  return;
878  }
879 
880  EV_INFO << "Closing socket: " << *(it->second) << "\n";
881 
882  destroySocket(it);
883 }

Referenced by handleUpperCommand().

◆ computeCrc()

uint16_t inet::Udp::computeCrc ( const Protocol networkProtocol,
const L3Address srcAddress,
const L3Address destAddress,
const Ptr< const UdpHeader > &  udpHeader,
const Ptr< const Chunk > &  udpData 
)
static
842 {
843  auto pseudoHeader = makeShared<TransportPseudoHeader>();
844  pseudoHeader->setSrcAddress(srcAddress);
845  pseudoHeader->setDestAddress(destAddress);
846  pseudoHeader->setNetworkProtocolId(networkProtocol->getId());
847  pseudoHeader->setProtocolId(IP_PROT_UDP);
848  pseudoHeader->setPacketLength(udpHeader->getChunkLength() + udpData->getChunkLength());
849  // pseudoHeader length: ipv4: 12 bytes, ipv6: 40 bytes, other: ???
850  if (networkProtocol == &Protocol::ipv4)
851  pseudoHeader->setChunkLength(B(12));
852  else if (networkProtocol == &Protocol::ipv6)
853  pseudoHeader->setChunkLength(B(40));
854  else
855  throw cRuntimeError("Unknown network protocol: %s", networkProtocol->getName());
856 
857  MemoryOutputStream stream;
858  Chunk::serialize(stream, pseudoHeader);
859  Chunk::serialize(stream, udpHeader);
860  Chunk::serialize(stream, udpData);
861  uint16_t crc = TcpIpChecksum::checksum(stream.getData());
862 
863  // Excerpt from RFC 768:
864  // If the computed checksum is zero, it is transmitted as all ones (the
865  // equivalent in one's complement arithmetic). An all zero transmitted
866  // checksum value means that the transmitter generated no checksum (for
867  // debugging or for higher level protocols that don't care).
868  return crc == 0x0000 ? 0xFFFF : crc;
869 }

Referenced by insertCrc(), and verifyCrc().

◆ connect()

void inet::Udp::connect ( int  sockId,
const L3Address remoteAddr,
int  remotePort 
)
protectedvirtual
384 {
385  if (remoteAddr.isUnspecified())
386  throw cRuntimeError("connect: unspecified remote address");
387  if (remotePort <= 0 || remotePort > 65535)
388  throw cRuntimeError("connect: invalid remote port number %d", remotePort);
389 
390  SockDesc *sd = getOrCreateSocket(sockId);
391  sd->remoteAddr = remoteAddr;
392  sd->remotePort = remotePort;
393  sd->onlyLocalPortIsSet = false;
394 
395  EV_INFO << "Socket connected: " << *sd << "\n";
396 }

Referenced by handleUpperCommand().

◆ createSocket()

Udp::SockDesc * inet::Udp::createSocket ( int  sockId,
const L3Address localAddr,
int  localPort 
)
protectedvirtual
344 {
345  // create and fill in SockDesc
346  SockDesc *sd = new SockDesc(sockId);
347  sd->multicastLoop = par("defaultMulticastLoop");
348  sd->isBound = false;
349  sd->localAddr = localAddr;
350  sd->localPort = localPort == -1 ? getEphemeralPort() : localPort;
351  sd->onlyLocalPortIsSet = sd->localAddr.isUnspecified();
352 
353  // add to socketsByIdMap
354  socketsByIdMap[sockId] = sd;
355 
356  // add to socketsByPortMap
357  SockDescList& list = socketsByPortMap[sd->localPort]; // create if doesn't exist
358  list.push_back(sd);
359 
360  EV_INFO << "Socket created: " << *sd << "\n";
361  return sd;
362 }

Referenced by bind(), and getOrCreateSocket().

◆ createUDPPacket()

UdpHeader * inet::Udp::createUDPPacket ( )
protectedvirtual
1502 {
1503  return new UdpHeader();
1504 }

◆ destroySocket() [1/2]

void inet::Udp::destroySocket ( int  sockId)
protectedvirtual
905 {
906  // remove from socketsByIdMap
907  auto it = socketsByIdMap.find(sockId);
908  if (it == socketsByIdMap.end()) {
909  EV_WARN << "socket id=" << sockId << " doesn't exist\n";
910  return;
911  }
912  EV_INFO << "Destroy socket: " << *(it->second) << "\n";
913 
914  destroySocket(it);
915 }

Referenced by close(), and handleUpperCommand().

◆ destroySocket() [2/2]

void inet::Udp::destroySocket ( SocketsByIdMap::iterator  it)
protected
886 {
887  SockDesc *sd = it->second;
888  socketsByIdMap.erase(it);
889 
890  // remove from socketsByPortMap
891  SockDescList& list = socketsByPortMap[sd->localPort];
892  for (auto it = list.begin(); it != list.end(); ++it)
893  if (*it == sd) {
894  list.erase(it);
895  break;
896  }
897 
898  if (list.empty())
899  socketsByPortMap.erase(sd->localPort);
900 
901  delete sd;
902 }

◆ findFirstSocketByLocalAddress()

Udp::SockDesc * inet::Udp::findFirstSocketByLocalAddress ( const L3Address localAddr,
ushort  localPort 
)
protectedvirtual
330 {
331  auto it = socketsByPortMap.find(localPort);
332  if (it == socketsByPortMap.end())
333  return nullptr;
334 
335  SockDescList& list = it->second;
336  for (auto sd : list) {
337  if (sd->localAddr.isUnspecified() || sd->localAddr == localAddr)
338  return sd;
339  }
340  return nullptr;
341 }

Referenced by bind().

◆ findSocketForUnicastPacket()

Udp::SockDesc * inet::Udp::findSocketForUnicastPacket ( const L3Address localAddr,
ushort  localPort,
const L3Address remoteAddr,
ushort  remotePort 
)
protectedvirtual
1024 {
1025  auto it = socketsByPortMap.find(localPort);
1026  if (it == socketsByPortMap.end())
1027  return nullptr;
1028 
1029  // select the socket bound to ANY_ADDR only if there is no socket bound to localAddr
1030  SockDescList& list = it->second;
1031  SockDesc *socketBoundToAnyAddress = nullptr;
1032  for (SockDescList::reverse_iterator it = list.rbegin(); it != list.rend(); ++it) {
1033  SockDesc *sd = *it;
1034  if (sd->onlyLocalPortIsSet || (
1035  (sd->remotePort == -1 || sd->remotePort == remotePort) &&
1036  (sd->localAddr.isUnspecified() || sd->localAddr == localAddr) &&
1037  (sd->remoteAddr.isUnspecified() || sd->remoteAddr == remoteAddr)))
1038  {
1039  if (sd->localAddr.isUnspecified())
1040  socketBoundToAnyAddress = sd;
1041  else
1042  return sd;
1043  }
1044  }
1045 
1046  return socketBoundToAnyAddress;
1047 }

Referenced by processICMPv4Error(), processICMPv6Error(), and processUDPPacket().

◆ findSocketsForMcastBcastPacket()

std::vector< Udp::SockDesc * > inet::Udp::findSocketsForMcastBcastPacket ( const L3Address localAddr,
ushort  localPort,
const L3Address remoteAddr,
ushort  remotePort,
bool  isMulticast,
bool  isBroadcast 
)
protectedvirtual
1050 {
1051  ASSERT(isMulticast || isBroadcast);
1052  std::vector<SockDesc *> result;
1053  auto it = socketsByPortMap.find(localPort);
1054  if (it == socketsByPortMap.end())
1055  return result;
1056 
1057  SockDescList& list = it->second;
1058  for (auto sd : list) {
1059  if (isBroadcast) {
1060  if (sd->isBroadcast) {
1061  if ((sd->remotePort == -1 || sd->remotePort == remotePort) &&
1062  (sd->remoteAddr.isUnspecified() || sd->remoteAddr == remoteAddr))
1063  result.push_back(sd);
1064  }
1065  }
1066  else if (isMulticast) {
1067  auto membership = sd->findFirstMulticastMembership(localAddr);
1068  if (membership != sd->multicastMembershipTable.end()) {
1069  if ((sd->remotePort == -1 || sd->remotePort == remotePort) &&
1070  (sd->remoteAddr.isUnspecified() || sd->remoteAddr == remoteAddr) &&
1071  (*membership)->isSourceAllowed(remoteAddr))
1072  result.push_back(sd);
1073  }
1074  }
1075  }
1076 
1077  return result;
1078 }

Referenced by processUDPPacket().

◆ getEphemeralPort()

ushort inet::Udp::getEphemeralPort ( )
protectedvirtual
365 {
366  // start at the last allocated port number + 1, and search for an unused one
367  ushort searchUntil = lastEphemeralPort++;
370 
372  if (lastEphemeralPort == searchUntil) // got back to starting point?
373  throw cRuntimeError("Ephemeral port range %d..%d exhausted, all ports occupied", EPHEMERAL_PORTRANGE_START, EPHEMERAL_PORTRANGE_END);
377  }
378 
379  // found a free one, return it
380  return lastEphemeralPort;
381 }

Referenced by createSocket().

◆ getOrCreateSocket()

Udp::SockDesc * inet::Udp::getOrCreateSocket ( int  sockId)
protectedvirtual
399 {
400  // validate sockId
401  if (sockId == -1)
402  throw cRuntimeError("sockId in Udp command not filled in");
403 
404  auto it = socketsByIdMap.find(sockId);
405  if (it != socketsByIdMap.end())
406  return it->second;
407 
408  return createSocket(sockId, L3Address(), -1);
409 }

Referenced by connect(), handleUpperCommand(), and handleUpperPacket().

◆ getSocketById()

Udp::SockDesc * inet::Udp::getSocketById ( int  sockId)
protectedvirtual
1507 {
1508  auto it = socketsByIdMap.find(sockId);
1509  if (it == socketsByIdMap.end())
1510  throw cRuntimeError("socket id=%d doesn't exist (already closed?)", sockId);
1511  return it->second;
1512 }

◆ handleCrashOperation()

void inet::Udp::handleCrashOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

1313 {
1314  clearAllSockets();
1315 #ifdef INET_WITH_IPv4
1316  icmp = nullptr;
1317 #endif
1318 #ifdef INET_WITH_IPv6
1319  icmpv6 = nullptr;
1320 #endif
1321 }

◆ handleLowerPacket()

void inet::Udp::handleLowerPacket ( Packet appData)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

124 {
125  // received from IP layer
126  ASSERT(packet->getControlInfo() == nullptr);
127  auto protocol = packet->getTag<PacketProtocolTag>()->getProtocol();
128  if (protocol == &Protocol::udp) {
129  processUDPPacket(packet);
130  }
131  else if (protocol == &Protocol::icmpv4) {
132  processICMPv4Error(packet); // assume it's an ICMP error
133  }
134  else if (protocol == &Protocol::icmpv6) {
135  processICMPv6Error(packet); // assume it's an ICMP error
136  }
137  else
138  throw cRuntimeError("Unknown protocol: %s(%d)", protocol->getName(), protocol->getId());
139 }

◆ handleStartOperation()

void inet::Udp::handleStartOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

1292 {
1293 #ifdef INET_WITH_IPv4
1294  icmp = nullptr;
1295 #endif
1296 #ifdef INET_WITH_IPv6
1297  icmpv6 = nullptr;
1298 #endif
1299 }

◆ handleStopOperation()

void inet::Udp::handleStopOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

1302 {
1303  clearAllSockets();
1304 #ifdef INET_WITH_IPv4
1305  icmp = nullptr;
1306 #endif
1307 #ifdef INET_WITH_IPv6
1308  icmpv6 = nullptr;
1309 #endif
1310 }

◆ handleUpperCommand()

void inet::Udp::handleUpperCommand ( cMessage *  msg)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

142 {
143  switch (msg->getKind()) {
144  case UDP_C_BIND: {
145  int socketId = check_and_cast<Request *>(msg)->getTag<SocketReq>()->getSocketId();
146  UdpBindCommand *ctrl = check_and_cast<UdpBindCommand *>(msg->getControlInfo());
147  bind(socketId, ctrl->getLocalAddr(), ctrl->getLocalPort());
148  break;
149  }
150 
151  case UDP_C_CONNECT: {
152  int socketId = check_and_cast<Request *>(msg)->getTag<SocketReq>()->getSocketId();
153  UdpConnectCommand *ctrl = check_and_cast<UdpConnectCommand *>(msg->getControlInfo());
154  connect(socketId, ctrl->getRemoteAddr(), ctrl->getRemotePort());
155  break;
156  }
157 
158  case UDP_C_SETOPTION: {
159  int socketId = check_and_cast<Request *>(msg)->getTag<SocketReq>()->getSocketId();
160  UdpSetOptionCommand *ctrl = check_and_cast<UdpSetOptionCommand *>(msg->getControlInfo());
161  SockDesc *sd = getOrCreateSocket(socketId);
162 
163  switch (ctrl->getOptionCode()) {
164  case UDP_C_SETOPTION_TTL: {
165  auto cmd = check_and_cast<UdpSetTimeToLiveCommand *>(ctrl);
166  setTimeToLive(sd, cmd->getTtl());
167  break;
168  }
169  case UDP_C_SETOPTION_DSCP: {
170  auto cmd = check_and_cast<UdpSetDscpCommand *>(ctrl);
171  setDscp(sd, cmd->getDscp());
172  break;
173  }
174  case UDP_C_SETOPTION_TOS: {
175  auto cmd = check_and_cast<UdpSetTosCommand *>(ctrl);
176  setTos(sd, cmd->getTos());
177  break;
178  }
180  auto cmd = check_and_cast<UdpSetBroadcastCommand *>(ctrl);
181  setBroadcast(sd, cmd->getBroadcast());
182  break;
183  }
185  auto cmd = check_and_cast<UdpSetMulticastInterfaceCommand *>(ctrl);
186  setMulticastOutputInterface(sd, cmd->getInterfaceId());
187  break;
188  }
190  auto cmd = check_and_cast<UdpSetMulticastLoopCommand *>(ctrl);
191  setMulticastLoop(sd, cmd->getLoop());
192  break;
193  }
195  auto cmd = check_and_cast<UdpSetReuseAddressCommand *>(ctrl);
196  setReuseAddress(sd, cmd->getReuseAddress());
197  break;
198  }
200  auto cmd = check_and_cast<UdpJoinMulticastGroupsCommand *>(ctrl);
201  std::vector<L3Address> addresses;
202  std::vector<int> interfaceIds;
203  for (size_t i = 0; i < cmd->getMulticastAddrArraySize(); i++)
204  addresses.push_back(cmd->getMulticastAddr(i));
205  for (size_t i = 0; i < cmd->getInterfaceIdArraySize(); i++)
206  interfaceIds.push_back(cmd->getInterfaceId(i));
207  joinMulticastGroups(sd, addresses, interfaceIds);
208  break;
209  }
211  auto cmd = check_and_cast<UdpLeaveMulticastGroupsCommand *>(ctrl);
212  std::vector<L3Address> addresses;
213  for (size_t i = 0; i < cmd->getMulticastAddrArraySize(); i++)
214  addresses.push_back(cmd->getMulticastAddr(i));
215  leaveMulticastGroups(sd, addresses);
216  break;
217  }
219  auto cmd = check_and_cast<UdpBlockMulticastSourcesCommand *>(ctrl);
220  NetworkInterface *ie = ift->getInterfaceById(cmd->getInterfaceId());
221  std::vector<L3Address> sourceList;
222  for (size_t i = 0; i < cmd->getSourceListArraySize(); i++)
223  sourceList.push_back(cmd->getSourceList(i));
224  blockMulticastSources(sd, ie, cmd->getMulticastAddr(), sourceList);
225  break;
226  }
228  auto cmd = check_and_cast<UdpUnblockMulticastSourcesCommand *>(ctrl);
229  NetworkInterface *ie = ift->getInterfaceById(cmd->getInterfaceId());
230  std::vector<L3Address> sourceList;
231  for (size_t i = 0; i < cmd->getSourceListArraySize(); i++)
232  sourceList.push_back(cmd->getSourceList(i));
233  unblockMulticastSources(sd, ie, cmd->getMulticastAddr(), sourceList);
234  break;
235  }
237  auto cmd = check_and_cast<UdpLeaveMulticastSourcesCommand *>(ctrl);
238  NetworkInterface *ie = ift->getInterfaceById(cmd->getInterfaceId());
239  std::vector<L3Address> sourceList;
240  for (size_t i = 0; i < cmd->getSourceListArraySize(); i++)
241  sourceList.push_back(cmd->getSourceList(i));
242  leaveMulticastSources(sd, ie, cmd->getMulticastAddr(), sourceList);
243  break;
244  }
246  auto cmd = check_and_cast<UdpJoinMulticastSourcesCommand *>(ctrl);
247  NetworkInterface *ie = ift->getInterfaceById(cmd->getInterfaceId());
248  std::vector<L3Address> sourceList;
249  for (size_t i = 0; i < cmd->getSourceListArraySize(); i++)
250  sourceList.push_back(cmd->getSourceList(i));
251  joinMulticastSources(sd, ie, cmd->getMulticastAddr(), sourceList);
252  break;
253  }
255  auto cmd = check_and_cast<UdpSetMulticastSourceFilterCommand *>(ctrl);
256  NetworkInterface *ie = ift->getInterfaceById(cmd->getInterfaceId());
257  std::vector<L3Address> sourceList;
258  for (unsigned int i = 0; i < cmd->getSourceListArraySize(); i++)
259  sourceList.push_back(cmd->getSourceList(i));
260  setMulticastSourceFilter(sd, ie, cmd->getMulticastAddr(), cmd->getFilterMode(), sourceList);
261  break;
262  }
263  throw cRuntimeError("Unknown subclass of UdpSetOptionCommand received from app: code=%d, name=%s", ctrl->getOptionCode(), ctrl->getClassName());
264  }
265  break;
266  }
267 
268  case UDP_C_CLOSE: {
269  int socketId = check_and_cast<Request *>(msg)->getTag<SocketReq>()->getSocketId();
270  close(socketId);
271  auto indication = new Indication("closed", UDP_I_SOCKET_CLOSED);
272  auto udpCtrl = new UdpSocketClosedIndication();
273  indication->setControlInfo(udpCtrl);
274  indication->addTag<SocketInd>()->setSocketId(socketId);
275  send(indication, "appOut");
276 
277  break;
278  }
279 
280  case UDP_C_DESTROY: {
281  int socketId = check_and_cast<Request *>(msg)->getTag<SocketReq>()->getSocketId();
282  destroySocket(socketId);
283  break;
284  }
285 
286  default: {
287  throw cRuntimeError("Unknown command code (message kind) %d received from app", msg->getKind());
288  }
289  }
290 
291  delete msg; // also deletes control info in it
292 }

◆ handleUpperPacket()

void inet::Udp::handleUpperPacket ( Packet appData)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

705 {
706  if (packet->getKind() != UDP_C_DATA)
707  throw cRuntimeError("Unknown packet command code (message kind) %d received from app", packet->getKind());
708 
709  emit(packetReceivedFromUpperSignal, packet);
710  L3Address srcAddr, destAddr;
711  int srcPort = -1, destPort = -1;
712 
713  auto& socketReq = packet->removeTag<SocketReq>();
714  int socketId = socketReq->getSocketId();
715 
716  SockDesc *sd = getOrCreateSocket(socketId);
717 
718  auto addressReq = packet->addTagIfAbsent<L3AddressReq>();
719  srcAddr = addressReq->getSrcAddress();
720  destAddr = addressReq->getDestAddress();
721 
722  if (srcAddr.isUnspecified())
723  addressReq->setSrcAddress(srcAddr = sd->localAddr);
724 
725  if (destAddr.isUnspecified())
726  addressReq->setDestAddress(destAddr = sd->remoteAddr);
727 
728  if (auto& portsReq = packet->removeTagIfPresent<L4PortReq>()) {
729  srcPort = portsReq->getSrcPort();
730  destPort = portsReq->getDestPort();
731  }
732 
733  if (srcPort == -1)
734  srcPort = sd->localPort;
735 
736  if (destPort == -1)
737  destPort = sd->remotePort;
738 
739  const auto& interfaceReq = packet->findTag<InterfaceReq>();
740  ASSERT(interfaceReq == nullptr || interfaceReq->getInterfaceId() != -1);
741 
742  if (interfaceReq == nullptr && destAddr.isMulticast()) {
743  auto membership = sd->findFirstMulticastMembership(destAddr);
744  int interfaceId = (membership != sd->multicastMembershipTable.end() && (*membership)->interfaceId != -1) ? (*membership)->interfaceId : sd->multicastOutputInterfaceId;
745  if (interfaceId != -1)
746  packet->addTagIfAbsent<InterfaceReq>()->setInterfaceId(interfaceId);
747  }
748 
749  if (addressReq->getDestAddress().isUnspecified())
750  throw cRuntimeError("send: unspecified destination address");
751 
752  if (destPort <= 0 || destPort > 65535)
753  throw cRuntimeError("send: invalid remote port number %d", destPort);
754 
755  if (packet->findTag<MulticastReq>() == nullptr)
756  packet->addTag<MulticastReq>()->setMulticastLoop(sd->multicastLoop);
757 
758  if (sd->ttl != -1 && packet->findTag<HopLimitReq>() == nullptr)
759  packet->addTag<HopLimitReq>()->setHopLimit(sd->ttl);
760 
761  if (sd->dscp != -1 && packet->findTag<DscpReq>() == nullptr)
762  packet->addTag<DscpReq>()->setDifferentiatedServicesCodePoint(sd->dscp);
763 
764  if (sd->tos != -1 && packet->findTag<TosReq>() == nullptr) {
765  packet->addTag<TosReq>()->setTos(sd->tos);
766  if (packet->findTag<DscpReq>())
767  throw cRuntimeError("setting error: TOS and DSCP found together");
768  }
769 
770  const Protocol *l3Protocol = nullptr;
771  // TODO apps use ModuleIdAddress if the network interface doesn't have an IP address configured, and UDP uses NextHopForwarding which results in a weird error in MessageDispatcher
772  if (destAddr.getType() == L3Address::IPv4)
773  l3Protocol = &Protocol::ipv4;
774  else if (destAddr.getType() == L3Address::IPv6)
775  l3Protocol = &Protocol::ipv6;
776  else
777  l3Protocol = &Protocol::nextHopForwarding;
778 
779  auto udpHeader = makeShared<UdpHeader>();
780  // set source and destination port
781  udpHeader->setSourcePort(srcPort);
782  udpHeader->setDestinationPort(destPort);
783 
784  B totalLength = udpHeader->getChunkLength() + packet->getTotalLength();
785  if (totalLength.get() > UDP_MAX_MESSAGE_SIZE)
786  throw cRuntimeError("send: total UDP message size exceeds %u", UDP_MAX_MESSAGE_SIZE);
787 
788  udpHeader->setTotalLengthField(totalLength);
789  if (crcMode == CRC_COMPUTED) {
790  udpHeader->setCrcMode(CRC_COMPUTED);
791  udpHeader->setCrc(0x0000); // crcMode == CRC_COMPUTED is done in an INetfilter hook
792  }
793  else {
794  udpHeader->setCrcMode(crcMode);
795  insertCrc(l3Protocol, srcAddr, destAddr, udpHeader, packet);
796  }
797 
798  insertTransportProtocolHeader(packet, Protocol::udp, udpHeader);
799  packet->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(l3Protocol);
800  packet->setKind(0);
801 
802  EV_INFO << "Sending app packet " << packet->getName() << " over " << l3Protocol->getName() << ".\n";
803  emit(packetSentSignal, packet);
804  emit(packetSentToLowerSignal, packet);
805  send(packet, "ipOut");
806  numSent++;
807 }

◆ initialize()

void inet::Udp::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::OperationalMixin< cSimpleModule >.

62 {
64 
65  if (stage == INITSTAGE_LOCAL) {
66  const char *crcModeString = par("crcMode");
67  crcMode = parseCrcMode(crcModeString, true);
68 
70  ift.reference(this, "interfaceTableModule", true);
71 #ifdef INET_WITH_IPv4
72  icmp = nullptr;
73 #endif
74 #ifdef INET_WITH_IPv6
75  icmpv6 = nullptr;
76 #endif
77 
78  numSent = 0;
79  numPassedUp = 0;
82 
83  WATCH(numSent);
84  WATCH(numPassedUp);
85  WATCH(numDroppedWrongPort);
86  WATCH(numDroppedBadChecksum);
87 
88  WATCH_PTRMAP(socketsByIdMap);
89  WATCH_MAP(socketsByPortMap);
90  }
91  else if (stage == INITSTAGE_TRANSPORT_LAYER) {
92  if (crcMode == CRC_COMPUTED) {
93  cModuleType *moduleType = cModuleType::get("inet.transportlayer.udp.UdpCrcInsertionHook");
94  auto crcInsertion = check_and_cast<UdpCrcInsertionHook *>(moduleType->create("crcInsertion", this));
95  crcInsertion->finalizeParameters();
96  crcInsertion->callInitialize();
97 
98  // TODO
99  // Unlike IPv4, when UDP packets are originated by an IPv6 node,
100  // the UDP checksum is not optional. That is, whenever
101  // originating a UDP packet, an IPv6 node must compute a UDP
102  // checksum over the packet and the pseudo-header, and, if that
103  // computation yields a result of zero, it must be changed to hex
104  // FFFF for placement in the UDP header. IPv6 receivers must
105  // discard UDP packets containing a zero checksum, and should log
106  // the error.
107 #ifdef INET_WITH_IPv4
108  auto ipv4 = dynamic_cast<INetfilter *>(findModuleByPath("^.ipv4.ip"));
109  if (ipv4 != nullptr)
110  ipv4->registerHook(0, crcInsertion);
111 #endif
112 #ifdef INET_WITH_IPv6
113  auto ipv6 = dynamic_cast<INetfilter *>(findModuleByPath("^.ipv6.ipv6"));
114  if (ipv6 != nullptr)
115  ipv6->registerHook(0, crcInsertion);
116 #endif
117  }
118  registerService(Protocol::udp, gate("appIn"), gate("appOut"));
119  registerProtocol(Protocol::udp, gate("ipOut"), gate("ipIn"));
120  }
121 }

◆ insertCrc()

void inet::Udp::insertCrc ( const Protocol networkProtocol,
const L3Address srcAddress,
const L3Address destAddress,
const Ptr< UdpHeader > &  udpHeader,
Packet udpPayload 
)
static
810 {
811  CrcMode crcMode = udpHeader->getCrcMode();
812  switch (crcMode) {
813  case CRC_DISABLED:
814  // if the CRC mode is disabled, then the CRC is 0
815  udpHeader->setCrc(0x0000);
816  break;
818  // if the CRC mode is declared to be correct, then set the CRC to an easily recognizable value
819  udpHeader->setCrc(0xC00D);
820  break;
822  // if the CRC mode is declared to be incorrect, then set the CRC to an easily recognizable value
823  udpHeader->setCrc(0xBAAD);
824  break;
825  case CRC_COMPUTED: {
826  // if the CRC mode is computed, then compute the CRC and set it
827  // this computation is delayed after the routing decision, see INetfilter hook
828  udpHeader->setCrc(0x0000); // make sure that the CRC is 0 in the Udp header before computing the CRC
829  udpHeader->setCrcMode(CRC_DISABLED); // for serializer/deserializer checks only: deserializer sets the crcMode to disabled when crc is 0
830  auto udpData = packet->peekData(Chunk::PF_ALLOW_EMPTY);
831  auto crc = computeCrc(networkProtocol, srcAddress, destAddress, udpHeader, udpData);
832  udpHeader->setCrc(crc);
833  udpHeader->setCrcMode(CRC_COMPUTED);
834  break;
835  }
836  default:
837  throw cRuntimeError("Unknown CRC mode: %d", (int)crcMode);
838  }
839 }

Referenced by inet::UdpCrcInsertionHook::datagramPostRoutingHook(), handleUpperPacket(), and inet::Ipv4NatTable::processPacket().

◆ isCorrectPacket()

bool inet::Udp::isCorrectPacket ( Packet packet,
const Ptr< const UdpHeader > &  udpHeader 
)
static
1353 {
1354  auto trailerPopOffset = packet->getBackOffset();
1355  auto udpHeaderOffset = packet->getFrontOffset() - udpHeader->getChunkLength();
1356  if (udpHeader->getTotalLengthField() < UDP_HEADER_LENGTH)
1357  return false;
1358  else if (B(udpHeader->getTotalLengthField()) > trailerPopOffset - udpHeaderOffset)
1359  return false;
1360  else {
1361  const auto& l3AddressInd = packet->findTag<L3AddressInd>();
1362  const auto& networkProtocolInd = packet->findTag<NetworkProtocolInd>();
1363  if (l3AddressInd != nullptr && networkProtocolInd != nullptr)
1364  return verifyCrc(networkProtocolInd->getProtocol(), udpHeader, packet);
1365  else
1366  return udpHeader->getCrcMode() != CrcMode::CRC_DECLARED_INCORRECT;
1367  }
1368 }

Referenced by inet::UdpProtocolDissector::dissect().

◆ joinMulticastGroups()

void inet::Udp::joinMulticastGroups ( SockDesc sd,
const std::vector< L3Address > &  multicastAddresses,
const std::vector< int >  interfaceIds 
)
protectedvirtual
451 {
452  for (uint32_t k = 0; k < multicastAddresses.size(); k++) {
453  const L3Address& multicastAddr = multicastAddresses[k];
454  int interfaceId = k < interfaceIds.size() ? interfaceIds[k] : -1;
455  ASSERT(multicastAddr.isMulticast());
456 
457  MulticastMembership *membership = sd->findMulticastMembership(multicastAddr, interfaceId);
458  if (membership)
459  throw cRuntimeError("UPD::joinMulticastGroups(): %s group on interface %s is already joined.",
460  multicastAddr.str().c_str(), ift->getInterfaceById(interfaceId)->getFullName());
461 
462  membership = new MulticastMembership();
463  membership->interfaceId = interfaceId;
464  membership->multicastAddress = multicastAddr;
465  membership->filterMode = UDP_EXCLUDE_MCAST_SOURCES;
466 
467  sd->addMulticastMembership(membership);
468 
469  // add the multicast address to the selected interface or all interfaces
470  if (interfaceId != -1) {
471  NetworkInterface *ie = ift->getInterfaceById(interfaceId);
472  if (!ie)
473  throw cRuntimeError("Interface id=%d does not exist", interfaceId);
474  ASSERT(ie->isMulticast());
475  addMulticastAddressToInterface(ie, multicastAddr);
476  }
477  else {
478  for (int i = 0; i < ift->getNumInterfaces(); i++) {
479  NetworkInterface *ie = ift->getInterface(i);
480  if (ie->isMulticast())
481  addMulticastAddressToInterface(ie, multicastAddr);
482  }
483  }
484  }
485 }

Referenced by handleUpperCommand().

◆ joinMulticastSources()

void inet::Udp::joinMulticastSources ( SockDesc sd,
NetworkInterface ie,
L3Address  multicastAddress,
const std::vector< L3Address > &  sourceList 
)
protectedvirtual
636 {
637  ASSERT(ie && ie->isMulticast());
638  ASSERT(multicastAddress.isMulticast());
639 
640  MulticastMembership *membership = sd->findMulticastMembership(multicastAddress, ie->getInterfaceId());
641  if (!membership) {
642  membership = new MulticastMembership();
643  membership->interfaceId = ie->getInterfaceId();
644  membership->multicastAddress = multicastAddress;
645  membership->filterMode = UDP_INCLUDE_MCAST_SOURCES;
646  sd->addMulticastMembership(membership);
647  }
648 
649  if (membership->filterMode == UDP_EXCLUDE_MCAST_SOURCES)
650  throw cRuntimeError("Udp::joinMulticastSources(): socket was joined to all sources of %s group on interface '%s'",
651  multicastAddress.str().c_str(), ie->getFullName());
652 
653  std::vector<L3Address> oldSources(membership->sourceList);
654  std::vector<L3Address>& includedSources = membership->sourceList;
655  bool changed = false;
656  for (auto& elem : sourceList) {
657  const L3Address& sourceAddress = elem;
658  if (!contains(includedSources, sourceAddress)) {
659  includedSources.push_back(sourceAddress);
660  changed = true;
661  }
662  }
663 
664  if (changed) {
665  ie->changeMulticastGroupMembership(multicastAddress, MCAST_INCLUDE_SOURCES, oldSources, MCAST_INCLUDE_SOURCES, includedSources);
666  }
667 }

Referenced by handleUpperCommand().

◆ leaveMulticastGroups()

void inet::Udp::leaveMulticastGroups ( SockDesc sd,
const std::vector< L3Address > &  multicastAddresses 
)
protectedvirtual
507 {
508  std::vector<L3Address> empty;
509 
510  for (auto& multicastAddresse : multicastAddresses) {
511  auto it = sd->findFirstMulticastMembership(multicastAddresse);
512  while (it != sd->multicastMembershipTable.end()) {
513  MulticastMembership *membership = *it;
514  if (membership->multicastAddress != multicastAddresse)
515  break;
516  it = sd->multicastMembershipTable.erase(it);
517 
518  McastSourceFilterMode oldFilterMode = membership->filterMode == UDP_INCLUDE_MCAST_SOURCES ?
520 
521  if (membership->interfaceId != -1) {
522  NetworkInterface *ie = ift->getInterfaceById(membership->interfaceId);
523  ie->changeMulticastGroupMembership(membership->multicastAddress,
524  oldFilterMode, membership->sourceList, MCAST_INCLUDE_SOURCES, empty);
525  }
526  else {
527  for (int j = 0; j < ift->getNumInterfaces(); ++j) {
528  NetworkInterface *ie = ift->getInterface(j);
529  if (ie->isMulticast())
530  ie->changeMulticastGroupMembership(membership->multicastAddress,
531  oldFilterMode, membership->sourceList, MCAST_INCLUDE_SOURCES, empty);
532  }
533  }
534 
535  delete membership;
536  }
537  }
538 }

Referenced by handleUpperCommand().

◆ leaveMulticastSources()

void inet::Udp::leaveMulticastSources ( SockDesc sd,
NetworkInterface ie,
L3Address  multicastAddress,
const std::vector< L3Address > &  sourceList 
)
protectedvirtual
602 {
603  ASSERT(ie && ie->isMulticast());
604  ASSERT(multicastAddress.isMulticast());
605 
606  MulticastMembership *membership = sd->findMulticastMembership(multicastAddress, ie->getInterfaceId());
607  if (!membership)
608  throw cRuntimeError("Udp::leaveMulticastSources(): not a member of %s group in interface '%s'",
609  multicastAddress.str().c_str(), ie->getFullName());
610 
611  if (membership->filterMode == UDP_EXCLUDE_MCAST_SOURCES)
612  throw cRuntimeError("Udp::leaveMulticastSources(): socket was joined to all sources of %s group on interface '%s'",
613  multicastAddress.str().c_str(), ie->getFullName());
614 
615  std::vector<L3Address> oldSources(membership->sourceList);
616  std::vector<L3Address>& includedSources = membership->sourceList;
617  bool changed = false;
618  for (auto& elem : sourceList) {
619  const L3Address& sourceAddress = elem;
620  auto it = find(includedSources, sourceAddress);
621  if (it != includedSources.end()) {
622  includedSources.erase(it);
623  changed = true;
624  }
625  }
626 
627  if (changed) {
628  ie->changeMulticastGroupMembership(multicastAddress, MCAST_EXCLUDE_SOURCES, oldSources, MCAST_EXCLUDE_SOURCES, includedSources);
629  }
630 
631  if (includedSources.empty())
632  sd->deleteMulticastMembership(membership);
633 }

Referenced by handleUpperCommand().

◆ numInitStages()

virtual int inet::Udp::numInitStages ( ) const
inlineoverrideprotectedvirtual
210 { return NUM_INIT_STAGES; }

◆ processICMPv4Error()

void inet::Udp::processICMPv4Error ( Packet icmpPacket)
protectedvirtual
1152 {
1153 #ifdef INET_WITH_IPv4
1154  // extract details from the error message, then try to notify socket that sent bogus packet
1155 
1156  if (!icmp)
1157  // TODO move to initialize?
1158  icmp = getModuleFromPar<Icmp>(par("icmpModule"), this);
1159  if (!icmp->verifyCrc(packet)) {
1160  EV_WARN << "incoming ICMP packet has wrong CRC, dropped\n";
1161  PacketDropDetails details;
1162  details.setReason(INCORRECTLY_RECEIVED);
1163  emit(packetDroppedSignal, packet, &details);
1164  delete packet;
1165  return;
1166  }
1167  int type, code;
1168  L3Address localAddr, remoteAddr;
1169  int localPort = -1, remotePort = -1;
1170  bool udpHeaderAvailable = false;
1171 
1172  const auto& icmpHeader = packet->popAtFront<IcmpHeader>();
1173  ASSERT(icmpHeader);
1174  type = icmpHeader->getType();
1175  code = icmpHeader->getCode();
1176  const auto& ipv4Header = packet->popAtFront<Ipv4Header>();
1177  if (ipv4Header->getDontFragment() || ipv4Header->getFragmentOffset() == 0) {
1178  const auto& udpHeader = packet->peekAtFront<UdpHeader>(B(8), Chunk::PF_ALLOW_INCOMPLETE);
1179  localAddr = ipv4Header->getSrcAddress();
1180  remoteAddr = ipv4Header->getDestAddress();
1181  localPort = udpHeader->getSourcePort();
1182  remotePort = udpHeader->getDestinationPort();
1183  udpHeaderAvailable = true;
1184  }
1185  EV_WARN << "ICMP error received: type=" << type << " code=" << code
1186  << " about packet " << localAddr << ":" << localPort << " > "
1187  << remoteAddr << ":" << remotePort << "\n";
1188 
1189  // identify socket and report error to it
1190  if (udpHeaderAvailable) {
1191  SockDesc *sd = findSocketForUnicastPacket(localAddr, localPort, remoteAddr, remotePort);
1192  if (sd) {
1193  // send UDP_I_ERROR to socket
1194  EV_DETAIL << "Source socket is sockId=" << sd->sockId << ", notifying.\n";
1195  sendUpErrorIndication(sd, localAddr, localPort, remoteAddr, remotePort);
1196  }
1197  else {
1198  EV_WARN << "No socket on that local port, ignoring ICMP error\n";
1199  }
1200  }
1201  else
1202  EV_WARN << "Udp header not available, ignoring ICMP error\n";
1203 #endif // ifdef INET_WITH_IPv4
1204 
1205  delete packet;
1206 }

Referenced by handleLowerPacket().

◆ processICMPv6Error()

void inet::Udp::processICMPv6Error ( Packet icmpPacket)
protectedvirtual
1209 {
1210 #ifdef INET_WITH_IPv6
1211  if (!icmpv6)
1212  // TODO move to initialize?
1213  icmpv6 = getModuleFromPar<Icmpv6>(par("icmpv6Module"), this);
1214  if (!icmpv6->verifyCrc(packet)) {
1215  EV_WARN << "incoming ICMPv6 packet has wrong CRC, dropped\n";
1216  PacketDropDetails details;
1217  details.setReason(INCORRECTLY_RECEIVED);
1218  emit(packetDroppedSignal, packet, &details);
1219  delete packet;
1220  return;
1221  }
1222 
1223  // extract details from the error message, then try to notify socket that sent bogus packet
1224  int type, code;
1225  L3Address localAddr, remoteAddr;
1226  ushort localPort, remotePort;
1227  bool udpHeaderAvailable = false;
1228 
1229  const auto& icmpHeader = packet->popAtFront<Icmpv6Header>();
1230  ASSERT(icmpHeader);
1231 
1232  type = icmpHeader->getType();
1233  code = -1; // FIXME this is dependent on getType()...
1234  // Note: we must NOT use decapsulate() because payload in ICMP is conceptually truncated
1235  const auto& ipv6Header = packet->popAtFront<Ipv6Header>();
1236  const Ipv6FragmentHeader *fh = dynamic_cast<const Ipv6FragmentHeader *>(ipv6Header->findExtensionHeaderByType(IP_PROT_IPv6EXT_FRAGMENT));
1237  if (!fh || fh->getFragmentOffset() == 0) {
1238  const auto& udpHeader = packet->peekAtFront<UdpHeader>(B(8), Chunk::PF_ALLOW_INCOMPLETE);
1239  localAddr = ipv6Header->getSrcAddress();
1240  remoteAddr = ipv6Header->getDestAddress();
1241  localPort = udpHeader->getSourcePort();
1242  remotePort = udpHeader->getDestinationPort();
1243  udpHeaderAvailable = true;
1244  }
1245 
1246  // identify socket and report error to it
1247  if (udpHeaderAvailable) {
1248  EV_WARN << "ICMP error received: type=" << type << " code=" << code
1249  << " about packet " << localAddr << ":" << localPort << " > "
1250  << remoteAddr << ":" << remotePort << "\n";
1251 
1252  SockDesc *sd = findSocketForUnicastPacket(localAddr, localPort, remoteAddr, remotePort);
1253  if (sd) {
1254  // send UDP_I_ERROR to socket
1255  EV_DETAIL << "Source socket is sockId=" << sd->sockId << ", notifying.\n";
1256  sendUpErrorIndication(sd, localAddr, localPort, remoteAddr, remotePort);
1257  }
1258  else {
1259  EV_WARN << "No socket on that local port, ignoring ICMPv6 error\n";
1260  }
1261  }
1262  else
1263  EV_WARN << "Udp header not available, ignoring ICMPv6 error\n";
1264 
1265 #endif // ifdef INET_WITH_IPv6
1266 
1267  delete packet;
1268 }

Referenced by handleLowerPacket().

◆ processUDPPacket()

void inet::Udp::processUDPPacket ( Packet udpPacket)
protectedvirtual
918 {
919  ASSERT(udpPacket->getControlInfo() == nullptr);
920  emit(packetReceivedFromLowerSignal, udpPacket);
921  emit(packetReceivedSignal, udpPacket);
922 
923  udpPacket->removeTag<PacketProtocolTag>();
924  b udpHeaderPopPosition = udpPacket->getFrontOffset();
925  auto udpHeader = udpPacket->popAtFront<UdpHeader>(b(-1), Chunk::PF_ALLOW_INCORRECT);
926 
927  // simulate checksum: discard packet if it has bit error
928  EV_INFO << "Packet " << udpPacket->getName() << " received from network, dest port " << udpHeader->getDestinationPort() << "\n";
929 
930  auto srcPort = udpHeader->getSourcePort();
931  auto destPort = udpHeader->getDestinationPort();
932  auto l3AddressInd = udpPacket->getTag<L3AddressInd>();
933  auto srcAddr = l3AddressInd->getSrcAddress();
934  auto destAddr = l3AddressInd->getDestAddress();
935  auto totalLength = B(udpHeader->getTotalLengthField());
936  auto hasIncorrectLength = totalLength<udpHeader->getChunkLength() || totalLength> udpHeader->getChunkLength() + udpPacket->getDataLength();
937  auto networkProtocol = udpPacket->getTag<NetworkProtocolInd>()->getProtocol();
938 
939  if (hasIncorrectLength || !verifyCrc(networkProtocol, udpHeader, udpPacket)) {
940  EV_WARN << "Packet has bit error, discarding\n";
941  PacketDropDetails details;
942  details.setReason(INCORRECTLY_RECEIVED);
943  emit(packetDroppedSignal, udpPacket, &details);
945  delete udpPacket;
946  return;
947  }
948 
949  // remove lower layer paddings:
950  if (totalLength < udpPacket->getDataLength()) {
951  udpPacket->setBackOffset(udpHeaderPopPosition + totalLength);
952  }
953 
954  bool isMulticast = destAddr.isMulticast();
955  bool isBroadcast = destAddr.isBroadcast();
956  if (!isMulticast && !isBroadcast) {
957  // unicast packet, there must be only one socket listening
958  SockDesc *sd = findSocketForUnicastPacket(destAddr, destPort, srcAddr, srcPort);
959  if (!sd) {
960  EV_WARN << "No socket registered on port " << destPort << "\n";
961  udpPacket->setFrontOffset(udpHeaderPopPosition);
962  processUndeliverablePacket(udpPacket);
963  return;
964  }
965  else {
966  sendUp(udpHeader, udpPacket, sd, srcPort, destPort);
967  }
968  }
969  else {
970  // multicast packet: find all matching sockets, and send up a copy to each
971  std::vector<SockDesc *> sds = findSocketsForMcastBcastPacket(destAddr, destPort, srcAddr, srcPort, isMulticast, isBroadcast);
972  if (sds.empty()) {
973  EV_WARN << "No socket registered on port " << destPort << "\n";
974  udpPacket->setFrontOffset(udpHeaderPopPosition);
975  processUndeliverablePacket(udpPacket);
976  return;
977  }
978  else {
979  unsigned int i;
980  for (i = 0; i < sds.size() - 1; i++) // sds.size() >= 1
981  sendUp(udpHeader, udpPacket->dup(), sds[i], srcPort, destPort); // dup() to all but the last one
982  sendUp(udpHeader, udpPacket, sds[i], srcPort, destPort); // send original to last socket
983  }
984  }
985 }

Referenced by handleLowerPacket().

◆ processUndeliverablePacket()

void inet::Udp::processUndeliverablePacket ( Packet udpPacket)
protectedvirtual
1081 {
1082  const auto& udpHeader = udpPacket->peekAtFront<UdpHeader>();
1083  PacketDropDetails details;
1084  details.setReason(NO_PORT_FOUND);
1085  emit(packetDroppedSignal, udpPacket, &details);
1087 
1088  // send back ICMP PORT_UNREACHABLE
1089  char buff[80];
1090  snprintf(buff, sizeof(buff), "Port %d unreachable", udpHeader->getDestinationPort());
1091  udpPacket->setName(buff);
1092  const Protocol *protocol = udpPacket->getTag<NetworkProtocolInd>()->getProtocol();
1093 
1094  if (protocol == nullptr) {
1095  throw cRuntimeError("(%s)%s arrived from lower layer without NetworkProtocolInd",
1096  udpPacket->getClassName(), udpPacket->getName());
1097  }
1098 
1099  // push back network protocol header
1100  udpPacket->trim();
1101  udpPacket->insertAtFront(udpPacket->getTag<NetworkProtocolInd>()->getNetworkProtocolHeader());
1102  auto inIe = udpPacket->getTag<InterfaceInd>()->getInterfaceId();
1103 
1104  if (protocol->getId() == Protocol::ipv4.getId()) {
1105 #ifdef INET_WITH_IPv4
1106  if (!icmp)
1107  // TODO move to initialize?
1108  icmp = getModuleFromPar<Icmp>(par("icmpModule"), this);
1109  icmp->sendErrorMessage(udpPacket, inIe, ICMP_DESTINATION_UNREACHABLE, ICMP_DU_PORT_UNREACHABLE);
1110 #endif // ifdef INET_WITH_IPv4
1111  delete udpPacket;
1112  }
1113  else if (protocol->getId() == Protocol::ipv6.getId()) {
1114 #ifdef INET_WITH_IPv6
1115  if (!icmpv6)
1116  // TODO move to initialize?
1117  icmpv6 = getModuleFromPar<Icmpv6>(par("icmpv6Module"), this);
1118  icmpv6->sendErrorMessage(udpPacket, ICMPv6_DESTINATION_UNREACHABLE, PORT_UNREACHABLE);
1119 #endif // ifdef INET_WITH_IPv6
1120  delete udpPacket;
1121  }
1122  else if (protocol->getId() == Protocol::nextHopForwarding.getId()) {
1123  delete udpPacket;
1124  }
1125  else {
1126  throw cRuntimeError("(%s)%s arrived from lower layer with unrecognized NetworkProtocolInd %s",
1127  udpPacket->getClassName(), udpPacket->getName(), protocol->getName());
1128  delete udpPacket;
1129  }
1130 }

Referenced by processUDPPacket().

◆ refreshDisplay()

void inet::Udp::refreshDisplay ( ) const
overrideprotectedvirtual
1339 {
1341 
1342  char buf[80];
1343  sprintf(buf, "passed up: %d pks\nsent: %d pks", numPassedUp, numSent);
1344  if (numDroppedWrongPort > 0) {
1345  sprintf(buf + strlen(buf), "\ndropped (no app): %d pks", numDroppedWrongPort);
1346  getDisplayString().setTagArg("i", 1, "red");
1347  }
1348  getDisplayString().setTagArg("t", 0, buf);
1349 }

◆ sendUp()

void inet::Udp::sendUp ( Ptr< const UdpHeader > &  header,
Packet payload,
SockDesc sd,
ushort  srcPort,
ushort  destPort 
)
protectedvirtual
1133 {
1134  EV_INFO << "Sending payload up to socket sockId=" << sd->sockId << "\n";
1135 
1136  // send payload with UdpControlInfo up to the application
1137  payload->setKind(UDP_I_DATA);
1138  payload->removeTagIfPresent<PacketProtocolTag>();
1139  payload->removeTagIfPresent<DispatchProtocolReq>();
1140  payload->addTagIfAbsent<SocketInd>()->setSocketId(sd->sockId);
1141  payload->addTagIfAbsent<TransportProtocolInd>()->setProtocol(&Protocol::udp);
1142  payload->addTagIfAbsent<TransportProtocolInd>()->setTransportProtocolHeader(header);
1143  payload->addTagIfAbsent<L4PortInd>()->setSrcPort(srcPort);
1144  payload->addTagIfAbsent<L4PortInd>()->setDestPort(destPort);
1145 
1146  emit(packetSentToUpperSignal, payload);
1147  send(payload, "appOut");
1148  numPassedUp++;
1149 }

Referenced by processUDPPacket().

◆ sendUpErrorIndication()

void inet::Udp::sendUpErrorIndication ( SockDesc sd,
const L3Address localAddr,
ushort  localPort,
const L3Address remoteAddr,
ushort  remotePort 
)
protectedvirtual
1271 {
1272  auto indication = new Indication("ERROR", UDP_I_ERROR);
1273  UdpErrorIndication *udpCtrl = new UdpErrorIndication();
1274  indication->setControlInfo(udpCtrl);
1275  // FIXME notifyMsg->addTagIfAbsent<InterfaceInd>()->setInterfaceId(interfaceId);
1276  indication->addTag<SocketInd>()->setSocketId(sd->sockId);
1277  auto addresses = indication->addTag<L3AddressInd>();
1278  addresses->setSrcAddress(localAddr);
1279  addresses->setDestAddress(remoteAddr);
1280  auto ports = indication->addTag<L4PortInd>();
1281  ports->setSrcPort(sd->localPort);
1282  ports->setDestPort(remotePort);
1283 
1284  send(indication, "appOut");
1285 }

Referenced by processICMPv4Error(), and processICMPv6Error().

◆ setBroadcast()

void inet::Udp::setBroadcast ( SockDesc sd,
bool  broadcast 
)
protectedvirtual
431 {
432  sd->isBroadcast = broadcast;
433 }

Referenced by handleUpperCommand().

◆ setDscp()

void inet::Udp::setDscp ( SockDesc sd,
short  dscp 
)
protectedvirtual
421 {
422  sd->dscp = dscp;
423 }

Referenced by handleUpperCommand().

◆ setMulticastLoop()

void inet::Udp::setMulticastLoop ( SockDesc sd,
bool  loop 
)
protectedvirtual
441 {
442  sd->multicastLoop = loop;
443 }

Referenced by handleUpperCommand(), and handleUpperPacket().

◆ setMulticastOutputInterface()

void inet::Udp::setMulticastOutputInterface ( SockDesc sd,
int  interfaceId 
)
protectedvirtual
436 {
437  sd->multicastOutputInterfaceId = interfaceId;
438 }

Referenced by handleUpperCommand().

◆ setMulticastSourceFilter()

void inet::Udp::setMulticastSourceFilter ( SockDesc sd,
NetworkInterface ie,
L3Address  multicastAddress,
UdpSourceFilterMode  filterMode,
const std::vector< L3Address > &  sourceList 
)
protectedvirtual
670 {
671  ASSERT(ie && ie->isMulticast());
672  ASSERT(multicastAddress.isMulticast());
673 
674  MulticastMembership *membership = sd->findMulticastMembership(multicastAddress, ie->getInterfaceId());
675  if (!membership) {
676  membership = new MulticastMembership();
677  membership->interfaceId = ie->getInterfaceId();
678  membership->multicastAddress = multicastAddress;
679  membership->filterMode = UDP_INCLUDE_MCAST_SOURCES;
680  sd->addMulticastMembership(membership);
681  }
682 
683  bool changed = membership->filterMode != filterMode ||
684  membership->sourceList.size() != sourceList.size() ||
685  !equal(sourceList.begin(), sourceList.end(), membership->sourceList.begin());
686  if (changed) {
687  std::vector<L3Address> oldSources(membership->sourceList);
688  McastSourceFilterMode oldFilterMode = membership->filterMode == UDP_INCLUDE_MCAST_SOURCES ?
690  McastSourceFilterMode newFilterMode = filterMode == UDP_INCLUDE_MCAST_SOURCES ?
692 
693  membership->filterMode = filterMode;
694  membership->sourceList = sourceList;
695 
696  ie->changeMulticastGroupMembership(multicastAddress, oldFilterMode, oldSources, newFilterMode, sourceList);
697  }
698 }

Referenced by handleUpperCommand().

◆ setReuseAddress()

void inet::Udp::setReuseAddress ( SockDesc sd,
bool  reuseAddr 
)
protectedvirtual
446 {
447  sd->reuseAddr = reuseAddr;
448 }

Referenced by handleUpperCommand().

◆ setTimeToLive()

void inet::Udp::setTimeToLive ( SockDesc sd,
int  ttl 
)
protectedvirtual
416 {
417  sd->ttl = ttl;
418 }

Referenced by handleUpperCommand().

◆ setTos()

void inet::Udp::setTos ( SockDesc sd,
short  tos 
)
protectedvirtual
426 {
427  sd->tos = tos;
428 }

Referenced by handleUpperCommand(), and handleUpperPacket().

◆ unblockMulticastSources()

void inet::Udp::unblockMulticastSources ( SockDesc sd,
NetworkInterface ie,
L3Address  multicastAddress,
const std::vector< L3Address > &  sourceList 
)
protectedvirtual
571 {
572  ASSERT(ie && ie->isMulticast());
573  ASSERT(multicastAddress.isMulticast());
574 
575  MulticastMembership *membership = sd->findMulticastMembership(multicastAddress, ie->getInterfaceId());
576  if (!membership)
577  throw cRuntimeError("Udp::unblockMulticastSources(): not a member of %s group in interface '%s'",
578  multicastAddress.str().c_str(), ie->getFullName());
579 
580  if (membership->filterMode != UDP_EXCLUDE_MCAST_SOURCES)
581  throw cRuntimeError("Udp::unblockMulticastSources(): socket was not joined to all sources of %s group on interface '%s'",
582  multicastAddress.str().c_str(), ie->getFullName());
583 
584  std::vector<L3Address> oldSources(membership->sourceList);
585  std::vector<L3Address>& excludedSources = membership->sourceList;
586  bool changed = false;
587  for (auto& elem : sourceList) {
588  const L3Address& sourceAddress = elem;
589  auto it = find(excludedSources, sourceAddress);
590  if (it != excludedSources.end()) {
591  excludedSources.erase(it);
592  changed = true;
593  }
594  }
595 
596  if (changed) {
597  ie->changeMulticastGroupMembership(multicastAddress, MCAST_EXCLUDE_SOURCES, oldSources, MCAST_EXCLUDE_SOURCES, excludedSources);
598  }
599 }

Referenced by handleUpperCommand().

◆ verifyCrc()

bool inet::Udp::verifyCrc ( const Protocol networkProtocol,
const Ptr< const UdpHeader > &  udpHeader,
Packet packet 
)
static
988 {
989  switch (udpHeader->getCrcMode()) {
990  case CRC_DISABLED:
991  // if the CRC mode is disabled, then the check passes if the CRC is 0
992  return udpHeader->getCrc() == 0x0000;
993  case CRC_DECLARED_CORRECT: {
994  // if the CRC mode is declared to be correct, then the check passes if and only if the chunks are correct
995  auto totalLength = udpHeader->getTotalLengthField();
996  auto udpDataBytes = packet->peekDataAt(B(0), totalLength - udpHeader->getChunkLength(), Chunk::PF_ALLOW_INCORRECT);
997  return udpHeader->isCorrect() && udpDataBytes->isCorrect();
998  }
1000  // if the CRC mode is declared to be incorrect, then the check fails
1001  return false;
1002  case CRC_COMPUTED: {
1003  if (udpHeader->getCrc() == 0x0000)
1004  // if the CRC mode is computed and the CRC is 0 (disabled), then the check passes
1005  return true;
1006  else {
1007  // otherwise compute the CRC, the check passes if the result is 0xFFFF (includes the received CRC) and the chunks are correct
1008  auto l3AddressInd = packet->getTag<L3AddressInd>();
1009  auto srcAddress = l3AddressInd->getSrcAddress();
1010  auto destAddress = l3AddressInd->getDestAddress();
1011  auto totalLength = udpHeader->getTotalLengthField();
1012  auto udpData = packet->peekDataAt<BytesChunk>(B(0), totalLength - udpHeader->getChunkLength(), Chunk::PF_ALLOW_INCORRECT);
1013  auto computedCrc = computeCrc(networkProtocol, srcAddress, destAddress, udpHeader, udpData);
1014  // TODO delete these isCorrect calls, rely on CRC only
1015  return computedCrc == 0xFFFF && udpHeader->isCorrect() && udpData->isCorrect();
1016  }
1017  }
1018  default:
1019  throw cRuntimeError("Unknown CRC mode");
1020  }
1021 }

Referenced by isCorrectPacket(), and processUDPPacket().

Friends And Related Function Documentation

◆ operator<<

std::ostream& operator<< ( std::ostream &  os,
const Udp::SockDesc sd 
)
friend
1440 {
1441  os << "sockId=" << sd.sockId;
1442  os << " localPort=" << sd.localPort;
1443  if (sd.remotePort != -1)
1444  os << " remotePort=" << sd.remotePort;
1445  if (!sd.localAddr.isUnspecified())
1446  os << " localAddr=" << sd.localAddr;
1447  if (!sd.remoteAddr.isUnspecified())
1448  os << " remoteAddr=" << sd.remoteAddr;
1449  if (sd.multicastOutputInterfaceId != -1)
1450  os << " interfaceId=" << sd.multicastOutputInterfaceId;
1451  if (!sd.multicastLoop)
1452  os << " multicastLoop=" << sd.multicastLoop;
1453 
1454  return os;
1455 }

Member Data Documentation

◆ crcMode

CrcMode inet::Udp::crcMode = CRC_MODE_UNDEFINED
protected

◆ ift

◆ lastEphemeralPort

ushort inet::Udp::lastEphemeralPort = EPHEMERAL_PORTRANGE_START
protected

Referenced by getEphemeralPort(), and initialize().

◆ numDroppedBadChecksum

int inet::Udp::numDroppedBadChecksum = 0
protected

Referenced by initialize(), and processUDPPacket().

◆ numDroppedWrongPort

int inet::Udp::numDroppedWrongPort = 0
protected

◆ numPassedUp

int inet::Udp::numPassedUp = 0
protected

Referenced by initialize(), refreshDisplay(), and sendUp().

◆ numSent

int inet::Udp::numSent = 0
protected

◆ socketsByIdMap

◆ socketsByPortMap


The documentation for this class was generated from the following files:
inet::Udp::findSocketForUnicastPacket
virtual SockDesc * findSocketForUnicastPacket(const L3Address &localAddr, ushort localPort, const L3Address &remoteAddr, ushort remotePort)
Definition: Udp.cc:1023
inet::Udp::processUDPPacket
virtual void processUDPPacket(Packet *udpPacket)
Definition: Udp.cc:917
inet::Udp::destroySocket
virtual void destroySocket(int sockId)
Definition: Udp.cc:904
inet::Udp::EPHEMERAL_PORTRANGE_END
@ EPHEMERAL_PORTRANGE_END
Definition: Udp.h:61
TransportProtocolInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd TransportProtocolInd
Definition: IUdp-gates.txt:20
inet::UDP_MAX_MESSAGE_SIZE
const uint16_t UDP_MAX_MESSAGE_SIZE
Definition: Udp.h:38
protocol
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
inet::Udp::numPassedUp
int numPassedUp
Definition: Udp.h:127
inet::ICMP_DESTINATION_UNREACHABLE
@ ICMP_DESTINATION_UNREACHABLE
Definition: IcmpHeader_m.h:77
inet::mpls_constants::empty
const char empty[]
Definition: ConstType.h:29
DscpReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DscpReq
Definition: IUdp-gates.txt:25
inet::UDP_C_CONNECT
@ UDP_C_CONNECT
Definition: UdpControlInfo_m.h:88
inet::INCORRECTLY_RECEIVED
@ INCORRECTLY_RECEIVED
Definition: Simsignals_m.h:71
inet::Protocol::ipv4
static const Protocol ipv4
Definition: Protocol.h:93
inet::Udp::setTimeToLive
virtual void setTimeToLive(SockDesc *sd, int ttl)
Definition: Udp.cc:415
L4PortReq
removed L4PortReq
Definition: IUdp-gates.txt:11
inet::Protocol::ipv6
static const Protocol ipv6
Definition: Protocol.h:94
inet::packetReceivedFromUpperSignal
simsignal_t packetReceivedFromUpperSignal
Definition: Simsignals.cc:88
inet::Udp::lastEphemeralPort
ushort lastEphemeralPort
Definition: Udp.h:116
inet::PORT_UNREACHABLE
@ PORT_UNREACHABLE
Definition: Icmpv6Header_m.h:126
inet::OperationalMixin< cSimpleModule >::initialize
virtual void initialize(int stage) override
Definition: OperationalMixinImpl.h:26
inet::Protocol::icmpv4
static const Protocol icmpv4
Definition: Protocol.h:71
inet::CRC_COMPUTED
@ CRC_COMPUTED
Definition: CrcMode_m.h:59
inet::Udp::numSent
int numSent
Definition: Udp.h:126
InterfaceReq
removed InterfaceReq
Definition: IUdp-gates.txt:11
inet::Chunk::serialize
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
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
L3AddressInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
inet::find
std::vector< T >::iterator find(std::vector< T > &v, const Tk &a)
Definition: stlutils.h:44
inet::Udp::sendUp
virtual void sendUp(Ptr< const UdpHeader > &header, Packet *payload, SockDesc *sd, ushort srcPort, ushort destPort)
Definition: Udp.cc:1132
inet::Udp::setBroadcast
virtual void setBroadcast(SockDesc *sd, bool broadcast)
Definition: Udp.cc:430
inet::Udp::processICMPv6Error
virtual void processICMPv6Error(Packet *icmpPacket)
Definition: Udp.cc:1208
inet::Udp::verifyCrc
static bool verifyCrc(const Protocol *networkProtocol, const Ptr< const UdpHeader > &udpHeader, Packet *packet)
Definition: Udp.cc:987
inet::Udp::numDroppedWrongPort
int numDroppedWrongPort
Definition: Udp.h:128
inet::UDP_C_SETOPTION_SET_MCAST_SRC_FILTER
@ UDP_C_SETOPTION_SET_MCAST_SRC_FILTER
Definition: UdpControlInfo_m.h:133
inet::parseCrcMode
CrcMode parseCrcMode(const char *crcModeString, bool allowDisable)
Definition: CrcMode.cc:14
inet::packetSentSignal
simsignal_t packetSentSignal
Definition: Simsignals.cc:96
inet::CRC_DISABLED
@ CRC_DISABLED
Definition: CrcMode_m.h:56
inet::Udp::blockMulticastSources
virtual void blockMulticastSources(SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
Definition: Udp.cc:540
inet::Udp::socketsByIdMap
SocketsByIdMap socketsByIdMap
Definition: Udp.h:112
inet::Protocol::nextHopForwarding
static const Protocol nextHopForwarding
Definition: Protocol.h:128
inet::UDP_C_SETOPTION_LEAVE_MCAST_SRC
@ UDP_C_SETOPTION_LEAVE_MCAST_SRC
Definition: UdpControlInfo_m.h:132
inet::L3Address::IPv4
@ IPv4
Definition: L3Address.h:35
inet::registerService
void registerService(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a service primitive (SDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:14
inet::Udp::leaveMulticastGroups
virtual void leaveMulticastGroups(SockDesc *sd, const std::vector< L3Address > &multicastAddresses)
Definition: Udp.cc:506
inet::packetDroppedSignal
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
inet::UDP_C_SETOPTION_REUSEADDR
@ UDP_C_SETOPTION_REUSEADDR
Definition: UdpControlInfo_m.h:126
inet::Udp::clearAllSockets
virtual void clearAllSockets()
Definition: Udp.cc:1323
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::Udp::setDscp
virtual void setDscp(SockDesc *sd, short dscp)
Definition: Udp.cc:420
inet::IP_PROT_IPv6EXT_FRAGMENT
@ IP_PROT_IPv6EXT_FRAGMENT
Definition: IpProtocolId_m.h:114
inet::Udp::createSocket
virtual SockDesc * createSocket(int sockId, const L3Address &localAddr, int localPort)
Definition: Udp.cc:343
ctrl
removed ctrl
Definition: IUdp-gates.txt:7
inet::Udp::setMulticastLoop
virtual void setMulticastLoop(SockDesc *sd, bool loop)
Definition: Udp.cc:440
inet::IP_PROT_UDP
@ IP_PROT_UDP
Definition: IpProtocolId_m.h:97
inet::McastSourceFilterMode
McastSourceFilterMode
Definition: NetworkInterface.h:33
inet::UDP_C_SETOPTION_BROADCAST
@ UDP_C_SETOPTION_BROADCAST
Definition: UdpControlInfo_m.h:123
MulticastReq
removed MulticastReq
Definition: IUdp-gates.txt:11
inet::Udp::leaveMulticastSources
virtual void leaveMulticastSources(SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
Definition: Udp.cc:601
inet::Udp::setMulticastSourceFilter
virtual void setMulticastSourceFilter(SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, UdpSourceFilterMode filterMode, const std::vector< L3Address > &sourceList)
Definition: Udp.cc:669
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::Udp::insertCrc
static void insertCrc(const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< UdpHeader > &udpHeader, Packet *udpPayload)
Definition: Udp.cc:809
inet::Chunk::PF_ALLOW_INCOMPLETE
@ PF_ALLOW_INCOMPLETE
Definition: Chunk.h:280
inet::UDP_C_SETOPTION_JOIN_MCAST_GRP
@ UDP_C_SETOPTION_JOIN_MCAST_GRP
Definition: UdpControlInfo_m.h:127
inet::UDP_I_SOCKET_CLOSED
@ UDP_I_SOCKET_CLOSED
Definition: UdpControlInfo_m.h:159
inet::packetReceivedSignal
simsignal_t packetReceivedSignal
Definition: Simsignals.cc:97
inet::Protocol::udp
static const Protocol udp
Definition: Protocol.h:117
inet::UDP_INCLUDE_MCAST_SOURCES
@ UDP_INCLUDE_MCAST_SOURCES
Definition: UdpControlInfo_m.h:1205
if
if(cwndVector) cwndVector -> record(state->snd_cwnd)
inet::Udp::joinMulticastSources
virtual void joinMulticastSources(SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
Definition: Udp.cc:635
inet::Udp::setTos
virtual void setTos(SockDesc *sd, short tos)
Definition: Udp.cc:425
inet::contains
bool contains(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:65
inet::Chunk::PF_ALLOW_EMPTY
@ PF_ALLOW_EMPTY
Definition: Chunk.h:279
inet::insertTransportProtocolHeader
void insertTransportProtocolHeader(Packet *packet, const Protocol &protocol, const Ptr< TransportHeaderBase > &header)
Definition: L4Tools.cc:77
inet::Udp::addMulticastAddressToInterface
virtual void addMulticastAddressToInterface(NetworkInterface *ie, const L3Address &multicastAddr)
Definition: Udp.cc:487
HopLimitReq
removed HopLimitReq
Definition: IUdp-gates.txt:11
inet::INITSTAGE_TRANSPORT_LAYER
INET_API InitStage INITSTAGE_TRANSPORT_LAYER
Initialization of transport-layer protocols.
inet::UDP_C_DESTROY
@ UDP_C_DESTROY
Definition: UdpControlInfo_m.h:91
type
removed type
Definition: IUdp-gates.txt:7
inet::Udp::ift
ModuleRefByPar< IInterfaceTable > ift
Definition: Udp.h:117
inet::Udp::findFirstSocketByLocalAddress
virtual SockDesc * findFirstSocketByLocalAddress(const L3Address &localAddr, ushort localPort)
Definition: Udp.cc:329
inet::Udp::EPHEMERAL_PORTRANGE_START
@ EPHEMERAL_PORTRANGE_START
Definition: Udp.h:60
inet::Udp::crcMode
CrcMode crcMode
Definition: Udp.h:109
inet::Udp::sendUpErrorIndication
virtual void sendUpErrorIndication(SockDesc *sd, const L3Address &localAddr, ushort localPort, const L3Address &remoteAddr, ushort remotePort)
Definition: Udp.cc:1270
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::UDP_C_SETOPTION_JOIN_MCAST_SRC
@ UDP_C_SETOPTION_JOIN_MCAST_SRC
Definition: UdpControlInfo_m.h:129
inet::UDP_C_SETOPTION_UNBLOCK_MCAST_SRC
@ UDP_C_SETOPTION_UNBLOCK_MCAST_SRC
Definition: UdpControlInfo_m.h:131
inet::Udp::processICMPv4Error
virtual void processICMPv4Error(Packet *icmpPacket)
Definition: Udp.cc:1151
inet::Udp::setReuseAddress
virtual void setReuseAddress(SockDesc *sd, bool reuseAddr)
Definition: Udp.cc:445
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
inet::CrcMode
CrcMode
Enum generated from inet/transportlayer/common/CrcMode.msg:12 by opp_msgtool.
Definition: CrcMode_m.h:54
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::UDP_HEADER_LENGTH
const B UDP_HEADER_LENGTH
Definition: UdpHeader_m.h:51
inet::packetReceivedFromLowerSignal
simsignal_t packetReceivedFromLowerSignal
Definition: Simsignals.cc:91
inet::Chunk::PF_ALLOW_INCORRECT
@ PF_ALLOW_INCORRECT
Definition: Chunk.h:281
inet::UDP_C_BIND
@ UDP_C_BIND
Definition: UdpControlInfo_m.h:87
inet::TcpIpChecksum::checksum
static uint16_t checksum(const void *addr, unsigned int count)
Definition: TcpIpChecksum.h:33
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::Udp::joinMulticastGroups
virtual void joinMulticastGroups(SockDesc *sd, const std::vector< L3Address > &multicastAddresses, const std::vector< int > interfaceIds)
Definition: Udp.cc:450
inet::CRC_DECLARED_CORRECT
@ CRC_DECLARED_CORRECT
Definition: CrcMode_m.h:57
inet::NO_PORT_FOUND
@ NO_PORT_FOUND
Definition: Simsignals_m.h:82
L4PortInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L4PortInd
Definition: IUdp-gates.txt:20
inet::UDP_C_SETOPTION_TTL
@ UDP_C_SETOPTION_TTL
Definition: UdpControlInfo_m.h:120
inet::Udp::unblockMulticastSources
virtual void unblockMulticastSources(SockDesc *sd, NetworkInterface *ie, L3Address multicastAddress, const std::vector< L3Address > &sourceList)
Definition: Udp.cc:570
inet::L3Address::IPv6
@ IPv6
Definition: L3Address.h:36
inet::Protocol::icmpv6
static const Protocol icmpv6
Definition: Protocol.h:72
inet::UDP_I_DATA
@ UDP_I_DATA
Definition: UdpControlInfo_m.h:157
inet::Udp::computeCrc
static uint16_t computeCrc(const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< const UdpHeader > &udpHeader, const Ptr< const Chunk > &udpData)
Definition: Udp.cc:841
inet::Udp::SockDescList
std::list< SockDesc * > SockDescList
Definition: Udp.h:104
inet::CRC_DECLARED_INCORRECT
@ CRC_DECLARED_INCORRECT
Definition: CrcMode_m.h:58
inet::Udp::bind
virtual void bind(int sockId, const L3Address &localAddr, int localPort)
Definition: Udp.cc:294
inet::Udp::numDroppedBadChecksum
int numDroppedBadChecksum
Definition: Udp.h:129
inet::UDP_C_DATA
@ UDP_C_DATA
Definition: UdpControlInfo_m.h:86
inet::ICMP_DU_PORT_UNREACHABLE
@ ICMP_DU_PORT_UNREACHABLE
Definition: IcmpHeader_m.h:189
inet::ushort
unsigned short ushort
Definition: INETDefs.h:54
inet::Udp::close
virtual void close(int sockId)
Definition: Udp.cc:871
inet::Protocol::getId
int getId() const
Definition: Protocol.h:37
inet::UDP_C_SETOPTION_MCAST_LOOP
@ UDP_C_SETOPTION_MCAST_LOOP
Definition: UdpControlInfo_m.h:125
inet::UDP_C_SETOPTION_TOS
@ UDP_C_SETOPTION_TOS
Definition: UdpControlInfo_m.h:122
inet::UDP_C_SETOPTION
@ UDP_C_SETOPTION
Definition: UdpControlInfo_m.h:89
inet::UDP_C_SETOPTION_MCAST_IFACE
@ UDP_C_SETOPTION_MCAST_IFACE
Definition: UdpControlInfo_m.h:124
inet::Udp::setMulticastOutputInterface
virtual void setMulticastOutputInterface(SockDesc *sd, int interfaceId)
Definition: Udp.cc:435
inet::MCAST_EXCLUDE_SOURCES
@ MCAST_EXCLUDE_SOURCES
Definition: NetworkInterface.h:33
inet::Udp::getEphemeralPort
virtual ushort getEphemeralPort()
Definition: Udp.cc:364
inet::packetSentToUpperSignal
simsignal_t packetSentToUpperSignal
Definition: Simsignals.cc:87
inet::Udp::connect
virtual void connect(int sockId, const L3Address &remoteAddr, int remotePort)
Definition: Udp.cc:383
inet::MCAST_INCLUDE_SOURCES
@ MCAST_INCLUDE_SOURCES
Definition: NetworkInterface.h:33
inet::Udp::socketsByPortMap
SocketsByPortMap socketsByPortMap
Definition: Udp.h:113
inet::OperationalMixin< cSimpleModule >::refreshDisplay
virtual void refreshDisplay() const override
Definition: OperationalMixinImpl.h:200
inet::registerProtocol
void registerProtocol(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a protocol primitive (PDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:83
inet::Udp::processUndeliverablePacket
virtual void processUndeliverablePacket(Packet *udpPacket)
Definition: Udp.cc:1080
inet::UDP_I_ERROR
@ UDP_I_ERROR
Definition: UdpControlInfo_m.h:158
inet::UDP_C_CLOSE
@ UDP_C_CLOSE
Definition: UdpControlInfo_m.h:90
inet::ICMPv6_DESTINATION_UNREACHABLE
@ ICMPv6_DESTINATION_UNREACHABLE
Definition: Icmpv6Header_m.h:85
inet::UDP_C_SETOPTION_DSCP
@ UDP_C_SETOPTION_DSCP
Definition: UdpControlInfo_m.h:121
inet::UDP_EXCLUDE_MCAST_SOURCES
@ UDP_EXCLUDE_MCAST_SOURCES
Definition: UdpControlInfo_m.h:1206
inet::Udp::getOrCreateSocket
virtual SockDesc * getOrCreateSocket(int sockId)
Definition: Udp.cc:398
inet::UDP_C_SETOPTION_LEAVE_MCAST_GRP
@ UDP_C_SETOPTION_LEAVE_MCAST_GRP
Definition: UdpControlInfo_m.h:128
inet::containsKey
bool containsKey(const std::map< K, V, _C > &m, const Tk &a)
Definition: stlutils.h:80
inet::UDP_C_SETOPTION_BLOCK_MCAST_SRC
@ UDP_C_SETOPTION_BLOCK_MCAST_SRC
Definition: UdpControlInfo_m.h:130
inet::Udp::findSocketsForMcastBcastPacket
virtual std::vector< SockDesc * > findSocketsForMcastBcastPacket(const L3Address &localAddr, ushort localPort, const L3Address &remoteAddr, ushort remotePort, bool isMulticast, bool isBroadcast)
Definition: Udp.cc:1049
inet::packetSentToLowerSignal
simsignal_t packetSentToLowerSignal
Definition: Simsignals.cc:90