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

Implements the SctpServer simple module. More...

#include <SctpServer.h>

Inheritance diagram for inet::SctpServer:
inet::LifecycleUnsupported inet::ILifecycle

Classes

struct  ServerAssocStat
 

Public Member Functions

virtual ~SctpServer ()
 
 SctpServer ()
 
- Public Member Functions inherited from inet::LifecycleUnsupported
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 

Protected Types

typedef std::map< int, ServerAssocStatServerAssocStatMap
 
typedef std::map< int, cOutVector * > BytesPerAssoc
 
typedef std::map< int, cOutVector * > EndToEndDelay
 

Protected Member Functions

virtual void initialize (int stage) override
 
virtual int numInitStages () const override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void finish () override
 
void handleTimer (cMessage *msg)
 
void sendOrSchedule (cMessage *msg)
 
void sendOrSchedule (Message *msg)
 
void sendOrSchedule (Packet *pkt)
 
MessagemakeAbortNotification (const SctpCommandReq *msg)
 
MessagemakeReceiveRequest (cMessage *msg)
 
MessagemakeDefaultReceive ()
 
void generateAndSend ()
 

Protected Attributes

int inboundStreams
 
int outboundStreams
 
int queueSize
 
double delay
 
double delayFirstRead
 
bool finishEndsSimulation
 
bool echo
 
bool ordered
 
SctpSocketsocket
 
cMessage * timeoutMsg
 
cMessage * delayTimer
 
cMessage * delayFirstReadTimer
 
int lastStream
 
int assocId
 
bool readInt
 
bool schedule
 
bool firstData
 
bool shutdownReceived
 
bool abortSent
 
EndToEndDelay endToEndDelay
 
int numSessions
 
int count
 
int notificationsReceived
 
unsigned long int bytesSent
 
unsigned long int packetsSent
 
unsigned long int packetsRcvd
 
unsigned long int numRequestsToSend
 
BytesPerAssoc bytesPerAssoc
 
ServerAssocStatMap serverAssocStatMap
 

Detailed Description

Implements the SctpServer simple module.

See the NED file for more info.

Member Typedef Documentation

◆ BytesPerAssoc

typedef std::map<int, cOutVector *> inet::SctpServer::BytesPerAssoc
protected

◆ EndToEndDelay

typedef std::map<int, cOutVector *> inet::SctpServer::EndToEndDelay
protected

◆ ServerAssocStatMap

typedef std::map<int, ServerAssocStat> inet::SctpServer::ServerAssocStatMap
protected

Constructor & Destructor Documentation

◆ ~SctpServer()

inet::SctpServer::~SctpServer ( )
virtual
529 {
530  for (auto& elem : bytesPerAssoc)
531  delete elem.second;
532 
533  for (auto& elem : endToEndDelay)
534  delete elem.second;
535 
536  bytesPerAssoc.clear();
537  endToEndDelay.clear();
538  serverAssocStatMap.clear();
539  delete socket;
540  cancelAndDelete(timeoutMsg);
541  cancelAndDelete(delayTimer);
542  cancelAndDelete(delayFirstReadTimer);
543 }

◆ SctpServer()

inet::SctpServer::SctpServer ( )
546 {
547  timeoutMsg = nullptr;
548  socket = nullptr;
549  delayFirstReadTimer = nullptr;
550  delayTimer = nullptr;
551  numSessions = 0;
552  packetsSent = 0;
553  packetsRcvd = 0;
554  bytesSent = 0;
556  inboundStreams = 17;
557  outboundStreams = 1;
558  queueSize = 0;
559  delay = 0;
560  delayFirstRead = 0;
561  finishEndsSimulation = true;
562  echo = false;
563  ordered = true;
564  lastStream = 0;
565  assocId = 0;
566  readInt = false;
567  schedule = false;
568  firstData = true;
569  shutdownReceived = false;
570  abortSent = false;
571  count = 0;
572  numRequestsToSend = 0;
573 }

Member Function Documentation

◆ finish()

