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

Accepts any number of incoming connections, and sends back whatever arrives on them. More...

#include <SctpNatPeer.h>

Inheritance diagram for inet::SctpNatPeer:
inet::SctpSocket::ICallback inet::LifecycleUnsupported inet::ILifecycle

Classes

struct  pathStatus
 

Public Types

typedef std::map< L3Address, pathStatusSctpPathStatus
 

Public Member Functions

 SctpNatPeer ()
 
virtual ~SctpNatPeer ()
 
virtual int numInitStages () const override
 
void initialize (int stage) override
 
void handleMessage (cMessage *msg) override
 
void finish () override
 
void handleTimer (cMessage *msg)
 
void generateAndSend ()
 
void connect (L3Address connectAddress, int32_t connectPort)
 
void connectx (AddressVector connectAddressList, int32_t connectPort)
 
virtual void socketAvailable (SctpSocket *socket, Indication *indication) override
 
void socketEstablished (SctpSocket *socket, unsigned long int buffer) override
 Does nothing but update statistics/status. More...
 
void socketDataArrived (SctpSocket *socket, Packet *msg, bool urgent) override
 Does nothing but update statistics/status. More...
 
void socketDataNotificationArrived (SctpSocket *socket, Message *msg) override
 
void socketPeerClosed (SctpSocket *socket) override
 Since remote SCTP closed, invokes close(). More...
 
void socketClosed (SctpSocket *socket) override
 Does nothing but update statistics/status. More...
 
void socketFailure (SctpSocket *socket, int32_t code) override
 Does nothing but update statistics/status. More...
 
void socketStatusArrived (SctpSocket *socket, SctpStatusReq *status) override
 Redefine to handle incoming SctpStatusInfo. More...
 
void msgAbandonedArrived (SctpSocket *socket) override
 
void setPrimaryPath ()
 
void sendStreamResetNotification ()
 
void sendRequestArrived (SctpSocket *socket) override
 
void sendQueueRequest ()
 
void shutdownReceivedArrived (SctpSocket *socket) override
 
void sendqueueFullArrived (SctpSocket *socket) override
 
void addressAddedArrived (SctpSocket *socket, L3Address localAddr, L3Address remoteAddr) override
 
void setStatusString (const char *s)
 
- Public Member Functions inherited from inet::SctpSocket::ICallback
virtual ~ICallback ()
 
virtual void socketOptionsArrived (SctpSocket *socket, Indication *indication)
 
virtual void socketFailure (SctpSocket *socket, int code)
 
virtual void socketDeleted (SctpSocket *socket)
 
virtual void sendqueueAbatedArrived (SctpSocket *socket, unsigned long int buffer)
 
- 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 ()
 

Public Attributes

SctpPathStatus sctpPathStatus
 

Protected Types

typedef std::map< int32_t, int64_t > RcvdPacketsPerAssoc
 
typedef std::map< int32_t, int64_t > SentPacketsPerAssoc
 
typedef std::map< int32_t, int64_t > RcvdBytesPerAssoc
 
typedef std::map< int32_t, cOutVector * > BytesPerAssoc
 
typedef std::map< int32_t, cHistogram * > HistEndToEndDelay
 
typedef std::map< int32_t, cOutVector * > EndToEndDelay
 

Protected Member Functions

void sendOrSchedule (cMessage *msg)
 
void sendRequest (bool last=true)
 

Protected Attributes

int32_t notifications
 
int32_t serverAssocId
 
SctpSocket clientSocket
 
SctpSocket peerSocket
 
SctpSocket rendezvousSocket
 
double delay
 
bool echo
 
bool schedule
 
bool shutdownReceived
 
int64_t bytesSent
 
int32_t packetsSent
 
int32_t packetsRcvd
 
int32_t numSessions
 
int32_t numRequestsToSend
 
bool ordered
 
int32_t queueSize
 
cMessage * timeoutMsg
 
cMessage * timeMsg
 
int32_t outboundStreams
 
int32_t inboundStreams
 
int32_t bytesRcvd
 
int32_t echoedBytesSent
 
int32_t lastStream
 
bool sendAllowed
 
int32_t chunksAbandoned
 
int32_t numPacketsToReceive
 
bool rendezvous
 
L3Address peerAddress
 
int32_t peerPort
 
AddressVector peerAddressList
 
AddressVector localAddressList
 
RcvdPacketsPerAssoc rcvdPacketsPerAssoc
 
SentPacketsPerAssoc sentPacketsPerAssoc
 
RcvdBytesPerAssoc rcvdBytesPerAssoc
 
BytesPerAssoc bytesPerAssoc
 
HistEndToEndDelay histEndToEndDelay
 
EndToEndDelay endToEndDelay
 

Detailed Description

Accepts any number of incoming connections, and sends back whatever arrives on them.

Member Typedef Documentation

◆ BytesPerAssoc

typedef std::map<int32_t, cOutVector *> inet::SctpNatPeer::BytesPerAssoc
protected

◆ EndToEndDelay

typedef std::map<int32_t, cOutVector *> inet::SctpNatPeer::EndToEndDelay
protected

◆ HistEndToEndDelay

typedef std::map<int32_t, cHistogram *> inet::SctpNatPeer::HistEndToEndDelay
protected

◆ RcvdBytesPerAssoc

typedef std::map<int32_t, int64_t> inet::SctpNatPeer::RcvdBytesPerAssoc
protected

◆ RcvdPacketsPerAssoc

typedef std::map<int32_t, int64_t> inet::SctpNatPeer::RcvdPacketsPerAssoc
protected

◆ SctpPathStatus

◆ SentPacketsPerAssoc

typedef std::map<int32_t, int64_t> inet::SctpNatPeer::SentPacketsPerAssoc
protected

Constructor & Destructor Documentation

◆ SctpNatPeer()

inet::SctpNatPeer::SctpNatPeer ( )
37 {
38  timeMsg = nullptr;
39  timeoutMsg = nullptr;
40  numSessions = 0;
41  packetsSent = 0;
42  packetsRcvd = 0;
43  bytesSent = 0;
44  notifications = 0;
45  serverAssocId = 0;
46  delay = 0;
47  echo = false;
48  schedule = false;
49  shutdownReceived = false;
50  sendAllowed = true;
52  ordered = true;
53  queueSize = 0;
54  outboundStreams = 1;
55  inboundStreams = 1;
56  bytesRcvd = 0;
57  echoedBytesSent = 0;
58  lastStream = 0;
59  chunksAbandoned = 0;
61  rendezvous = false;
62  peerPort = 0;
63 }

◆ ~SctpNatPeer()

inet::SctpNatPeer::~SctpNatPeer ( )
virtual
66 {
67  cancelAndDelete(timeMsg);
68  cancelAndDelete(timeoutMsg);
69 }

Member Function Documentation

◆ addressAddedArrived()

void inet::SctpNatPeer::addressAddedArrived ( SctpSocket socket,
L3Address  localAddr,
L3Address  remoteAddr 
)
overridevirtual

Reimplemented from inet::SctpSocket::ICallback.

