|
INET Framework for OMNeT++/OMNEST
|
Implements the SctpServer simple module.
More...
#include <SctpServer.h>
Implements the SctpServer simple module.
See the NED file for more info.
◆ BytesPerAssoc
◆ EndToEndDelay
◆ ServerAssocStatMap
◆ ~SctpServer()
| inet::SctpServer::~SctpServer |
( |
| ) |
|
|
virtual |
◆ SctpServer()
| inet::SctpServer::SctpServer |
( |
| ) |
|
◆ finish()
| void inet::SctpServer::finish |
( |
| ) |
|
|
overrideprotectedvirtual |
511 EV_INFO << getFullPath() <<
": opened " <<
numSessions <<
" sessions\n";
512 EV_INFO << getFullPath() <<
": sent " <<
bytesSent <<
" bytes in " <<
packetsSent <<
" packets\n";
514 EV_DETAIL << getFullPath() <<
" Assoc: " << elem.first <<
"\n";
515 EV_DETAIL <<
"\tstart time: " << elem.second.start <<
"\n";
516 EV_DETAIL <<
"\tstop time: " << elem.second.stop <<
"\n";
517 EV_DETAIL <<
"\tlife time: " << elem.second.lifeTime <<
"\n";
518 EV_DETAIL <<
"\treceived bytes:" << elem.second.rcvdBytes <<
"\n";
519 EV_DETAIL <<
"\tthroughput: " << (elem.second.rcvdBytes / elem.second.lifeTime.dbl()) * 8 <<
" bit/sec\n";
520 recordScalar(
"bytes rcvd", elem.second.rcvdBytes);
521 recordScalar(
"throughput", (elem.second.rcvdBytes / elem.second.lifeTime.dbl()) * 8);
523 EV_INFO << getFullPath() <<
"Over all " <<
packetsRcvd <<
" packets received\n ";
525 EV_INFO <<
"Server finished\n";
◆ generateAndSend()
| void inet::SctpServer::generateAndSend |
( |
| ) |
|
|
protected |
126 auto applicationPacket =
new Packet(
"ApplicationPacket");
127 auto applicationData = makeShared<BytesChunk>();
128 int numBytes = par(
"requestLength");
129 std::vector<uint8_t> vec;
130 vec.resize(numBytes);
131 for (
int i = 0; i < numBytes; i++)
133 applicationData->setBytes(vec);
134 applicationData->addTag<CreationTimeTag>()->setCreationTime(simTime());
135 applicationPacket->insertAtBack(applicationData);
136 auto sctpSendReq = applicationPacket->addTag<SctpSendReq>();
138 sctpSendReq->setLast(
false);
140 sctpSendReq->setLast(
true);
141 sctpSendReq->setPrMethod(par(
"prMethod"));
142 sctpSendReq->setPrValue(par(
"prValue"));
145 sctpSendReq->setSocketId(
assocId);
147 applicationPacket->addTag<SocketReq>()->setSocketId(
assocId);
Referenced by handleMessage(), and handleTimer().
◆ handleMessage()
| void inet::SctpServer::handleMessage |
( |
cMessage * |
msg | ) |
|
|
overrideprotectedvirtual |
192 EV_INFO <<
"SctpServer::handleMessage\n";
193 if (msg->isSelfMessage())
196 switch (msg->getKind()) {
199 Message *message = check_and_cast<Message *>(msg);
200 assocId = message->getTag<SocketInd>()->getSocketId();
201 const auto& command = message->findTag<SctpCommandReq>();
203 if (par(
"numPacketsToReceivePerClient").intValue() == 0) {
225 EV_INFO <<
"SCTP_I_AVAILABLE arrived at server\n";
226 Message *message = check_and_cast<Message *>(msg);
227 int newSockId = message->getTag<SctpAvailableReq>()->getNewSocketId();
228 EV_INFO <<
"new socket id = " << newSockId << endl;
230 cmsg->addTag<SctpAvailableReq>()->setSocketId(newSockId);
232 cmsg->addTag<SocketReq>()->setSocketId(newSockId);
233 EV_INFO <<
"Sending accept socket id request ..." << endl;
235 send(cmsg,
"socketOut");
240 Message *message = check_and_cast<Message *>(msg);
241 auto& connectInfo = message->getTag<SctpConnectReq>();
243 assocId = connectInfo->getSocketId();
255 sprintf(text,
"App: Received Bytes of assoc %d",
assocId);
257 sprintf(text,
"App: EndToEndDelay of assoc %d",
assocId);
261 if (par(
"numPacketsToSendPerClient").intValue() > 0) {
264 if (par(
"thinkTime").doubleValue() > 0) {
287 auto& qinfo = cmsg->addTag<SctpInfoReq>();
289 qinfo->setSocketId(
id);
293 if (j->second.rcvdPackets == 0 && par(
"waitToClose").doubleValue() > 0) {
297 scheduleAfter(par(
"waitToClose"), abortMsg);
300 EV_INFO <<
"no more packets to send, call shutdown for assoc " <<
assocId <<
"\n";
302 auto& cmd = cmsg->addTag<SctpCommandReq>();
323 scheduleAfter(par(
"readingInterval"),
delayTimer);
332 EV_INFO << simTime() <<
" makeReceiveRequest\n";
343 EV_INFO << simTime() <<
" server: data arrived. " <<
packetsRcvd <<
" Packets received now\n";
344 Packet *message = check_and_cast<Packet *>(msg);
345 auto&
tags = message->getTags();
346 const auto& ind =
tags.findTag<SctpRcvReq>();
347 id = ind->getSocketId();
350 if (j->second.rcvdBytes == 0)
351 j->second.start = simTime();
353 j->second.rcvdBytes +=
PK(msg)->getByteLength();
354 k->second->record(j->second.rcvdBytes);
357 if (par(
"numPacketsToReceivePerClient").intValue() > 0) {
358 j->second.rcvdPackets--;
361 for (
auto& region : message->peekData()->getAllTags<CreationTimeTag>())
362 m->second->record(simTime() - region.getTag()->getCreationTime());
364 EV_INFO <<
"server: Data received. Left packets to receive=" << j->second.rcvdPackets <<
"\n";
366 if (j->second.rcvdPackets == 0) {
370 j->second.stop = simTime();
371 j->second.lifeTime = j->second.stop - j->second.start;
376 auto& qinfo = cmsg->addTag<SctpCommandReq>();
377 qinfo->setSocketId(
id);
379 j->second.stop = simTime();
380 j->second.lifeTime = j->second.stop - j->second.start;
387 const auto& smsg = message->peekData();
389 for (
auto& region : smsg->getAllTags<CreationTimeTag>())
390 m->second->record(simTime() - region.getTag()->getCreationTime());
392 auto cmsg =
new Packet(
"ApplicationPacket");
393 cmsg->insertAtBack(smsg);
394 auto cmd = cmsg->addTag<SctpSendReq>();
397 cmd->setSocketId(
id);
410 Message *message = check_and_cast<Message *>(msg);
411 id = message->getTag<SocketInd>()->getSocketId();
412 EV_INFO <<
"server: SCTP_I_SHUTDOWN_RECEIVED for assoc " <<
id <<
"\n";
414 if (i->second.sentPackets == 0 || par(
"numPacketsToSendPerClient").intValue() == 0) {
416 auto& qinfo = cmsg->addTag<SctpCommandReq>();
417 qinfo->setSocketId(
id);
419 i->second.stop = simTime();
420 i->second.lifeTime = i->second.stop - i->second.start;
429 EV_INFO <<
"Streams have been resetted\n";
435 Message *message = check_and_cast<Message *>(msg);
436 id = message->getTag<SocketInd>()->getSocketId();
437 EV_INFO <<
"server: SCTP_I_CLOSED for assoc " <<
id << endl;
439 i->second.stop = simTime();
440 i->second.lifeTime = i->second.stop - i->second.start;
◆ handleTimer()
| void inet::SctpServer::handleTimer |
( |
cMessage * |
msg | ) |
|
|
protected |
461 scheduleAfter(par(
"readingInterval"),
delayTimer);
468 simtime_t tempInterval = par(
"readingInterval");
475 switch (msg->getKind()) {
479 if (par(
"thinkTime").doubleValue() > 0)
486 Request *cmsg =
new Request(
"SCTP_C_CLOSE",
SCTP_C_CLOSE);
487 auto& cmd = cmsg->addTag<SctpCommandReq>();
488 int id = atoi(msg->getName());
489 cmd->setSocketId(
id);
495 EV_INFO << simTime() <<
" SctpServer:SCTP_C_RECEIVE\n";
504 EV_INFO <<
"MsgKind =" << msg->getKind() <<
" unknown\n";
Referenced by handleMessage().
◆ initialize()
| void inet::SctpServer::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
32 EV_DEBUG <<
"initialize SCTP Server stage " << stage << endl;
34 cSimpleModule::initialize(stage);
56 delay = par(
"echoDelay");
58 cPar *delT = &par(
"readingInterval");
59 if (delT->isNumeric() && delT->doubleValue() == 0)
65 const char *addressesString = par(
"localAddress");
66 AddressVector addresses = L3AddressResolver().resolve(cStringTokenizer(addressesString).asVector());
67 int port = par(
"localPort");
68 int messagesToPush = par(
"messagesToPush");
75 if (addresses.size() == 0)
80 socket->
listen(
true, par(
"streamReset"), par(
"numPacketsToSendPerClient"), messagesToPush);
81 EV_INFO <<
"SctpServer::initialized listen port=" << port <<
"\n";
82 cStringTokenizer tokenizer(par(
"streamPriorities"));
83 for (
unsigned int streamNum = 0; tokenizer.hasMoreTokens(); streamNum++) {
84 const char *token = tokenizer.nextToken();
89 NodeStatus *nodeStatus = node ? check_and_cast_nullable<NodeStatus *>(node->getSubmodule(
"status")) : nullptr;
90 bool isOperational = (!nodeStatus) || nodeStatus->getState() ==
NodeStatus::UP;
92 throw cRuntimeError(
"This module doesn't support starting in node DOWN state");
◆ makeAbortNotification()
179 Request *cmsg =
new Request(
"SCTP_C_ABORT",
SCTP_C_ABORT);
180 auto& cmd = cmsg->addTag<SctpSendReq>();
183 cmd->setSid(msg->getSid());
184 cmd->setNumMsgs(msg->getNumMsgs());
Referenced by handleMessage().
◆ makeDefaultReceive()
| Message * inet::SctpServer::makeDefaultReceive |
( |
| ) |
|
|
protected |
170 auto& cmd = cmsg->addTag<SctpCommandReq>();
Referenced by handleTimer().
◆ makeReceiveRequest()
| Message * inet::SctpServer::makeReceiveRequest |
( |
cMessage * |
msg | ) |
|
|
protected |
156 Message *message = check_and_cast<Message *>(msg);
157 auto& intags = message->getTags();
158 const auto& ind = intags.findTag<SctpCommandReq>();
160 auto cmd = cmsg->addTag<SctpSendReq>();
161 cmd->setSocketId(ind->getSocketId());
162 cmd->setSid(ind->getSid());
163 cmd->setNumMsgs(ind->getNumMsgs());
Referenced by handleMessage().
◆ numInitStages()
| virtual int inet::SctpServer::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ sendOrSchedule() [1/3]
| void inet::SctpServer::sendOrSchedule |
( |
cMessage * |
msg | ) |
|
|
protected |
◆ sendOrSchedule() [2/3]
| void inet::SctpServer::sendOrSchedule |
( |
Message * |
msg | ) |
|
|
protected |
107 msg->addTagIfAbsent<SocketReq>()->setSocketId(
assocId);
109 send(msg,
"socketOut");
111 scheduleAfter(
delay, msg);
◆ sendOrSchedule() [3/3]
| void inet::SctpServer::sendOrSchedule |
( |
Packet * |
pkt | ) |
|
|
protected |
117 pkt->addTagIfAbsent<SocketReq>()->setSocketId(
assocId);
119 send(pkt,
"socketOut");
121 scheduleAfter(
delay, pkt);
◆ abortSent
| bool inet::SctpServer::abortSent |
|
protected |
◆ assocId
| int inet::SctpServer::assocId |
|
protected |
◆ bytesPerAssoc
◆ bytesSent
| unsigned long int inet::SctpServer::bytesSent |
|
protected |
◆ count
| int inet::SctpServer::count |
|
protected |
◆ delay
| double inet::SctpServer::delay |
|
protected |
◆ delayFirstRead
| double inet::SctpServer::delayFirstRead |
|
protected |
◆ delayFirstReadTimer
| cMessage* inet::SctpServer::delayFirstReadTimer |
|
protected |
◆ delayTimer
| cMessage* inet::SctpServer::delayTimer |
|
protected |
◆ echo
| bool inet::SctpServer::echo |
|
protected |
◆ endToEndDelay
◆ finishEndsSimulation
| bool inet::SctpServer::finishEndsSimulation |
|
protected |
◆ firstData
| bool inet::SctpServer::firstData |
|
protected |
◆ inboundStreams
| int inet::SctpServer::inboundStreams |
|
protected |
◆ lastStream
| int inet::SctpServer::lastStream |
|
protected |
◆ notificationsReceived
| int inet::SctpServer::notificationsReceived |
|
protected |
◆ numRequestsToSend
| unsigned long int inet::SctpServer::numRequestsToSend |
|
protected |
◆ numSessions
| int inet::SctpServer::numSessions |
|
protected |
◆ ordered
| bool inet::SctpServer::ordered |
|
protected |
◆ outboundStreams
| int inet::SctpServer::outboundStreams |
|
protected |
◆ packetsRcvd
| unsigned long int inet::SctpServer::packetsRcvd |
|
protected |
◆ packetsSent
| unsigned long int inet::SctpServer::packetsSent |
|
protected |
◆ queueSize
| int inet::SctpServer::queueSize |
|
protected |
◆ readInt
| bool inet::SctpServer::readInt |
|
protected |
◆ schedule
| bool inet::SctpServer::schedule |
|
protected |
◆ serverAssocStatMap
◆ shutdownReceived
| bool inet::SctpServer::shutdownReceived |
|
protected |
◆ socket
◆ timeoutMsg
| cMessage* inet::SctpServer::timeoutMsg |
|
protected |
The documentation for this class was generated from the following files:
@ SCTP_I_RCV_STREAMS_RESETTED
Definition: SctpCommand_m.h:214
cModule * findContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:31
BytesPerAssoc bytesPerAssoc
Definition: SctpServer.h:71
@ SCTP_C_SEND_UNORDERED
Definition: SctpCommand_m.h:138
int inboundStreams
Definition: SctpServer.h:40
void setStreamPriority(uint32_t stream, uint32_t priority)
Definition: SctpSocket.cc:620
std::vector< L3Address > AddressVector
Definition: SctpCommand_m.h:70
void setOutputGate(cGate *toSctp)
Sets the gate on which to send to SCTP.
Definition: SctpSocket.h:174
bool finishEndsSimulation
Definition: SctpServer.h:45
void generateAndSend()
Definition: SctpServer.cc:124
EndToEndDelay endToEndDelay
Definition: SctpServer.h:61
@ SCTP_I_CLOSED
Definition: SctpCommand_m.h:201
bool shutdownReceived
Definition: SctpServer.h:59
ServerAssocStatMap serverAssocStatMap
Definition: SctpServer.h:72
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
@ SCTP_C_SEND
Definition: SctpCommand_m.h:132
@ SCTP_C_SHUTDOWN
Definition: SctpCommand_m.h:142
@ SCTP_I_SEND_STREAMS_RESETTED
Definition: SctpCommand_m.h:213
int outboundStreams
Definition: SctpServer.h:41
@ SCTP_C_ACCEPT_SOCKET_ID
Definition: SctpCommand_m.h:153
unsigned long int packetsRcvd
Definition: SctpServer.h:69
int queueSize
Definition: SctpServer.h:42
void sendOrSchedule(cMessage *msg)
Definition: SctpServer.cc:96
@ SCTP_C_RECEIVE
Definition: SctpCommand_m.h:136
@ SCTP_I_DATA
Definition: SctpCommand_m.h:197
@ SCTP_C_ABORT
Definition: SctpCommand_m.h:134
unsigned long int numRequestsToSend
Definition: SctpServer.h:70
double delay
Definition: SctpServer.h:43
double delayFirstRead
Definition: SctpServer.h:44
@ SCTP_I_ESTABLISHED
Definition: SctpCommand_m.h:199
intscale< b, 1, 8 > B
Definition: Units.h:1168
void listen(bool fork=true, bool streamReset=false, uint32_t requests=0, uint32_t messagesToPush=0)
Initiates passive OPEN.
Definition: SctpSocket.cc:183
@ SCTP_C_SEND_ORDERED
Definition: SctpCommand_m.h:137
void setOutboundStreams(int streams)
Setter and getter methods for socket and API Parameters.
Definition: SctpSocket.h:179
int notificationsReceived
Definition: SctpServer.h:66
@ SCTP_I_SHUTDOWN_RECEIVED
Definition: SctpCommand_m.h:209
int numSessions
Definition: SctpServer.h:64
@ SCTP_C_NO_OUTSTANDING
Definition: SctpCommand_m.h:143
bool ordered
Definition: SctpServer.h:47
@ SCTP_I_PEER_CLOSED
Definition: SctpCommand_m.h:200
SctpSocket * socket
Definition: SctpServer.h:50
cMessage * timeoutMsg
Definition: SctpServer.h:51
cMessage * delayFirstReadTimer
Definition: SctpServer.h:53
@ SCTP_C_QUEUE_MSGS_LIMIT
Definition: SctpCommand_m.h:141
Message * makeAbortNotification(const SctpCommandReq *msg)
Definition: SctpServer.cc:177
unsigned long int bytesSent
Definition: SctpServer.h:67
void bindx(AddressVector localAddr, int localPort)
Definition: SctpSocket.cc:171
bool abortSent
Definition: SctpServer.h:60
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
@ SCTP_I_DATA_NOTIFICATION
Definition: SctpCommand_m.h:198
const double k
Definition: Qam1024Modulation.cc:14
#define PK(msg)
Definition: INETDefs.h:89
unsigned long int packetsSent
Definition: SctpServer.h:68
INET_API InitStage INITSTAGE_APPLICATION_LAYER
Initialization of applications.
@ SCTP_I_ABORT
Definition: SctpCommand_m.h:206
@ UP
Definition: NodeStatus.h:28
static const Protocol sctp
Definition: Protocol.h:108
* tags
Definition: IUdp-gates.txt:3
int lastStream
Definition: SctpServer.h:54
Message * makeReceiveRequest(cMessage *msg)
Definition: SctpServer.cc:154
int count
Definition: SctpServer.h:65
bool echo
Definition: SctpServer.h:46
bool firstData
Definition: SctpServer.h:58
value< double, units::m > m
Definition: Units.h:1233
int assocId
Definition: SctpServer.h:55
cMessage * delayTimer
Definition: SctpServer.h:52
void bind(int localPort)
Bind the socket to a local port number.
Definition: SctpSocket.cc:142
bool schedule
Definition: SctpServer.h:57
@ SCTP_C_CLOSE
Definition: SctpCommand_m.h:133
void setInboundStreams(int streams)
Definition: SctpSocket.h:180
bool readInt
Definition: SctpServer.h:56
Message * makeDefaultReceive()
Definition: SctpServer.cc:167
@ SCTP_I_AVAILABLE
Definition: SctpCommand_m.h:218
void handleTimer(cMessage *msg)
Definition: SctpServer.cc:456