void inet::SctpServer::finish ( )
overrideprotectedvirtual
510 {
511  EV_INFO << getFullPath() << ": opened " << numSessions << " sessions\n";
512  EV_INFO << getFullPath() << ": sent " << bytesSent << " bytes in " << packetsSent << " packets\n";
513  for (auto& elem : serverAssocStatMap) {
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);
522  }
523  EV_INFO << getFullPath() << "Over all " << packetsRcvd << " packets received\n ";
524  EV_INFO << getFullPath() << "Over all " << notificationsReceived << " notifications received\n ";
525  EV_INFO << "Server finished\n";
526 }

◆ generateAndSend()

void inet::SctpServer::generateAndSend ( )
protected
125 {
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++)
132  vec[i] = (bytesSent + i) & 0xFF;
133  applicationData->setBytes(vec);
134  applicationData->addTag<CreationTimeTag>()->setCreationTime(simTime());
135  applicationPacket->insertAtBack(applicationData);
136  auto sctpSendReq = applicationPacket->addTag<SctpSendReq>();
137  if (queueSize > 0 && numRequestsToSend > 0 && count < queueSize * 2)
138  sctpSendReq->setLast(false);
139  else
140  sctpSendReq->setLast(true);
141  sctpSendReq->setPrMethod(par("prMethod"));
142  sctpSendReq->setPrValue(par("prValue"));
144  sctpSendReq->setSid(lastStream);
145  sctpSendReq->setSocketId(assocId);
146  applicationPacket->setKind(ordered ? SCTP_C_SEND_ORDERED : SCTP_C_SEND_UNORDERED);
147  applicationPacket->addTag<SocketReq>()->setSocketId(assocId);
148  applicationPacket->addTag<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
149  bytesSent += numBytes;
150  packetsSent++;
151  sendOrSchedule(applicationPacket);
152 }

Referenced by handleMessage(), and handleTimer().

◆ handleMessage()