845 {
846  EV << getFullPath() << ": addressAddedArrived for remoteAddr " << remoteAddr << "\n";
847  localAddressList.push_back(localAddr);
848  clientSocket.addAddress(localAddr);
849  if (rendezvous) {
850  uint8_t buffer[100];
851  int buflen = 16;
852  struct nat_message *nat = (struct nat_message *)(buffer);
853  nat->peer1 = par("ownName");
854  nat->peer2 = par("peerName");
855  nat->portPeer1 = par("localPort");
856  nat->portPeer2 = 0;
857  nat->numAddrPeer1 = 2;
858  nat->numAddrPeer2 = 2;
859  bool mul = par("multi");
860  if (mul == true) {
861  nat->multi = 1;
862  }
863  else {
864  nat->multi = 0;
865  }
866  nat->peer1Addresses[0] = L3Address().toIpv4().getInt();
867  nat->peer2Addresses[0] = L3Address().toIpv4().getInt();
868  nat->peer1Addresses[1] = L3Address().toIpv4().getInt();
869  nat->peer2Addresses[1] = L3Address().toIpv4().getInt();
870  buflen = ADD_PADDING(buflen + 4 * (nat->numAddrPeer1 + nat->numAddrPeer2));
871 
872  auto applicationData = makeShared<BytesChunk>(buffer, buflen);
873  applicationData->addTag<CreationTimeTag>()->setCreationTime(simTime());
874  auto applicationPacket = new Packet("ApplicationPacket", SCTP_C_SEND_ORDERED);
875  applicationPacket->insertAtBack(applicationData);
876  auto sctpSendReq = applicationPacket->addTag<SctpSendReq>();
877  sctpSendReq->setLast(true);
878  sctpSendReq->setPrMethod(0);
879  sctpSendReq->setPrValue(0);
880  sctpSendReq->setSid(0);
881  clientSocket.send(applicationPacket);
882  }
883 }

◆ connect()

void inet::SctpNatPeer::connect ( L3Address  connectAddress,
int32_t  connectPort 
)
180 {
183 
184  EV << "issuing OPEN command\n";
185  EV << "Assoc " << clientSocket.getSocketId() << "::connect to address " << connectAddress << ", port " << connectPort << "\n";
186  bool streamReset = par("streamReset");
187  clientSocket.connect(connectAddress, connectPort, streamReset, static_cast<int32_t>(par("prMethod")), static_cast<uint32_t>(par("numRequestsPerSession")));
188  numSessions++;
189 
190  if (!streamReset)
191  streamReset = false;
192  else if (streamReset == true) {
193  cMessage *cmsg = new cMessage("StreamReset", MSGKIND_RESET);
194  EV << "StreamReset Timer scheduled at " << simTime() << "\n";
195  scheduleAfter(par("streamRequestTime").doubleValue(), cmsg);
196  }
197  uint32_t streamNum = 0;
198  cStringTokenizer tokenizer(par("streamPriorities"));
199  while (tokenizer.hasMoreTokens()) {
200  const char *token = tokenizer.nextToken();
201  clientSocket.setStreamPriority(streamNum, static_cast<uint32_t>(atoi(token)));
202 
203  streamNum++;
204  }
205 }

◆ connectx()

void inet::SctpNatPeer::connectx ( AddressVector  connectAddressList,
int32_t  connectPort 
)
150 {
151  uint32_t outStreams = par("outboundStreams");
152  clientSocket.setOutboundStreams(outStreams);
153  uint32_t inStreams = par("inboundStreams");
154  clientSocket.setInboundStreams(inStreams);
155 
156  EV << "issuing OPEN command\n";
157  EV << "Assoc " << clientSocket.getSocketId() << "::connect to port " << connectPort << "\n";
158  bool streamReset = par("streamReset");
159  clientSocket.connectx(connectAddressList, connectPort, streamReset, static_cast<uint32_t>(par("prMethod")), static_cast<uint32_t>(par("numRequestsPerSession")));
160  numSessions++;
161 
162  if (!streamReset)
163  streamReset = false;
164  else if (streamReset == true) {
165  cMessage *cmsg = new cMessage("StreamReset", MSGKIND_RESET);
166  EV << "StreamReset Timer scheduled at " << simTime() << "\n";
167  scheduleAfter(par("streamRequestTime").doubleValue(), cmsg);
168  }
169  uint32_t streamNum = 0;
170  cStringTokenizer tokenizer(par("streamPriorities"));
171  while (tokenizer.hasMoreTokens()) {
172  const char *token = tokenizer.nextToken();
173  clientSocket.setStreamPriority(streamNum, static_cast<uint32_t>(atoi(token)));
174 
175  streamNum++;
176  }
177 }

◆ finish()

void inet::SctpNatPeer::finish ( )
override
886 {
887  EV << getFullPath() << ": opened " << numSessions << " sessions\n";
888  EV << getFullPath() << ": sent " << bytesSent << " bytes in " << packetsSent << " packets\n";
889  for (auto& elem : rcvdBytesPerAssoc) {
890  EV << getFullPath() << ": received " << elem.second << " bytes in assoc " << elem.first << "\n";
891  }
892  EV << getFullPath() << "Over all " << packetsRcvd << " packets received\n ";
893  EV << getFullPath() << "Over all " << notifications << " notifications received\n ";
894  for (auto& elem : bytesPerAssoc) {
895  delete elem.second;
896  }
897  bytesPerAssoc.clear();
898  for (auto& elem : endToEndDelay) {
899  delete elem.second;
900  }
901  endToEndDelay.clear();
902  for (auto& elem : histEndToEndDelay) {
903  delete elem.second;
904  }
905  histEndToEndDelay.clear();
906  rcvdPacketsPerAssoc.clear();
907  sentPacketsPerAssoc.clear();
908  rcvdBytesPerAssoc.clear();
909 }

◆ generateAndSend()

void inet::SctpNatPeer::generateAndSend ( )
122 {
123  auto applicationPacket = new Packet("ApplicationPacket");
124  auto applicationData = makeShared<BytesChunk>();
125  int numBytes = par("requestLength");
126  EV_INFO << "Send " << numBytes << " bytes of data, bytesSent = " << bytesSent << endl;
127  std::vector<uint8_t> vec;
128  vec.resize(numBytes);
129  for (int i = 0; i < numBytes; i++)
130  vec[i] = (bytesSent + i) & 0xFF;
131  applicationData->setBytes(vec);
132  applicationData->addTag<CreationTimeTag>()->setCreationTime(simTime());
133  applicationPacket->insertAtBack(applicationData);
134  auto sctpSendReq = applicationPacket->addTag<SctpSendReq>();
135  sctpSendReq->setLast(true);
136  sctpSendReq->setPrMethod(par("prMethod"));
137  sctpSendReq->setPrValue(par("prValue"));
139  sctpSendReq->setSid(lastStream);
140  sctpSendReq->setSocketId(serverAssocId);
141  applicationPacket->setKind(ordered ? SCTP_C_SEND_ORDERED : SCTP_C_SEND_UNORDERED);
142  applicationPacket->addTag<SocketReq>()->setSocketId(serverAssocId);
143  applicationPacket->addTag<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
144  bytesSent += numBytes;
145  packetsSent++;
146  clientSocket.send(applicationPacket);
147 }

◆ handleMessage()

