|
INET Framework for OMNeT++/OMNEST
|
#include <ExtLowerUdp.h>
◆ ~ExtLowerUdp()
| inet::ExtLowerUdp::~ExtLowerUdp |
( |
| ) |
|
|
virtual |
30 close(it.second->socketId);
◆ bind()
| void inet::ExtLowerUdp::bind |
( |
int |
socketId, |
|
|
const L3Address & |
localAddress, |
|
|
int |
localPort |
|
) |
| |
|
protectedvirtual |
197 Socket *socket =
nullptr;
200 socket =
open(socketId);
203 struct sockaddr_in sockaddr;
204 sockaddr.sin_family = PF_INET;
205 sockaddr.sin_port =
htons(localPort);
206 sockaddr.sin_addr.s_addr =
htonl(localAddress.toIpv4().getInt());
207 #if !defined(linux) && !defined(__linux) && !defined(_WIN32)
208 sockaddr.sin_len =
sizeof(
struct sockaddr_in);
210 int n =
::bind(socket->fd, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
212 throw cRuntimeError(
"Cannot bind socket: %d", n);
Referenced by handleMessage().
◆ close()
| void inet::ExtLowerUdp::close |
( |
int |
socketId | ) |
|
|
protectedvirtual |
◆ connect()
| void inet::ExtLowerUdp::connect |
( |
int |
socketId, |
|
|
const L3Address & |
remoteAddress, |
|
|
int |
remotePort |
|
) |
| |
|
protectedvirtual |
217 Socket *socket =
nullptr;
220 socket =
open(socketId);
223 struct sockaddr_in sockaddr;
224 sockaddr.sin_family = PF_INET;
225 sockaddr.sin_port =
htons(remotePort);
226 sockaddr.sin_addr.s_addr =
htonl(remoteAddress.toIpv4().getInt());
227 #if !defined(linux) && !defined(__linux) && !defined(_WIN32)
228 sockaddr.sin_len =
sizeof(
struct sockaddr_in);
230 int n =
::connect(socket->fd, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
232 throw cRuntimeError(
"Cannot connect socket: %d", n);
Referenced by handleMessage().
◆ handleMessage()
| void inet::ExtLowerUdp::handleMessage |
( |
cMessage * |
message | ) |
|
|
overrideprotectedvirtual |
50 switch (message->getKind()) {
52 int socketId = check_and_cast<Request *>(message)->getTag<SocketReq>()->getSocketId();
53 UdpBindCommand *
ctrl = check_and_cast<UdpBindCommand *>(message->getControlInfo());
54 bind(socketId,
ctrl->getLocalAddr(),
ctrl->getLocalPort());
59 int socketId = check_and_cast<Request *>(message)->getTag<SocketReq>()->getSocketId();
60 UdpConnectCommand *
ctrl = check_and_cast<UdpConnectCommand *>(message->getControlInfo());
66 int socketId = check_and_cast<Request *>(message)->getTag<SocketReq>()->getSocketId();
77 throw cRuntimeError(
"Not implemented");
150 throw cRuntimeError(
"Unknown command code (message kind) %d received from app", message->getKind());
◆ handleOperationStage()
Perform one stage of a lifecycle operation.
Processing may be done entirely within this method, or may be a longer process that involves nonzero simulation time or several events, and is triggered by this method call.
Return value: true = "done"; false = "not yet done, will invoke
doneCallback when done"
Implements inet::ILifecycle.
◆ initialize()
| void inet::ExtLowerUdp::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
36 cSimpleModule::initialize(stage);
39 if (
auto scheduler =
dynamic_cast<RealTimeScheduler *
>(getSimulation()->getScheduler())) {
◆ notify()
| bool inet::ExtLowerUdp::notify |
( |
int |
fd | ) |
|
|
overrideprotectedvirtual |
◆ numInitStages()
| virtual int inet::ExtLowerUdp::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ open()
176 NetworkNamespaceContext context(par(
"namespace"));
177 auto socket =
new Socket(socketId);
178 int fd = ::socket(AF_INET, SOCK_DGRAM, 0);
180 throw cRuntimeError(
"Cannot create socket: %d", fd);
185 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (
const char *)&enable,
sizeof(
int)) < 0)
186 throw cRuntimeError(
"ExtLowerUdp: cannot set socket option");
Referenced by bind(), and connect().
◆ processPacketFromLower()
| void inet::ExtLowerUdp::processPacketFromLower |
( |
int |
fd | ) |
|
|
protectedvirtual |
290 throw cRuntimeError(
"Unknown socket");
292 auto socket = it->second;
293 uint8_t buffer[1 << 16];
294 struct sockaddr_in sockaddr;
295 socklen_t socklen =
sizeof(sockaddr);
297 int n = ::recvfrom(fd, (
char *)buffer,
sizeof(buffer), 0, (
struct sockaddr *)&sockaddr, &socklen);
299 throw cRuntimeError(
"Calling recv failed: %d", n);
300 auto data = makeShared<BytesChunk>(
static_cast<const uint8_t *
>(buffer), n);
301 auto packet =
new Packet(
nullptr, data);
302 packet->addTag<SocketInd>()->setSocketId(socket->socketId);
303 packet->addTag<
L3AddressInd>()->setSrcAddress(Ipv4Address(
ntohl(sockaddr.sin_addr.s_addr)));
304 packet->addTag<
L4PortInd>()->setSrcPort(
ntohs(sockaddr.sin_port));
307 send(packet,
"appOut");
Referenced by notify().
◆ processPacketFromUpper()
| void inet::ExtLowerUdp::processPacketFromUpper |
( |
Packet * |
packet | ) |
|
|
protectedvirtual |
252 auto socketId = packet->getTag<SocketReq>()->getSocketId();
255 throw cRuntimeError(
"Unknown socket");
257 auto socket = it->second;
258 auto bytesChunk = packet->peekAllAsBytes();
259 uint8_t buffer[packet->getByteLength()];
260 size_t packetLength = bytesChunk->copyToBuffer(buffer, packet->getByteLength());
261 ASSERT(packetLength == (
size_t)packet->getByteLength());
262 if (
auto addressReq = packet->findTag<L3AddressReq>()) {
263 struct sockaddr_in sockaddr;
264 sockaddr.sin_family = PF_INET;
265 sockaddr.sin_port =
htons(packet->getTag<
L4PortReq>()->getDestPort());
266 sockaddr.sin_addr.s_addr =
htonl(addressReq->getDestAddress().toIpv4().getInt());
267 #if !defined(linux) && !defined(__linux) && !defined(_WIN32)
268 sockaddr.sin_len =
sizeof(
struct sockaddr_in);
271 int n = ::sendto(socket->fd, (
char *)buffer, packetLength, 0, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
273 throw cRuntimeError(
"Calling sendto failed: %d", n);
277 int n = ::send(socket->fd, (
char *)buffer, packetLength, 0);
279 throw cRuntimeError(
"Calling send failed: %d", n);
Referenced by handleMessage().
◆ fdToSocketMap
| std::map<int, Socket *> inet::ExtLowerUdp::fdToSocketMap |
|
protected |
◆ packetNameFormat
| const char* inet::ExtLowerUdp::packetNameFormat = nullptr |
|
protected |
◆ packetPrinter
◆ rtScheduler
◆ socketIdToSocketMap
| std::map<int, Socket *> inet::ExtLowerUdp::socketIdToSocketMap |
|
protected |
The documentation for this class was generated from the following files:
void removeCallback(int fd, ICallback *callback)
Definition: RealTimeScheduler.cc:50
virtual void processPacketFromLower(int fd)
Definition: ExtLowerUdp.cc:285
const char * packetNameFormat
Definition: ExtLowerUdp.h:30
@ UDP_C_CONNECT
Definition: UdpControlInfo_m.h:88
virtual Socket * open(int socketId)
Definition: ExtLowerUdp.cc:174
removed L4PortReq
Definition: IUdp-gates.txt:11
simsignal_t packetReceivedFromUpperSignal
Definition: Simsignals.cc:88
RealTimeScheduler * rtScheduler
Definition: ExtLowerUdp.h:32
virtual void connect(int socketId, const L3Address &remoteAddress, int remotePort)
Definition: ExtLowerUdp.cc:215
void addCallback(int fd, ICallback *callback)
To be called from the module which wishes to receive data from the fd.
Definition: RealTimeScheduler.cc:41
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
PacketPrinter packetPrinter
Definition: ExtLowerUdp.h:31
simsignal_t packetSentSignal
Definition: Simsignals.cc:96
void registerService(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a service primitive (SDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:14
std::map< int, Socket * > socketIdToSocketMap
Definition: ExtLowerUdp.h:33
std::map< int, Socket * > fdToSocketMap
Definition: ExtLowerUdp.h:34
removed ctrl
Definition: IUdp-gates.txt:7
simsignal_t packetReceivedSignal
Definition: Simsignals.cc:97
static const Protocol udp
Definition: Protocol.h:117
INET_API InitStage INITSTAGE_TRANSPORT_LAYER
Initialization of transport-layer protocols.
virtual std::string printPacketToString(Packet *packet, const char *format=nullptr) const
Definition: PacketPrinter.cc:223
virtual void close(int socketId)
Definition: ExtLowerUdp.cc:235
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
@ UDP_C_BIND
Definition: UdpControlInfo_m.h:87
virtual void processPacketFromUpper(Packet *packet)
Definition: ExtLowerUdp.cc:249
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L4PortInd
Definition: IUdp-gates.txt:20
#define Enter_Method(...)
Definition: SelfDoc.h:71
@ UDP_C_DATA
Definition: UdpControlInfo_m.h:86
@ UDP_C_SETOPTION
Definition: UdpControlInfo_m.h:89
simsignal_t packetSentToUpperSignal
Definition: Simsignals.cc:87
virtual void bind(int socketId, const L3Address &localAddress, int localPort)
Definition: ExtLowerUdp.cc:195
@ UDP_C_CLOSE
Definition: UdpControlInfo_m.h:90