void inet::SctpServer::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
189 {
190  // TODO there is another memory leak somewhere...
191  int id = 0;
192  EV_INFO << "SctpServer::handleMessage\n";
193  if (msg->isSelfMessage())
194  handleTimer(msg);
195  else {
196  switch (msg->getKind()) {
197  case SCTP_I_PEER_CLOSED:
198  case SCTP_I_ABORT: {
199  Message *message = check_and_cast<Message *>(msg);
200  assocId = message->getTag<SocketInd>()->getSocketId();
201  const auto& command = message->findTag<SctpCommandReq>();
202  serverAssocStatMap[assocId].peerClosed = true;
203  if (par("numPacketsToReceivePerClient").intValue() == 0) {
204  if (serverAssocStatMap[assocId].abortSent == false) {
205  sendOrSchedule(makeAbortNotification(command->dup()));
206  serverAssocStatMap[assocId].abortSent = true;
207  }
208  }
209  else {
210  if (serverAssocStatMap[assocId].rcvdPackets == static_cast<unsigned long int>(par("numPacketsToReceivePerClient"))
211  && serverAssocStatMap[assocId].abortSent == false)
212  {
213  sendOrSchedule(makeAbortNotification(command->dup()));
214  serverAssocStatMap[assocId].abortSent = true;
215  }
216  }
217  if (delayTimer->isScheduled())
218  cancelEvent(delayTimer);
219  if (delayFirstReadTimer->isScheduled())
220  cancelEvent(delayFirstReadTimer);
221  delete msg;
222  break;
223  }
224  case SCTP_I_AVAILABLE: {
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;
229  Request *cmsg = new Request("SCTP_C_ACCEPT_SOCKET_ID", SCTP_C_ACCEPT_SOCKET_ID);
230  cmsg->addTag<SctpAvailableReq>()->setSocketId(newSockId);
231  cmsg->addTag<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
232  cmsg->addTag<SocketReq>()->setSocketId(newSockId);
233  EV_INFO << "Sending accept socket id request ..." << endl;
234  delete msg;
235  send(cmsg, "socketOut");
236  break;
237  }
238  case SCTP_I_ESTABLISHED: {
239  count = 0;
240  Message *message = check_and_cast<Message *>(msg);
241  auto& connectInfo = message->getTag<SctpConnectReq>();
242  numSessions++;
243  assocId = connectInfo->getSocketId();
244  inboundStreams = connectInfo->getInboundStreams();
245  outboundStreams = connectInfo->getOutboundStreams();
246  serverAssocStatMap[assocId].rcvdPackets = par("numPacketsToReceivePerClient");
247  serverAssocStatMap[assocId].sentPackets = par("numPacketsToSendPerClient");
248  serverAssocStatMap[assocId].rcvdBytes = 0;
249  serverAssocStatMap[assocId].start = 0;
250  serverAssocStatMap[assocId].stop = 0;
251  serverAssocStatMap[assocId].lifeTime = 0;
252  serverAssocStatMap[assocId].abortSent = false;
253  serverAssocStatMap[assocId].peerClosed = false;
254  char text[50];
255  sprintf(text, "App: Received Bytes of assoc %d", assocId);
256  bytesPerAssoc[assocId] = new cOutVector(text);
257  sprintf(text, "App: EndToEndDelay of assoc %d", assocId);
258  endToEndDelay[assocId] = new cOutVector(text);
259 
260  delete msg;
261  if (par("numPacketsToSendPerClient").intValue() > 0) {
262  auto i = serverAssocStatMap.find(assocId);
263  numRequestsToSend = i->second.sentPackets;
264  if (par("thinkTime").doubleValue() > 0) {
265  generateAndSend();
266  timeoutMsg->setKind(SCTP_C_SEND);
267  scheduleAfter(par("thinkTime"), timeoutMsg);
269  i->second.sentPackets = numRequestsToSend;
270  }
271  else {
272  if (queueSize == 0) {
273  while (numRequestsToSend > 0) {
274  generateAndSend();
276  i->second.sentPackets = numRequestsToSend;
277  }
278  }
279  else if (queueSize > 0) {
280  while (numRequestsToSend > 0 && count++ < queueSize * 2) {
281  generateAndSend();
283  i->second.sentPackets = numRequestsToSend;
284  }
285 
286  Request *cmsg = new Request("SCTP_C_QUEUE_MSGS_LIMIT", SCTP_C_QUEUE_MSGS_LIMIT);
287  auto& qinfo = cmsg->addTag<SctpInfoReq>();
288  qinfo->setText(queueSize);
289  qinfo->setSocketId(id);
290  sendOrSchedule(cmsg);
291  }
292  auto j = serverAssocStatMap.find(assocId);
293  if (j->second.rcvdPackets == 0 && par("waitToClose").doubleValue() > 0) {
294  char as[5];
295  sprintf(as, "%d", assocId);
296  cMessage *abortMsg = new cMessage(as, SCTP_I_ABORT);
297  scheduleAfter(par("waitToClose"), abortMsg);
298  }
299  else {
300  EV_INFO << "no more packets to send, call shutdown for assoc " << assocId << "\n";
301  Request *cmsg = new Request("ShutdownRequest", SCTP_C_SHUTDOWN);
302  auto& cmd = cmsg->addTag<SctpCommandReq>();
303  cmd->setSocketId(assocId);
304  sendOrSchedule(cmsg);
305  }
306  }
307  }
308  break;
309  }
310 
313  Message *cmsg;
314  if (schedule == false) {
315  if (delayFirstRead > 0 && !delayFirstReadTimer->isScheduled()) {
316  cmsg = makeReceiveRequest(msg);
317  scheduleAfter(delayFirstRead, cmsg);
318  scheduleAfter(delayFirstRead, delayFirstReadTimer);
319  }
320  else if (readInt && firstData) {
321  firstData = false;
322  cmsg = makeReceiveRequest(msg);
323  scheduleAfter(par("readingInterval"), delayTimer);
324  sendOrSchedule(cmsg);
325  }
326  else if (delayFirstRead == 0 && readInt == false) {
327  cmsg = makeReceiveRequest(msg);
328  sendOrSchedule(cmsg);
329  }
330  }
331  else {
332  EV_INFO << simTime() << " makeReceiveRequest\n";
333  cmsg = makeReceiveRequest(msg);
334  sendOrSchedule(cmsg);
335  }
336  delete msg;
337  break;
338  }
339 
340  case SCTP_I_DATA: {
342  packetsRcvd++;
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();
348  auto j = serverAssocStatMap.find(id);
349  auto k = bytesPerAssoc.find(id);
350  if (j->second.rcvdBytes == 0)
351  j->second.start = simTime();
352 
353  j->second.rcvdBytes += PK(msg)->getByteLength();
354  k->second->record(j->second.rcvdBytes);
355 
356  if (!echo) {
357  if (par("numPacketsToReceivePerClient").intValue() > 0) {
358  j->second.rcvdPackets--;
359 
360  auto m = endToEndDelay.find(id);
361  for (auto& region : message->peekData()->getAllTags<CreationTimeTag>())
362  m->second->record(simTime() - region.getTag()->getCreationTime());
363 
364  EV_INFO << "server: Data received. Left packets to receive=" << j->second.rcvdPackets << "\n";
365 
366  if (j->second.rcvdPackets == 0) {
367  if (serverAssocStatMap[assocId].peerClosed == true && serverAssocStatMap[assocId].abortSent == false) {
369  serverAssocStatMap[assocId].abortSent = true;
370  j->second.stop = simTime();
371  j->second.lifeTime = j->second.stop - j->second.start;
372  break;
373  }
374  else {
375  Request *cmsg = new Request("SCTP_C_NO_OUTSTANDING", SCTP_C_NO_OUTSTANDING);
376  auto& qinfo = cmsg->addTag<SctpCommandReq>();
377  qinfo->setSocketId(id);
378  sendOrSchedule(cmsg);
379  j->second.stop = simTime();
380  j->second.lifeTime = j->second.stop - j->second.start;
381  }
382  }
383  }
384  }
385  else {
386  auto m = endToEndDelay.find(id);
387  const auto& smsg = message->peekData();
388 
389  for (auto& region : smsg->getAllTags<CreationTimeTag>())
390  m->second->record(simTime() - region.getTag()->getCreationTime());
391 
392  auto cmsg = new Packet("ApplicationPacket");
393  cmsg->insertAtBack(smsg);
394  auto cmd = cmsg->addTag<SctpSendReq>();
396  cmd->setLast(true);
397  cmd->setSocketId(id);
398  cmd->setPrValue(0);
399  cmd->setSid(lastStream);
400  cmsg->setKind(cmd->getSendUnordered() ? SCTP_C_SEND_UNORDERED : SCTP_C_SEND_ORDERED);
401  bytesSent += B(smsg->getChunkLength()).get();
402  packetsSent++;
403  sendOrSchedule(cmsg);
404  }
405  delete msg;
406  break;
407  }
408 
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";
413  auto i = serverAssocStatMap.find(id);
414  if (i->second.sentPackets == 0 || par("numPacketsToSendPerClient").intValue() == 0) {
415  Request *cmsg = new Request("SCTP_C_NO_OUTSTANDING", SCTP_C_NO_OUTSTANDING);
416  auto& qinfo = cmsg->addTag<SctpCommandReq>();
417  qinfo->setSocketId(id);
418  sendOrSchedule(cmsg);
419  i->second.stop = simTime();
420  i->second.lifeTime = i->second.stop - i->second.start;
421  }
422  shutdownReceived = true;
423  delete msg;
424  break;
425  }
426 
429  EV_INFO << "Streams have been resetted\n";
430  delete msg;
431  break;
432  }
433 
434  case SCTP_I_CLOSED: {
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;
438  auto i = serverAssocStatMap.find(id);
439  i->second.stop = simTime();
440  i->second.lifeTime = i->second.stop - i->second.start;
441  if (delayTimer->isScheduled())
442  cancelEvent(delayTimer);
444  endSimulation();
445  delete msg;
446  break;
447  }
448 
449  default:
450  delete msg;
451  break;
452  }
453  }
454 }