void inet::SctpNatPeer::handleMessage ( cMessage *  msg)
override
208 {
209  int32_t id;
210 
211  if (msg->isSelfMessage()) {
212  handleTimer(msg);
213  }
214  else {
215  EV << "SctpNatPeer::handleMessage kind=" << SctpAssociation::indicationName(msg->getKind()) << " (" << msg->getKind() << ")\n";
216  switch (msg->getKind()) {
218  if (rendezvous)
220  // else
221  delete msg;
222  break;
223 
224  case SCTP_I_PEER_CLOSED:
225  case SCTP_I_ABORT: {
226  if (rendezvous)
228  else {
229  Message *message = check_and_cast<Message *>(msg);
230  auto& msgtags = message->getTags();
231  auto& command = msgtags.findTag<SctpCommandReq>();
232  Request *cmsg = new Request("SCTP_C_ABORT", SCTP_C_ABORT);
233  auto cmd = cmsg->addTag<SctpSendReq>();
234  int assocId = command->getSocketId();
235  cmsg->addTag<SocketReq>()->setSocketId(assocId);
236  cmsg->addTag<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
237  cmd->setSocketId(assocId);
238  cmd->setSid(command->getSid());
239  cmd->setNumMsgs(command->getNumMsgs());
240  delete msg;
241  sendOrSchedule(cmsg);
242  }
243  break;
244  }
245 
246  case SCTP_I_ESTABLISHED: {
249  }
250  else {
251  int32_t count = 0;
252  Message *message = check_and_cast<Message *>(msg);
253  auto& tags = message->getTags();
254  auto& connectInfo = tags.findTag<SctpConnectReq>();
255  numSessions++;
256  serverAssocId = connectInfo->getSocketId();
257  id = serverAssocId;
258  outboundStreams = connectInfo->getOutboundStreams();
259  inboundStreams = connectInfo->getInboundStreams();
260  rcvdPacketsPerAssoc[serverAssocId] = static_cast<int64_t>(par("numPacketsToReceivePerClient"));
261  sentPacketsPerAssoc[serverAssocId] = static_cast<int64_t>(par("numPacketsToSendPerClient"));
262  char text[128];
263  sprintf(text, "App: Received Bytes of assoc %d", serverAssocId);
264  bytesPerAssoc[serverAssocId] = new cOutVector(text);
266  sprintf(text, "App: EndToEndDelay of assoc %d", serverAssocId);
267  endToEndDelay[serverAssocId] = new cOutVector(text);
268  sprintf(text, "Hist: EndToEndDelay of assoc %d", serverAssocId);
269  histEndToEndDelay[serverAssocId] = new cHistogram(text);
270 
271  delete msg;
272 
273  if (static_cast<int64_t>(par("numPacketsToSendPerClient")) > 0) {
274  auto i = sentPacketsPerAssoc.find(serverAssocId);
275  numRequestsToSend = i->second;
276  if (par("thinkTime").doubleValue() > 0.0) {
277  generateAndSend();
278  timeoutMsg->setKind(SCTP_C_SEND);
279  scheduleAfter(par("thinkTime"), timeoutMsg);
281  i->second = numRequestsToSend;
282  }
283  else {
284  if (queueSize == 0) {
285  while (numRequestsToSend > 0) {
286  generateAndSend();
288  i->second = numRequestsToSend;
289  }
290  }
291  else if (queueSize > 0) {
292  while (numRequestsToSend > 0 && count++ < queueSize * 2) {
293  generateAndSend();
295  i->second = numRequestsToSend;
296  }
297 
298  Request *cmsg = new Request("SCTP_C_QUEUE_MSGS_LIMIT", SCTP_C_QUEUE_MSGS_LIMIT);
299  auto qinfo = cmsg->addTag<SctpInfoReq>();
300  qinfo->setText(queueSize);
301  qinfo->setSocketId(id);
302  sendOrSchedule(cmsg);
303  }
304 
305  EV << "!!!!!!!!!!!!!!!All data sent from Peer !!!!!!!!!!\n";
306 
307  auto j = rcvdPacketsPerAssoc.find(serverAssocId);
308  if (j->second == 0 && par("waitToClose").doubleValue() > 0.0) {
309  char as[5];
310  sprintf(as, "%d", serverAssocId);
311  cMessage *abortMsg = new cMessage(as, SCTP_I_ABORT);
312  scheduleAfter(par("waitToClose"), abortMsg);
313  }
314  else {
315  EV << "no more packets to send, call shutdown for assoc " << serverAssocId << "\n";
316  Request *cmsg = new Request("ShutdownRequest", SCTP_C_SHUTDOWN);
317  auto& cmd = cmsg->addTag<SctpCommandReq>();
318  cmd->setSocketId(serverAssocId);
319  sendOrSchedule(cmsg);
320  }
321  }
322  }
323  }
324  break;
325  }
326 
328  EV_DETAIL << "NatPeer: SCTP_I_DATA_NOTIFICATION arrived\n";
329  notifications++;
330  Message *message = check_and_cast<Message *>(msg);
331  auto& intags = message->getTags();
332  auto& ind = intags.findTag<SctpCommandReq>();
333  id = ind->getSocketId();
334  Request *cmsg = new Request("ReceiveRequest", SCTP_C_RECEIVE);
335  auto cmd = cmsg->addTag<SctpSendReq>();
336  cmsg->addTag<SocketReq>()->setSocketId(id);
337  cmsg->addTag<DispatchProtocolReq>()->setProtocol(&Protocol::sctp);
338  cmd->setSocketId(id);
339  cmd->setSid(ind->getSid());
340  cmd->setNumMsgs(ind->getNumMsgs());
341  delete msg;
342  if (!cmsg->isScheduled() && schedule == false) {
343  scheduleAfter(par("delayFirstRead"), cmsg);
344  }
345  else if (schedule == true)
346  sendOrSchedule(cmsg);
347  break;
348  }
349 
350  case SCTP_I_DATA: {
351  Packet *message = check_and_cast<Packet *>(msg);
352  auto& ind = message->findTag<SctpRcvReq>();
353  id = ind->getSocketId();
354  if (rendezvous) {
355  const auto& smsg = message->peekDataAsBytes();
356  int bufferlen = B(smsg->getChunkLength()).get();
357  uint8_t buffer[bufferlen];
358  std::vector<uint8_t> vec = smsg->getBytes();
359  for (int i = 0; i < bufferlen; i++) {
360  buffer[i] = vec[i];
361  }
362  struct nat_message *nat = (struct nat_message *)buffer;
363  peerAddressList.clear();
364  if (nat->multi) {
365  peerAddressList.push_back(Ipv4Address(nat->peer2Addresses[0]));
366  EV << "address 0: " << Ipv4Address(nat->peer2Addresses[0]).str() << endl;
367  peerAddressList.push_back(Ipv4Address(nat->peer2Addresses[1]));
368  EV << "address 1: " << Ipv4Address(nat->peer2Addresses[1]).str() << endl;
369  }
370  else {
371  peerAddress = Ipv4Address(nat->peer2Addresses[0]);
372  }
373  peerPort = nat->portPeer2;
374  delete msg;
375  }
376  else {
377  auto j = rcvdBytesPerAssoc.find(id);
380  else if (j != rcvdBytesPerAssoc.end()) {
381  j->second += PK(msg)->getBitLength() / 8;
382  auto k = bytesPerAssoc.find(id);
383  k->second->record(j->second);
384  packetsRcvd++;
385  if (!echo) {
386  if (par("numPacketsToReceivePerClient").intValue() > 0) {
387  auto i = rcvdPacketsPerAssoc.find(id);
388  i->second--;
389  SctpSimpleMessage *smsg = check_and_cast<SctpSimpleMessage *>(msg);
390  auto j = endToEndDelay.find(id);
391  j->second->record(simTime() - smsg->getCreationTime());
392  auto k = histEndToEndDelay.find(id);
393  k->second->collect(simTime() - smsg->getCreationTime());
394 
395  if (i->second == 0) {
396  Request *cmsg = new Request("SCTP_C_NO_OUTSTANDING", SCTP_C_NO_OUTSTANDING);
397  auto qinfo = cmsg->addTag<SctpCommandReq>();
398  qinfo->setSocketId(id);
399  sendOrSchedule(cmsg);
400  }
401  }
402  delete msg;
403  }
404  else {
405  SctpSimpleMessage *smsg = check_and_cast<SctpSimpleMessage *>(msg->dup());
406  auto j = endToEndDelay.find(id);
407  j->second->record(simTime() - smsg->getCreationTime());
408  auto k = histEndToEndDelay.find(id);
409  k->second->collect(simTime() - smsg->getCreationTime());
410  Packet *cmsg = new Packet("SCTP_C_SEND", SCTP_C_SEND);
411  bytesSent += smsg->getByteLength();
412  auto cmd = cmsg->addTag<SctpSendReq>();
413  cmd->setSendUnordered(cmd->getSendUnordered());
415  cmd->setSocketId(id);
416  cmd->setPrValue(0);
417  cmd->setSid(lastStream);
418  cmd->setLast(true);
419  cmsg->encapsulate(smsg);
420  cmsg->setControlInfo(cmd.get()); // KLUDGE
421  packetsSent++;
422  delete msg;
423  sendOrSchedule(cmsg);
424  }
425  }
426  else {
427  delete msg;
428  }
429  }
430  break;
431  }
432 
434  Message *message = check_and_cast<Message *>(msg);
435  id = message->getTag<SocketInd>()->getSocketId();
436  EV << "peer: SCTP_I_SHUTDOWN_RECEIVED for assoc " << id << "\n";
437  auto i = rcvdPacketsPerAssoc.find(id);
440  }
441  else if (i != rcvdPacketsPerAssoc.end()) {
442  if (i->second == 0) {
443  Request *cmsg = new Request("SCTP_C_NO_OUTSTANDING", SCTP_C_NO_OUTSTANDING);
444  auto qinfo = cmsg->addTag<SctpCommandReq>();
445  qinfo->setSocketId(id);
446  sendOrSchedule(cmsg);
447  }
448 
449  shutdownReceived = true;
450  delete msg;
451  }
452  else {
453  delete msg;
454  }
455  delete msg;
456  }
457 
460  EV << "Streams have been resetted\n";
461  break;
462  }
463 
464  case SCTP_I_CLOSED:
466  delete msg;
467  break;
468  }
469  }
470 
471  if (hasGUI()) {
472  char buf[32];
473  auto l = rcvdBytesPerAssoc.find(id);
474  sprintf(buf, "rcvd: %lld bytes\nsent: %lld bytes", (long long int)l->second, (long long int)bytesSent);
475  getDisplayString().setTagArg("t", 0, buf);
476  }
477 }