◆ handleTimer()

void inet::SctpServer::handleTimer ( cMessage *  msg)
protected
457 {
458  if (msg == delayTimer) {
459  if (delayFirstRead == 0) {
461  scheduleAfter(par("readingInterval"), delayTimer);
462  }
463  return;
464  }
465  else if (msg == delayFirstReadTimer) {
466  delayFirstRead = 0;
467  if (readInt && !delayTimer->isScheduled()) {
468  simtime_t tempInterval = par("readingInterval");
469  scheduleAfter(tempInterval, delayTimer);
470  scheduleAfter(tempInterval, makeDefaultReceive());
471  }
472  return;
473  }
474 
475  switch (msg->getKind()) {
476  case SCTP_C_SEND:
477  if (numRequestsToSend > 0) {
478  generateAndSend();
479  if (par("thinkTime").doubleValue() > 0)
480  scheduleAfter(par("thinkTime"), timeoutMsg);
482  }
483  break;
484 
485  case SCTP_I_ABORT: {
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);
490  sendOrSchedule(cmsg);
491  }
492  break;
493 
494  case SCTP_C_RECEIVE:
495  EV_INFO << simTime() << " SctpServer:SCTP_C_RECEIVE\n";
496  if (readInt || delayFirstRead > 0)
497  schedule = false;
498  else
499  schedule = true;
500  sendOrSchedule(msg);
501  break;
502 
503  default:
504  EV_INFO << "MsgKind =" << msg->getKind() << " unknown\n";
505  break;
506  }
507 }