◆ handleTimer()

void inet::SctpNatPeer::handleTimer ( cMessage *  msg)
480 {
481  int32_t id;
482 
483  EV << "SctpNatPeer::handleTimer\n";
484 
485  switch (msg->getKind()) {
486  case MSGKIND_CONNECT:
487  EV << "starting session call connect\n";
488  connect(L3AddressResolver().resolve(par("connectAddress"), 1), par("connectPort"));
489  delete msg;
490  break;
491 
492  case SCTP_C_SEND:
493 
494  EV << "SctpNatPeer:MSGKIND_SEND\n";
495 
496  if (numRequestsToSend > 0) {
497  generateAndSend();
498  if (par("thinkTime").doubleValue() > 0.0)
499  scheduleAfter(par("thinkTime"), timeoutMsg);
501  }
502  break;
503 
504  case SCTP_I_ABORT: {
505  EV << "SctpNatPeer:MsgKIND_ABORT for assoc " << atoi(msg->getName()) << "\n";
506 
507  Request *cmsg = new Request("SCTP_C_CLOSE", SCTP_C_CLOSE);
508  auto& cmd = cmsg->addTag<SctpCommandReq>();
509  id = atoi(msg->getName());
510  cmd->setSocketId(id);
511  cmsg->setControlInfo(cmd.get()); // KLUDGE
512  sendOrSchedule(cmsg);
513  break;
514  }
515 
516  case SCTP_C_RECEIVE:
517 
518  EV << "SctpNatPeer:SCTP_C_RECEIVE\n";
519  schedule = true;
520  sendOrSchedule(msg);
521  break;
522 
523  default:
524 
525  EV << "MsgKind =" << msg->getKind() << " unknown\n";
526 
527  break;
528  }
529 }

◆ initialize()

void inet::SctpNatPeer::initialize ( int  stage)
override
72 {
73  cSimpleModule::initialize(stage);
74  EV_DEBUG << "initialize SCTP NAT Peer stage " << stage << endl;
75  if (stage == INITSTAGE_LOCAL) {
76  WATCH(numSessions);
77  WATCH(packetsSent);
78  WATCH(packetsRcvd);
79  WATCH(bytesSent);
80  WATCH(numRequestsToSend);
81  timeoutMsg = new cMessage("SrvAppTimer");
82  queueSize = par("queueSize");
83  }
84  else if (stage == INITSTAGE_APPLICATION_LAYER) {
85  // parameters
86  const char *addressesString = par("localAddress");
87  AddressVector addresses = L3AddressResolver().resolve(cStringTokenizer(addressesString).asVector());
88  int32_t port = par("localPort");
89  echo = par("echo");
90  delay = par("echoDelay");
91  outboundStreams = par("outboundStreams");
92  inboundStreams = par("inboundStreams");
93  ordered = par("ordered");
94  clientSocket.setOutputGate(gate("socketOut"));
96  if (addresses.size() == 0) {
97  clientSocket.bind(port);
98  }
99  else {
100  clientSocket.bindx(addresses, port);
101  }
102 
103  rendezvous = par("rendezvous");
104  if (par("startTime").doubleValue() > 0.0) {
105  cMessage *msg = new cMessage("ConnectTimer", MSGKIND_CONNECT);
106  scheduleAt(par("startTime"), msg);
107  }
108  }
109 }

◆ msgAbandonedArrived()

void inet::SctpNatPeer::msgAbandonedArrived ( SctpSocket socket)
overridevirtual

Reimplemented from inet::SctpSocket::ICallback.

835 {
836  chunksAbandoned++;
837 }

◆ numInitStages()