Referenced by handleMessage().

◆ initialize()

void inet::SctpServer::initialize ( int  stage)
overrideprotectedvirtual
31 {
32  EV_DEBUG << "initialize SCTP Server stage " << stage << endl;
33 
34  cSimpleModule::initialize(stage);
35 
36  if (stage == INITSTAGE_LOCAL) {
37  WATCH(numSessions);
38  WATCH(packetsSent);
39  WATCH(packetsRcvd);
40  WATCH(bytesSent);
41  WATCH(numRequestsToSend);
42 
43  // parameters
44  finishEndsSimulation = par("finishEndsSimulation");
45 
46  inboundStreams = par("inboundStreams");
47  outboundStreams = par("outboundStreams");
48  ordered = par("ordered");
49  queueSize = par("queueSize");
50  timeoutMsg = new cMessage("SrvAppTimer");
51  delayTimer = new cMessage("delayTimer");
52  delayTimer->setContextPointer(this);
53  delayFirstReadTimer = new cMessage("delayFirstReadTimer");
54 
55  echo = par("echo");
56  delay = par("echoDelay");
57  delayFirstRead = par("delayFirstRead");
58  cPar *delT = &par("readingInterval");
59  if (delT->isNumeric() && delT->doubleValue() == 0) // FIXME why used the isNumeric() ?
60  readInt = false;
61  else
62  readInt = true;
63  }
64  else if (stage == INITSTAGE_APPLICATION_LAYER) {
65  const char *addressesString = par("localAddress");
66  AddressVector addresses = L3AddressResolver().resolve(cStringTokenizer(addressesString).asVector());
67  int port = par("localPort");
68  int messagesToPush = par("messagesToPush");
69 
70  socket = new SctpSocket();
71  socket->setOutputGate(gate("socketOut"));
74 
75  if (addresses.size() == 0)
76  socket->bind(port);
77  else
78  socket->bindx(addresses, port);
79 
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();
85  socket->setStreamPriority(streamNum, (unsigned int)atoi(token));
86  }
87 
88  cModule *node = findContainingNode(this);
89  NodeStatus *nodeStatus = node ? check_and_cast_nullable<NodeStatus *>(node->getSubmodule("status")) : nullptr;
90  bool isOperational = (!nodeStatus) || nodeStatus->getState() == NodeStatus::UP;
91  if (!isOperational)
92  throw cRuntimeError("This module doesn't support starting in node DOWN state");
93  }
94 }

◆ makeAbortNotification()

Message * inet::SctpServer::makeAbortNotification ( const SctpCommandReq msg)
protected
178 {
179  Request *cmsg = new Request("SCTP_C_ABORT", SCTP_C_ABORT);
180  auto& cmd = cmsg->addTag<SctpSendReq>();
181  assocId = msg->getSocketId();
182  cmd->setSocketId(assocId);
183  cmd->setSid(msg->getSid());
184  cmd->setNumMsgs(msg->getNumMsgs());
185  return cmsg;
186 }

Referenced by handleMessage().

◆ makeDefaultReceive()

Message * inet::SctpServer::makeDefaultReceive ( )
protected
168 {
169  Request *cmsg = new Request("DefaultReceive", SCTP_C_RECEIVE);
170  auto& cmd = cmsg->addTag<SctpCommandReq>();
171  cmd->setSocketId(assocId);
172  cmd->setSid(0);
173  cmd->setNumMsgs(1);
174  return cmsg;
175 }

Referenced by handleTimer().

◆ makeReceiveRequest()

Message * inet::SctpServer::makeReceiveRequest ( cMessage *  msg)
protected
155 {
156  Message *message = check_and_cast<Message *>(msg);
157  auto& intags = message->getTags();
158  const auto& ind = intags.findTag<SctpCommandReq>();
159  Request *cmsg = new Request("ReceiveRequest", SCTP_C_RECEIVE);
160  auto cmd = cmsg->addTag<SctpSendReq>();
161  cmd->setSocketId(ind->getSocketId());
162  cmd->setSid(ind->getSid());
163  cmd->setNumMsgs(ind->getNumMsgs());
164  return cmsg;
165 }

Referenced by handleMessage().

◆ numInitStages()

virtual int inet::SctpServer::numInitStages ( ) const
inlineoverrideprotectedvirtual
76 { return NUM_INIT_STAGES; }

◆ sendOrSchedule() [1/3]

void inet::SctpServer::sendOrSchedule ( cMessage *  msg)
protected
97 {
98  if (delay == 0)
99  send(msg, "socketOut");
100  else
101  scheduleAfter(delay, msg);
102 }

Referenced by generateAndSend(), handleMessage(), and handleTimer().

◆ sendOrSchedule() [2/3]

void inet::SctpServer::sendOrSchedule ( Message msg)
protected
105 {
106  msg->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
107  msg->addTagIfAbsent<SocketReq>()->setSocketId(assocId);
108  if (delay == 0)
109  send(msg, "socketOut");
110  else
111  scheduleAfter(delay, msg);
112 }

◆ sendOrSchedule() [3/3]

void inet::SctpServer::sendOrSchedule ( Packet pkt)
protected
115 {
116  pkt->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
117  pkt->addTagIfAbsent<SocketReq>()->setSocketId(assocId);
118  if (delay == 0)
119  send(pkt, "socketOut");
120  else
121  scheduleAfter(delay, pkt);
122 }

Member Data Documentation

◆ abortSent

bool inet::SctpServer::abortSent
protected

Referenced by handleMessage(), and SctpServer().

◆ assocId

int inet::SctpServer::assocId
protected

◆ bytesPerAssoc

BytesPerAssoc inet::SctpServer::bytesPerAssoc
protected

Referenced by handleMessage(), and ~SctpServer().

◆ 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

EndToEndDelay inet::SctpServer::endToEndDelay
protected

Referenced by handleMessage(), and ~SctpServer().

◆ finishEndsSimulation

bool inet::SctpServer::finishEndsSimulation
protected

◆ firstData

bool inet::SctpServer::firstData
protected

Referenced by handleMessage(), and SctpServer().

◆ inboundStreams

int inet::SctpServer::inboundStreams
protected

◆ lastStream

int inet::SctpServer::lastStream
protected

◆ notificationsReceived

int inet::SctpServer::notificationsReceived
protected

Referenced by finish(), handleMessage(), and SctpServer().

◆ 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

ServerAssocStatMap inet::SctpServer::serverAssocStatMap
protected

Referenced by finish(), handleMessage(), and ~SctpServer().

◆ shutdownReceived

bool inet::SctpServer::shutdownReceived
protected

Referenced by handleMessage(), and SctpServer().

◆ socket

SctpSocket* inet::SctpServer::socket
protected

Referenced by initialize(), SctpServer(), and ~SctpServer().

◆ timeoutMsg

cMessage* inet::SctpServer::timeoutMsg
protected