virtual int inet::SctpNatPeer::numInitStages ( ) const
inlineoverridevirtual
99 { return NUM_INIT_STAGES; }

◆ sendOrSchedule()

void inet::SctpNatPeer::sendOrSchedule ( cMessage *  msg)
protected
112 {
113  if (delay == 0) {
114  send(msg, "socketOut");
115  }
116  else {
117  scheduleAfter(delay, msg);
118  }
119 }

◆ sendqueueFullArrived()

void inet::SctpNatPeer::sendqueueFullArrived ( SctpSocket socket)
overridevirtual

Reimplemented from inet::SctpSocket::ICallback.

840 {
841  sendAllowed = false;
842 }

◆ sendQueueRequest()

void inet::SctpNatPeer::sendQueueRequest ( )
763 {
764  Request *cmsg = new Request("SCTP_C_QUEUE_MSGS_LIMIT", SCTP_C_QUEUE_MSGS_LIMIT);
765  auto& qinfo = cmsg->addTag<SctpInfoReq>();
766  qinfo->setText(queueSize);
767  qinfo->setSocketId(clientSocket.getSocketId());
769 }

◆ sendRequest()

void inet::SctpNatPeer::sendRequest ( bool  last = true)
protected
643 {
644  EV << "sending request, " << numRequestsToSend - 1 << " more to go\n";
645  int64_t numBytes = par("requestLength");
646  if (numBytes < 1)
647  numBytes = 1;
648 
649  EV << "SctpNatPeer: sending " << numBytes << " data bytes\n";
650 
651  auto cmsg = new Packet("ApplicationPacket");
653  auto msg = makeShared<BytesChunk>();
654  std::vector<uint8_t> vec;
655  vec.resize(numBytes);
656  for (int i = 0; i < numBytes; i++)
657  vec[i] = (bytesSent + i) & 0xFF;
658  msg->setBytes(vec);
659  msg->addTag<CreationTimeTag>()->setCreationTime(simTime());
660  cmsg->insertAtBack(msg);
661  auto sendCommand = cmsg->addTag<SctpSendReq>();
662  sendCommand->setLast(true);
663  // send SctpMessage with SctpSimpleMessage enclosed
664  clientSocket.send(cmsg);
665  bytesSent += numBytes;
666 }

◆ sendRequestArrived()

void inet::SctpNatPeer::sendRequestArrived ( SctpSocket socket)
overridevirtual

Reimplemented from inet::SctpSocket::ICallback.

772 {
773  int32_t count = 0;
774 
775  EV << "sendRequestArrived numRequestsToSend=" << numRequestsToSend << "\n";
776  while (numRequestsToSend > 0 && count++ < queueSize && sendAllowed) {
778  if (count == queueSize || numRequestsToSend == 0)
779  sendRequest();
780  else
781  sendRequest(false);
782 
783  if (numRequestsToSend == 0) {
784  EV << "no more packets to send, call shutdown\n";
786  }
787  }
788 }

◆ sendStreamResetNotification()

void inet::SctpNatPeer::sendStreamResetNotification ( )

◆ setPrimaryPath()

void inet::SctpNatPeer::setPrimaryPath ( )

◆ setStatusString()

void inet::SctpNatPeer::setStatusString ( const char *  s)
637 {
638  if (hasGUI())
639  getDisplayString().setTagArg("t", 0, s);
640 }

◆ shutdownReceivedArrived()

void inet::SctpNatPeer::shutdownReceivedArrived ( SctpSocket socket)
overridevirtual

Reimplemented from inet::SctpSocket::ICallback.

825 {
826  if (numRequestsToSend == 0 || rendezvous) {
827  Message *cmsg = new Message("SCTP_C_NO_OUTSTANDING", SCTP_C_NO_OUTSTANDING);
828  auto& qinfo = cmsg->addTag<SctpCommandReq>();
829  qinfo->setSocketId(socket->getSocketId());
831  }
832 }

◆ socketAvailable()

virtual void inet::SctpNatPeer::socketAvailable ( SctpSocket socket,
Indication indication 
)
inlineoverridevirtual

Implements inet::SctpSocket::ICallback.

109  {
110  throw cRuntimeError("Model error, this module doesn't use any listener SCTP sockets");
111  }

◆ socketClosed()

void inet::SctpNatPeer::socketClosed ( SctpSocket socket)
overridevirtual

Does nothing but update statistics/status.

Redefine if you want to do something else, such as opening a new connection.

Reimplemented from inet::SctpSocket::ICallback.

577 {
578  // *redefine* to start another session etc.
579 
580  EV << "connection closed\n";
581  setStatusString("closed");
583  if (rendezvous) {
584  const char *addressesString = par("localAddress");
585  AddressVector addresses = L3AddressResolver().resolve(cStringTokenizer(addressesString).asVector());
586  int32_t port = par("localPort");
587  rendezvousSocket.setOutputGate(gate("socketOut"));
590  if (addresses.size() == 0) {
591  rendezvousSocket.bind(port);
592  clientSocket.bind(port);
593  }
594  else {
595  clientSocket.bindx(addresses, port);
596  rendezvousSocket.bindx(addresses, port);
597  }
598  rendezvousSocket.listen(true, par("streamReset").boolValue(), par("numPacketsToSendPerClient"));
599  if (par("multi").boolValue())
601  else
603  rendezvous = false;
604  }
605 }

◆ socketDataArrived()

void inet::SctpNatPeer::socketDataArrived ( SctpSocket socket,
Packet msg,
bool  urgent 
)
overridevirtual

Does nothing but update statistics/status.

Redefine to perform or schedule next sending. Beware: this funcion deletes the incoming message, which might not be what you want.

Implements inet::SctpSocket::ICallback.

791 {
792  // *redefine* to perform or schedule next sending
793  packetsRcvd++;
794 
795  EV << "Client received packet Nr " << packetsRcvd << " from SCTP\n";
796 
797  auto& tags = msg->getTags();
798  const auto& ind = tags.findTag<SctpRcvReq>();
799 
800  bytesRcvd += msg->getByteLength();
801 
802  if (echo) {
803  const auto& smsg = msg->peekData();
804  auto cmsg = new Packet("ApplicationPacket");
805  cmsg->setKind(ind->getSendUnordered() ? SCTP_C_SEND_UNORDERED : SCTP_C_SEND_ORDERED);
806  cmsg->insertAtBack(smsg);
807  auto cmd = cmsg->addTag<SctpSendReq>();
808  cmd->setLast(true);
809  cmd->setSocketId(ind->getSocketId());
810  cmd->setPrValue(0);
811  cmd->setSid(ind->getSid());
812  packetsSent++;
813  clientSocket.send(cmsg);
814  }
815  if (par("numPacketsToReceive").intValue() > 0) {
817  delete msg;
818  if (numPacketsToReceive == 0) {
819  EV << "Peer: all packets received\n";
820  }
821  }
822 }

◆ socketDataNotificationArrived()

void inet::SctpNatPeer::socketDataNotificationArrived ( SctpSocket socket,
Message msg 
)
overridevirtual

Implements inet::SctpSocket::ICallback.

532 {
533  Message *message = check_and_cast<Message *>(msg);
534  auto& intags = message->getTags();
535  auto& ind = intags.findTag<SctpCommandReq>();
536  Request *cmesg = new Request("SCTP_C_RECEIVE", SCTP_C_RECEIVE);
537  auto& cmd = cmesg->addTag<SctpSendReq>();
538  cmd->setSocketId(ind->getSocketId());
539  cmd->setSid(ind->getSid());
540  cmd->setNumMsgs(ind->getNumMsgs());
542 }

◆ socketEstablished()

void inet::SctpNatPeer::socketEstablished ( SctpSocket socket,
unsigned long int  buffer 
)
overridevirtual

Does nothing but update statistics/status.

Redefine to perform or schedule first sending.

Reimplemented from inet::SctpSocket::ICallback.

669 {
670  int32_t count = 0;
671  // *redefine* to perform or schedule first sending
672  EV << "SctpNatPeer: socketEstablished\n";
673  setStatusString("connected");
674  if (rendezvous) {
675  uint8_t buffer[100];
676  int buflen = 14;
677  struct nat_message *nat = (struct nat_message *)(buffer);
678 
679  nat->peer1 = par("ownName");
680  nat->peer2 = par("peerName");
681  nat->portPeer1 = par("localPort");
682  nat->portPeer2 = 0;
683  nat->peer1Addresses[0] = L3Address().toIpv4().getInt();
684  nat->peer2Addresses[0] = L3Address().toIpv4().getInt();
685  nat->numAddrPeer1 = 1;
686  nat->numAddrPeer2 = 1;
687  buflen = ADD_PADDING(buflen + 4 * (nat->numAddrPeer1 + nat->numAddrPeer2));
688  bool mul = par("multi");
689  if (mul == true) {
690  nat->multi = 1;
691  }
692  else {
693  nat->multi = 0;
694  }
695 
696  auto applicationData = makeShared<BytesChunk>(buffer, buflen);
697  applicationData->addTag<CreationTimeTag>()->setCreationTime(simTime());
698  auto applicationPacket = new Packet("ApplicationPacket", SCTP_C_SEND_ORDERED);
699  applicationPacket->insertAtBack(applicationData);
700  auto sctpSendReq = applicationPacket->addTag<SctpSendReq>();
701  sctpSendReq->setLast(true);
702  sctpSendReq->setPrMethod(0);
703  sctpSendReq->setPrValue(0);
704  sctpSendReq->setSid(0);
705  clientSocket.send(applicationPacket);
706 
707  if (par("multi").boolValue()) {
708  Request *cmesg = new Request("SCTP_C_SEND_ASCONF", SCTP_C_SEND_ASCONF);
709  auto& cmd = cmesg->addTag<SctpCommandReq>();
710  cmd->setSocketId(clientSocket.getSocketId());
712  }
713  }
714  else {
715  EV << " determine number of requests in this session\n";
716  numRequestsToSend = par("numRequestsPerSession");
717  numPacketsToReceive = par("numPacketsToReceive");
718  if (numRequestsToSend < 1)
719  numRequestsToSend = 0;
720  // perform first request (next one will be sent when reply arrives)
721  if (numRequestsToSend > 0) {
722  if (par("thinkTime").doubleValue() > 0.0) {
723  if (sendAllowed) {
724  sendRequest();
726  }
727  timeMsg->setKind(MSGKIND_SEND);
728  scheduleAfter(par("thinkTime"), timeMsg);
729  }
730  else {
731  if (queueSize > 0) {
732  while (numRequestsToSend > 0 && count++ < queueSize * 2 && sendAllowed) {
733  if (count == queueSize * 2)
734  sendRequest();
735  else
736  sendRequest(false);
738  }
739  if (numRequestsToSend > 0 && sendAllowed)
741  }
742  else {
743  while (numRequestsToSend > 0 && sendAllowed) {
744  sendRequest();
746  }
747  }
748 
749  if (numPacketsToReceive == 0 && par("waitToClose").doubleValue() > 0.0) {
750  timeMsg->setKind(MSGKIND_ABORT);
751  scheduleAfter(par("waitToClose"), timeMsg);
752  }
753  if (numRequestsToSend == 0 && par("waitToClose").doubleValue() == 0.0) {
754  EV << "socketEstablished:no more packets to send, call shutdown\n";
756  }
757  }
758  }
759  }
760 }

◆ socketFailure()

void inet::SctpNatPeer::socketFailure ( SctpSocket socket,
int32_t  code 
)
override

Does nothing but update statistics/status.

Redefine if you want to try reconnecting after a delay.

608 {
609  // subclasses may override this function, and add code try to reconnect after a delay.
610  EV << "connection broken\n";
611  setStatusString("broken");
612 
613 // numBroken++;
614 
615  // reconnect after a delay
616  timeMsg->setKind(MSGKIND_CONNECT);
617  scheduleAfter(par("reconnectInterval"), timeMsg);
618 }

◆ socketPeerClosed()

void inet::SctpNatPeer::socketPeerClosed ( SctpSocket socket)
overridevirtual

Since remote SCTP closed, invokes close().

Redefine if you want to do something else.

Reimplemented from inet::SctpSocket::ICallback.

545 {
546  // close the connection (if not already closed)
548  EV << "remote Sctp closed, closing here as well\n";
549  setStatusString("closed");
551  if (rendezvous) {
552  const char *addressesString = par("localAddress");
553  AddressVector addresses = L3AddressResolver().resolve(cStringTokenizer(addressesString).asVector());
554  int32_t port = par("localPort");
555  rendezvousSocket.setOutputGate(gate("socketOut"));
558  if (addresses.size() == 0) {
559  rendezvousSocket.bind(port);
560  clientSocket.bind(port);
561  }
562  else {
563  clientSocket.bindx(addresses, port);
564  rendezvousSocket.bindx(addresses, port);
565  }
566  rendezvousSocket.listen(true, par("streamReset").boolValue(), par("numPacketsToSendPerClient"));
567  if (par("multi").boolValue())
569  else
571  rendezvous = false;
572  }
573  }
574 }

◆ socketStatusArrived()

void inet::SctpNatPeer::socketStatusArrived ( SctpSocket socket,
SctpStatusReq status 
)
overridevirtual

Redefine to handle incoming SctpStatusInfo.

Reimplemented from inet::SctpSocket::ICallback.

621 {
622  struct pathStatus ps;
623  auto i = sctpPathStatus.find(status->getPathId());
624  if (i != sctpPathStatus.end()) {
625  ps = i->second;
626  ps.active = status->getActive();
627  }
628  else {
629  ps.active = status->getActive();
630 // ps.pid = status->pathId(); FIXME
631  ps.primaryPath = false;
632  sctpPathStatus[ps.pid] = ps;
633  }
634 }

Member Data Documentation

◆ bytesPerAssoc

BytesPerAssoc inet::SctpNatPeer::bytesPerAssoc
protected

◆ bytesRcvd

int32_t inet::SctpNatPeer::bytesRcvd
protected

◆ bytesSent

int64_t inet::SctpNatPeer::bytesSent
protected

◆ chunksAbandoned

int32_t inet::SctpNatPeer::chunksAbandoned
protected

◆ clientSocket