The documentation for this class was generated from the following files:
inet::SCTP_I_RCV_STREAMS_RESETTED
@ SCTP_I_RCV_STREAMS_RESETTED
Definition: SctpCommand_m.h:214
inet::findContainingNode
cModule * findContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:31
inet::SctpServer::bytesPerAssoc
BytesPerAssoc bytesPerAssoc
Definition: SctpServer.h:71
inet::SCTP_C_SEND_UNORDERED
@ SCTP_C_SEND_UNORDERED
Definition: SctpCommand_m.h:138
inet::SctpServer::inboundStreams
int inboundStreams
Definition: SctpServer.h:40
inet::SctpSocket::setStreamPriority
void setStreamPriority(uint32_t stream, uint32_t priority)
Definition: SctpSocket.cc:620
inet::AddressVector
std::vector< L3Address > AddressVector
Definition: SctpCommand_m.h:70
inet::SctpSocket::setOutputGate
void setOutputGate(cGate *toSctp)
Sets the gate on which to send to SCTP.
Definition: SctpSocket.h:174
inet::SctpServer::finishEndsSimulation
bool finishEndsSimulation
Definition: SctpServer.h:45
inet::SctpServer::generateAndSend
void generateAndSend()
Definition: SctpServer.cc:124
inet::SctpServer::endToEndDelay
EndToEndDelay endToEndDelay
Definition: SctpServer.h:61
inet::SCTP_I_CLOSED
@ SCTP_I_CLOSED
Definition: SctpCommand_m.h:201
inet::SctpServer::shutdownReceived
bool shutdownReceived
Definition: SctpServer.h:59
inet::SctpServer::serverAssocStatMap
ServerAssocStatMap serverAssocStatMap
Definition: SctpServer.h:72
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
inet::SCTP_C_SEND
@ SCTP_C_SEND
Definition: SctpCommand_m.h:132
inet::SCTP_C_SHUTDOWN
@ SCTP_C_SHUTDOWN
Definition: SctpCommand_m.h:142
inet::SCTP_I_SEND_STREAMS_RESETTED
@ SCTP_I_SEND_STREAMS_RESETTED
Definition: SctpCommand_m.h:213
inet::SctpServer::outboundStreams
int outboundStreams
Definition: SctpServer.h:41
inet::SCTP_C_ACCEPT_SOCKET_ID
@ SCTP_C_ACCEPT_SOCKET_ID
Definition: SctpCommand_m.h:153
inet::SctpServer::packetsRcvd
unsigned long int packetsRcvd
Definition: SctpServer.h:69
inet::SctpServer::queueSize
int queueSize
Definition: SctpServer.h:42
inet::SctpServer::sendOrSchedule
void sendOrSchedule(cMessage *msg)
Definition: SctpServer.cc:96
inet::SCTP_C_RECEIVE
@ SCTP_C_RECEIVE
Definition: SctpCommand_m.h:136
inet::SCTP_I_DATA
@ SCTP_I_DATA
Definition: SctpCommand_m.h:197
inet::SCTP_C_ABORT
@ SCTP_C_ABORT
Definition: SctpCommand_m.h:134
inet::SctpServer::numRequestsToSend
unsigned long int numRequestsToSend
Definition: SctpServer.h:70
inet::SctpServer::delay
double delay
Definition: SctpServer.h:43
inet::SctpServer::delayFirstRead
double delayFirstRead
Definition: SctpServer.h:44
inet::SCTP_I_ESTABLISHED
@ SCTP_I_ESTABLISHED
Definition: SctpCommand_m.h:199
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::SctpSocket::listen
void listen(bool fork=true, bool streamReset=false, uint32_t requests=0, uint32_t messagesToPush=0)
Initiates passive OPEN.
Definition: SctpSocket.cc:183
inet::SCTP_C_SEND_ORDERED
@ SCTP_C_SEND_ORDERED
Definition: SctpCommand_m.h:137
inet::SctpSocket::setOutboundStreams
void setOutboundStreams(int streams)
Setter and getter methods for socket and API Parameters.
Definition: SctpSocket.h:179
inet::SctpServer::notificationsReceived
int notificationsReceived
Definition: SctpServer.h:66
inet::SCTP_I_SHUTDOWN_RECEIVED
@ SCTP_I_SHUTDOWN_RECEIVED
Definition: SctpCommand_m.h:209
inet::SctpServer::numSessions
int numSessions
Definition: SctpServer.h:64
inet::SCTP_C_NO_OUTSTANDING
@ SCTP_C_NO_OUTSTANDING
Definition: SctpCommand_m.h:143
inet::SctpServer::ordered
bool ordered
Definition: SctpServer.h:47
inet::SCTP_I_PEER_CLOSED
@ SCTP_I_PEER_CLOSED
Definition: SctpCommand_m.h:200
inet::SctpServer::socket
SctpSocket * socket
Definition: SctpServer.h:50
inet::SctpServer::timeoutMsg
cMessage * timeoutMsg
Definition: SctpServer.h:51
inet::SctpServer::delayFirstReadTimer
cMessage * delayFirstReadTimer
Definition: SctpServer.h:53
inet::SCTP_C_QUEUE_MSGS_LIMIT
@ SCTP_C_QUEUE_MSGS_LIMIT
Definition: SctpCommand_m.h:141
inet::SctpServer::makeAbortNotification
Message * makeAbortNotification(const SctpCommandReq *msg)
Definition: SctpServer.cc:177
inet::SctpServer::bytesSent
unsigned long int bytesSent
Definition: SctpServer.h:67
inet::SctpSocket::bindx
void bindx(AddressVector localAddr, int localPort)
Definition: SctpSocket.cc:171
inet::SctpServer::abortSent
bool abortSent
Definition: SctpServer.h:60
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::SCTP_I_DATA_NOTIFICATION
@ SCTP_I_DATA_NOTIFICATION
Definition: SctpCommand_m.h:198
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
PK
#define PK(msg)
Definition: INETDefs.h:89
inet::SctpServer::packetsSent
unsigned long int packetsSent
Definition: SctpServer.h:68
inet::INITSTAGE_APPLICATION_LAYER
INET_API InitStage INITSTAGE_APPLICATION_LAYER
Initialization of applications.
inet::SCTP_I_ABORT
@ SCTP_I_ABORT
Definition: SctpCommand_m.h:206
inet::NodeStatus::UP
@ UP
Definition: NodeStatus.h:28
inet::Protocol::sctp
static const Protocol sctp
Definition: Protocol.h:108
tags
* tags
Definition: IUdp-gates.txt:3
inet::SctpServer::lastStream
int lastStream
Definition: SctpServer.h:54
inet::SctpServer::makeReceiveRequest
Message * makeReceiveRequest(cMessage *msg)
Definition: SctpServer.cc:154
inet::SctpServer::count
int count
Definition: SctpServer.h:65
inet::SctpServer::echo
bool echo
Definition: SctpServer.h:46
inet::SctpServer::firstData
bool firstData
Definition: SctpServer.h:58
inet::units::values::m
value< double, units::m > m
Definition: Units.h:1233
inet::SctpServer::assocId
int assocId
Definition: SctpServer.h:55
inet::SctpServer::delayTimer
cMessage * delayTimer
Definition: SctpServer.h:52
inet::SctpSocket::bind
void bind(int localPort)
Bind the socket to a local port number.
Definition: SctpSocket.cc:142
inet::SctpServer::schedule
bool schedule
Definition: SctpServer.h:57
inet::SCTP_C_CLOSE
@ SCTP_C_CLOSE
Definition: SctpCommand_m.h:133
inet::SctpSocket::setInboundStreams
void setInboundStreams(int streams)
Definition: SctpSocket.h:180
inet::SctpServer::readInt
bool readInt
Definition: SctpServer.h:56
inet::SctpServer::makeDefaultReceive
Message * makeDefaultReceive()
Definition: SctpServer.cc:167
inet::SCTP_I_AVAILABLE
@ SCTP_I_AVAILABLE
Definition: SctpCommand_m.h:218
inet::SctpServer::handleTimer
void handleTimer(cMessage *msg)
Definition: SctpServer.cc:456