SctpSocket inet::SctpNatPeer::clientSocket
protected

◆ delay

double inet::SctpNatPeer::delay
protected

◆ echo

bool inet::SctpNatPeer::echo
protected

◆ echoedBytesSent

int32_t inet::SctpNatPeer::echoedBytesSent
protected

◆ endToEndDelay

EndToEndDelay inet::SctpNatPeer::endToEndDelay
protected

◆ histEndToEndDelay

HistEndToEndDelay inet::SctpNatPeer::histEndToEndDelay
protected

◆ inboundStreams

int32_t inet::SctpNatPeer::inboundStreams
protected

◆ lastStream

int32_t inet::SctpNatPeer::lastStream
protected

◆ localAddressList

AddressVector inet::SctpNatPeer::localAddressList
protected

◆ notifications

int32_t inet::SctpNatPeer::notifications
protected

◆ numPacketsToReceive

int32_t inet::SctpNatPeer::numPacketsToReceive
protected

◆ numRequestsToSend

int32_t inet::SctpNatPeer::numRequestsToSend
protected

◆ numSessions

int32_t inet::SctpNatPeer::numSessions
protected

◆ ordered

bool inet::SctpNatPeer::ordered
protected

◆ outboundStreams

int32_t inet::SctpNatPeer::outboundStreams
protected

◆ packetsRcvd

int32_t inet::SctpNatPeer::packetsRcvd
protected

◆ packetsSent

int32_t inet::SctpNatPeer::packetsSent
protected

◆ peerAddress

L3Address inet::SctpNatPeer::peerAddress
protected

◆ peerAddressList

AddressVector inet::SctpNatPeer::peerAddressList
protected

◆ peerPort

int32_t inet::SctpNatPeer::peerPort
protected

◆ peerSocket

SctpSocket inet::SctpNatPeer::peerSocket
protected

◆ queueSize

int32_t inet::SctpNatPeer::queueSize
protected

◆ rcvdBytesPerAssoc

RcvdBytesPerAssoc inet::SctpNatPeer::rcvdBytesPerAssoc
protected

◆ rcvdPacketsPerAssoc

RcvdPacketsPerAssoc inet::SctpNatPeer::rcvdPacketsPerAssoc
protected

◆ rendezvous

bool inet::SctpNatPeer::rendezvous
protected

◆ rendezvousSocket

SctpSocket inet::SctpNatPeer::rendezvousSocket
protected

◆ schedule

bool inet::SctpNatPeer::schedule
protected

◆ sctpPathStatus

SctpPathStatus inet::SctpNatPeer::sctpPathStatus

◆ sendAllowed

bool inet::SctpNatPeer::sendAllowed
protected

◆ sentPacketsPerAssoc

SentPacketsPerAssoc inet::SctpNatPeer::sentPacketsPerAssoc
protected

◆ serverAssocId

int32_t inet::SctpNatPeer::serverAssocId
protected

◆ shutdownReceived

bool inet::SctpNatPeer::shutdownReceived
protected

◆ timeMsg

cMessage* inet::SctpNatPeer::timeMsg
protected

◆ timeoutMsg

cMessage* inet::SctpNatPeer::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::SctpSocket::processMessage
void processMessage(cMessage *msg) override
Examines the message (which should have arrived from SctpMain), updates socket state,...
Definition: SctpSocket.cc:461
inet::SctpNatPeer::chunksAbandoned
int32_t chunksAbandoned
Definition: SctpNatPeer.h:66
inet::SctpNatPeer::timeoutMsg
cMessage * timeoutMsg
Definition: SctpNatPeer.h:58
inet::SCTP_C_SEND_UNORDERED
@ SCTP_C_SEND_UNORDERED
Definition: SctpCommand_m.h:138
inet::SCTP_C_SEND_ASCONF
@ SCTP_C_SEND_ASCONF
Definition: SctpCommand_m.h:148
inet::SCTP_I_SENDSOCKETOPTIONS
@ SCTP_I_SENDSOCKETOPTIONS
Definition: SctpCommand_m.h:217
inet::SctpNatPeer::handleTimer
void handleTimer(cMessage *msg)
Definition: SctpNatPeer.cc:479
inet::SctpNatPeer::histEndToEndDelay
HistEndToEndDelay histEndToEndDelay
Definition: SctpNatPeer.h:83
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::SctpNatPeer::numRequestsToSend
int32_t numRequestsToSend
Definition: SctpNatPeer.h:55
MSGKIND_CONNECT
#define MSGKIND_CONNECT
Definition: SctpNatPeer.cc:27
inet::sctp::SctpAssociation::indicationName
static const char * indicationName(int32_t code)
Utility: returns name of SCTP_I_xxx constants.
Definition: SctpAssociationUtil.cc:205
inet::SctpNatPeer::peerAddressList
AddressVector peerAddressList
Definition: SctpNatPeer.h:71
inet::SCTP_I_CLOSED
@ SCTP_I_CLOSED
Definition: SctpCommand_m.h:201
inet::SctpSocket::getSocketId
int getSocketId() const override
Returns the internal connection Id.
Definition: SctpSocket.h:138
inet::SctpNatPeer::rendezvousSocket
SctpSocket rendezvousSocket
Definition: SctpNatPeer.h:45
MSGKIND_SEND
#define MSGKIND_SEND
Definition: SctpNatPeer.cc:28
inet::SctpSocket::CONNECTED
@ CONNECTED
Definition: SctpSocket.h:80
inet::SctpNatPeer::lastStream
int32_t lastStream
Definition: SctpNatPeer.h:64
inet::count
int count(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:54
inet::SctpNatPeer::packetsSent
int32_t packetsSent
Definition: SctpNatPeer.h:52
inet::SctpSocket::send
virtual void send(Packet *packet) override
Send data message.
Definition: SctpSocket.cc:355
inet::SctpSocket::shutdown
void shutdown(int id=-1)
Definition: SctpSocket.cc:408
inet::SctpNatPeer::queueSize
int32_t queueSize
Definition: SctpNatPeer.h:57
inet::SctpSocket::sendRequest
void sendRequest(cMessage *msg)
Send request.
Definition: SctpSocket.cc:389
inet::SctpSocket::getState
int getState() const
Returns the socket state, one of NOT_BOUND, CLOSED, LISTENING, CONNECTING, CONNECTED,...
Definition: SctpSocket.h:151
inet::SctpSocket::setCallback
void setCallback(ICallback *cb)
Sets a callback object, to be used with processMessage().
Definition: SctpSocket.cc:456
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
inet::SctpNatPeer::schedule
bool schedule
Definition: SctpNatPeer.h:48
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
MSGKIND_ABORT
#define MSGKIND_ABORT
Definition: SctpNatPeer.cc:29
inet::SctpSocket::sendNotification
void sendNotification(cMessage *msg)
Send notification.
Definition: SctpSocket.cc:377
inet::SctpNatPeer::sendOrSchedule
void sendOrSchedule(cMessage *msg)
Definition: SctpNatPeer.cc:111
inet::SctpNatPeer::packetsRcvd
int32_t packetsRcvd
Definition: SctpNatPeer.h:53
inet::SctpNatPeer::rcvdBytesPerAssoc
RcvdBytesPerAssoc rcvdBytesPerAssoc
Definition: SctpNatPeer.h:79
inet::SctpNatPeer::ordered
bool ordered
Definition: SctpNatPeer.h:56
inet::SctpNatPeer::sendAllowed
bool sendAllowed
Definition: SctpNatPeer.h:65
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::SctpNatPeer::serverAssocId
int32_t serverAssocId
Definition: SctpNatPeer.h:42
inet::SCTP_C_ABORT
@ SCTP_C_ABORT
Definition: SctpCommand_m.h:134
MSGKIND_RESET
#define MSGKIND_RESET
Definition: SctpNatPeer.cc:31
inet::SctpSocket::close
void close(int id)
Closes the local end of the connection.
Definition: SctpSocket.cc:394
inet::SctpNatPeer::numPacketsToReceive
int32_t numPacketsToReceive
Definition: SctpNatPeer.h:67
inet::SctpNatPeer::sentPacketsPerAssoc
SentPacketsPerAssoc sentPacketsPerAssoc
Definition: SctpNatPeer.h:77
inet::SCTP_I_ESTABLISHED
@ SCTP_I_ESTABLISHED
Definition: SctpCommand_m.h:199
inet::units::values::s
value< double, units::s > s
Definition: Units.h:1235
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
ADD_PADDING
#define ADD_PADDING(x)
Definition: SctpAssociation.h:252
inet::SctpNatPeer::setStatusString
void setStatusString(const char *s)
Definition: SctpNatPeer.cc:636
inet::SCTP_I_SHUTDOWN_RECEIVED
@ SCTP_I_SHUTDOWN_RECEIVED
Definition: SctpCommand_m.h:209
inet::SCTP_C_NO_OUTSTANDING
@ SCTP_C_NO_OUTSTANDING
Definition: SctpCommand_m.h:143
inet::SCTP_I_PEER_CLOSED
@ SCTP_I_PEER_CLOSED
Definition: SctpCommand_m.h:200
inet::SctpNatPeer::shutdownReceived
bool shutdownReceived
Definition: SctpNatPeer.h:49
inet::SctpNatPeer::localAddressList
AddressVector localAddressList
Definition: SctpNatPeer.h:72
inet::SCTP_C_QUEUE_MSGS_LIMIT
@ SCTP_C_QUEUE_MSGS_LIMIT
Definition: SctpCommand_m.h:141
inet::SctpNatPeer::echoedBytesSent
int32_t echoedBytesSent
Definition: SctpNatPeer.h:63
inet::SctpNatPeer::clientSocket
SctpSocket clientSocket
Definition: SctpNatPeer.h:43
inet::SctpNatPeer::notifications
int32_t notifications
Definition: SctpNatPeer.h:41
inet::SctpSocket::bindx
void bindx(AddressVector localAddr, int localPort)
Definition: SctpSocket.cc:171
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::SctpNatPeer::sendQueueRequest
void sendQueueRequest()
Definition: SctpNatPeer.cc:762
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::SctpNatPeer::rendezvous
bool rendezvous
Definition: SctpNatPeer.h:68
inet::SctpNatPeer::sendRequest
void sendRequest(bool last=true)
Definition: SctpNatPeer.cc:642
inet::SctpNatPeer::delay
double delay
Definition: SctpNatPeer.h:46
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::SctpNatPeer::sctpPathStatus
SctpPathStatus sctpPathStatus
Definition: SctpNatPeer.h:98
inet::SctpNatPeer::peerPort
int32_t peerPort
Definition: SctpNatPeer.h:70
PK
#define PK(msg)
Definition: INETDefs.h:89
inet::SctpNatPeer::inboundStreams
int32_t inboundStreams
Definition: SctpNatPeer.h:61
inet::SctpSocket::connect
void connect(L3Address remoteAddress, int32_t remotePort, bool streamReset=false, int32_t prMethod=0, uint32_t numRequests=0)
Active OPEN to the given remote socket.
Definition: SctpSocket.cc:241
inet::SctpNatPeer::peerAddress
L3Address peerAddress
Definition: SctpNatPeer.h:69
inet::INITSTAGE_APPLICATION_LAYER
INET_API InitStage INITSTAGE_APPLICATION_LAYER
Initialization of applications.
inet::SctpSocket::connectx
void connectx(AddressVector remoteAddresses, int32_t remotePort, bool streamReset=false, int32_t prMethod=0, uint32_t numRequests=0)
Active OPEN to the given remote socket.
Definition: SctpSocket.cc:348
inet::SctpSocket::CONNECTING
@ CONNECTING
Definition: SctpSocket.h:80
inet::SCTP_I_ABORT
@ SCTP_I_ABORT
Definition: SctpCommand_m.h:206
inet::Protocol::sctp
static const Protocol sctp
Definition: Protocol.h:108
inet::units::units::ps
pico< s >::type ps
Definition: Units.h:1073
tags
* tags
Definition: IUdp-gates.txt:3
inet::SctpNatPeer::connectx
void connectx(AddressVector connectAddressList, int32_t connectPort)
Definition: SctpNatPeer.cc:149
inet::SctpNatPeer::numSessions
int32_t numSessions
Definition: SctpNatPeer.h:54
inet::SctpNatPeer::endToEndDelay
EndToEndDelay endToEndDelay
Definition: SctpNatPeer.h:85
inet::SctpNatPeer::connect
void connect(L3Address connectAddress, int32_t connectPort)
Definition: SctpNatPeer.cc:179
inet::SctpNatPeer::echo
bool echo
Definition: SctpNatPeer.h:47
inet::SctpNatPeer::bytesRcvd
int32_t bytesRcvd
Definition: SctpNatPeer.h:62
inet::SctpNatPeer::timeMsg
cMessage * timeMsg
Definition: SctpNatPeer.h:59
inet::SctpSocket::bind
void bind(int localPort)
Bind the socket to a local port number.
Definition: SctpSocket.cc:142
inet::SCTP_C_CLOSE
@ SCTP_C_CLOSE
Definition: SctpCommand_m.h:133
inet::SctpNatPeer::bytesPerAssoc
BytesPerAssoc bytesPerAssoc
Definition: SctpNatPeer.h:81
inet::SCTP_I_ADDRESS_ADDED
@ SCTP_I_ADDRESS_ADDED
Definition: SctpCommand_m.h:216
inet::SctpNatPeer::rcvdPacketsPerAssoc
RcvdPacketsPerAssoc rcvdPacketsPerAssoc
Definition: SctpNatPeer.h:75
inet::SctpSocket::PEER_CLOSED
@ PEER_CLOSED
Definition: SctpSocket.h:80
inet::SctpSocket::setInboundStreams
void setInboundStreams(int streams)
Definition: SctpSocket.h:180
inet::SctpNatPeer::outboundStreams
int32_t outboundStreams
Definition: SctpNatPeer.h:60
inet::SctpNatPeer::generateAndSend
void generateAndSend()
Definition: SctpNatPeer.cc:121
inet::SctpNatPeer::bytesSent
int64_t bytesSent
Definition: SctpNatPeer.h:51
inet::SctpSocket::addAddress
void addAddress(L3Address addr)
Definition: SctpSocket.cc:165