187 if (msg->isSelfMessage()) {
192 switch (msg->getKind()) {
195 Message *message = check_and_cast<Message *>(msg);
196 assocId = message->getTag<SocketInd>()->getSocketId();
197 auto& indtags = message->getTags();
198 const auto& ind = indtags.findTag<SctpCommandReq>();
200 Request *cmsg =
new Request(
"SCTP_C_ABORT",
SCTP_C_ABORT);
201 auto& cmd = cmsg->addTag<SctpSendReq>();
203 id = ind->getSocketId();
204 cmd->setSocketId(
id);
205 cmd->setSid(ind->getSid());
206 cmd->setNumMsgs(ind->getNumMsgs());
208 send(cmsg,
"socketOut");
213 Message *message = check_and_cast<Message *>(msg);
214 auto&
tags = message->getTags();
215 const auto& connectInfo =
tags.findTag<SctpConnectReq>();
217 assocId = connectInfo->getSocketId();
228 EV_DETAIL <<
"SCTP_I_AVAILABLE arrived at server\n";
229 Message *message = check_and_cast<Message *>(msg);
230 int newSockId = message->getTag<SctpAvailableReq>()->getNewSocketId();
231 EV_DETAIL <<
"new socket id = " << newSockId << endl;
233 cmsg->addTag<SctpAvailableReq>()->setSocketId(newSockId);
235 cmsg->addTag<SocketReq>()->setSocketId(newSockId);
236 EV_INFO <<
"Sending accept socket id request ..." << endl;
238 send(cmsg,
"socketOut");
244 EV_DETAIL <<
"SCTP_I_DATA_NOTIFICATION arrived at server\n";
246 Message *message = check_and_cast<Message *>(msg);
247 auto& intags = message->getTags();
248 const auto& ind = intags.findTag<SctpCommandReq>();
250 auto cmd = cmsg->addTag<SctpSendReq>();
251 id = ind->getSocketId();
252 cmd->setSocketId(
id);
253 cmd->setSid(ind->getSid());
254 cmd->setNumMsgs(ind->getNumMsgs());
257 cmsg->addTag<SocketReq>()->setSocketId(
id);
258 send(cmsg,
"socketOut");
263 EV <<
"\nData arrived at server: assoc=" <<
assocId <<
"\n";
265 Packet *message = check_and_cast<Packet *>(msg);
266 auto&
tags = message->getTags();
267 const auto& ind =
tags.findTag<SctpRcvReq>();
268 id = ind->getSocketId();
269 const auto& smsg = message->peekDataAsBytes();
270 int bufferlen =
B(smsg->getChunkLength()).get();
271 uint8_t buffer[bufferlen];
272 std::vector<uint8_t> vec = smsg->getBytes();
273 for (
int i = 0; i < bufferlen; i++) {
276 struct nat_message *nat = (
struct nat_message *)buffer;
280 if ((elem)->peer1 == nat->peer1 || (elem)->peer1Assoc ==
assocId) {
281 EV <<
"found entry: info: Peer1 = " << nat->peer1 <<
" peer1Address1=" << nat->peer1Addresses[0] <<
" peer2=" << nat->peer2 <<
" peer2Address1=" << nat->peer2Addresses[0] <<
"\n";
282 if (nat->multi && nat->numAddrPeer1 > 1 && nat->numAddrPeer2 > 1) {
283 EV <<
" peer1Address2=" << Ipv4Address(nat->peer1Addresses[1]).str() <<
" peer2Address2=" << Ipv4Address(nat->peer2Addresses[1]).str() << endl;
285 if ((elem)->peer1 == 0 && !(elem)->peer1Address2.isUnspecified()) {
286 (elem)->peer1 = nat->peer1;
287 (elem)->peer1Address1 = ind->getRemoteAddr();
288 (elem)->peer1Port = nat->portPeer1;
289 if ((elem)->peer2 == 0) {
290 (elem)->peer2 = nat->peer2;
293 if (nat->multi && (elem)->peer1Address2.isUnspecified()) {
294 (elem)->peer1Address2 = ind->getRemoteAddr();
296 if (!(elem)->peer2Address1.isUnspecified() && !(elem)->peer1Address1.isUnspecified()) {
297 if (!(elem)->multi || ((elem)->multi && !(elem)->peer2Address2.isUnspecified() && !(elem)->peer1Address2.isUnspecified())) {
298 EV <<
"entry now: Peer1=" << (elem)->peer1 <<
" Peer2=" << (elem)->peer2 <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
" peer2Port=" << (elem)->peer2Port <<
"\n";
305 if ((elem)->peer2 == nat->peer1 || (elem)->peer2Assoc ==
assocId) {
306 EV <<
"opposite way: info: Peer1 = " << nat->peer1 <<
" peer1Address1=" << Ipv4Address(nat->peer1Addresses[0]).str() <<
" peer2=" << nat->peer2 <<
" peer2Address1=" << Ipv4Address(nat->peer2Addresses[0]).str() <<
"\n";
307 if (nat->multi && nat->numAddrPeer1 > 1 && nat->numAddrPeer2 > 1) {
308 EV <<
" peer1Address2=" << Ipv4Address(nat->peer1Addresses[1]).str() <<
" peer2Address2=" << Ipv4Address(nat->peer2Addresses[1]).str() << endl;
310 if ((elem)->peer2 == 0) {
311 (elem)->peer2 = nat->peer1;
313 if ((elem)->peer1 == 0) {
314 (elem)->peer1 = nat->peer2;
316 if ((elem)->peer2Address1.isUnspecified()) {
317 (elem)->peer2Address1 = ind->getRemoteAddr();
319 (elem)->peer2Port = nat->portPeer1;
320 (elem)->peer2Gate = ind->getGate();
321 EV <<
"set peer2Address1=" << ind->getRemoteAddr() <<
" peer2Assoc=" <<
assocId <<
" peer2Port=" << nat->portPeer1 <<
"\n";
323 else if ((elem)->multi && !(elem)->peer2Address2.isUnspecified())
324 (elem)->peer2Address2 = ind->getRemoteAddr();
326 if (!(elem)->multi || ((elem)->multi && !(elem)->peer2Address2.isUnspecified() && !(elem)->peer1Address2.isUnspecified()
327 && !(elem)->peer2Address1.isUnspecified() && !(elem)->peer1Address1.isUnspecified()))
329 EV <<
"entry now: Peer1=" << (elem)->peer1 <<
" Peer2=" << (elem)->peer2 <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
" peer1Port=" << (elem)->peer1Port <<
" peer2Port=" << (elem)->peer2Port <<
"\n";
338 EV <<
"make new Info for ";
340 info->peer1 = nat->peer1;
341 EV << info->peer1 <<
" and assoc " <<
assocId <<
"\n";
342 info->multi = nat->multi;
343 info->peer1Address1 = ind->getRemoteAddr();
345 info->peer1Address2 = L3Address();
346 info->peer2Address2 = L3Address();
348 info->peer1Port = nat->portPeer1;
350 info->peer1Gate = ind->getGate();
351 info->peer2 = nat->peer2;
352 info->peer2Address1 = L3Address();
354 info->peer2Assoc = 0;
355 info->peer2Gate = -1;
357 EV <<
"Info: peer1=" << info->peer1 <<
" peer1Address1=" << info->peer1Address1 <<
" peer1Address2=" << info->peer1Address2 <<
" peer1Assoc=" << info->peer1Assoc <<
"\n peer2=" << info->peer2 <<
" peer2Address1=" << info->peer2Address1 <<
" peer2Address2=" << info->peer2Address2 <<
" peer2Assoc=" << info->peer2Assoc <<
"\n";
367 Message *message = check_and_cast<Message *>(msg);
368 id = message->getTag<SocketInd>()->getSocketId();
369 EV <<
"server: SCTP_I_SHUTDOWN_RECEIVED for assoc " <<
id <<
"\n";
371 auto& qinfo = cmsg->addTag<SctpCommandReq>();
372 qinfo->setSocketId(
id);
373 send(cmsg,
"socketOut");
383 EV <<
"Streams have been resetted\n";
393 Message *message = check_and_cast<Message *>(msg);
394 auto& intags = message->getTags();
395 const auto& ind = intags.findTag<SctpCommandReq>();
398 EV <<
" address added: LOCAL=" << ind->getLocalAddr() <<
", remote=" << ind->getRemoteAddr() <<
" assoc=" <<
assocId <<
"\n";
401 if ((elem)->peer1Assoc ==
assocId) {
402 EV <<
"found entry for assoc1 = " <<
assocId <<
" Peer1 = " << (elem)->peer1 <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2=" << (elem)->peer2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
"\n";
403 if ((elem)->multi && (elem)->peer1Address2.isUnspecified()) {
404 (elem)->peer1Address2 = ind->getRemoteAddr();
405 EV <<
"added peer1Address2=" << ind->getRemoteAddr() <<
"\n";
407 if (!(elem)->peer2Address1.isUnspecified()) {
408 if (!(elem)->multi || ((elem)->multi && !(elem)->peer2Address2.isUnspecified() && !(elem)->peer1Address2.isUnspecified())) {
409 EV <<
"entry now: Peer1=" << (elem)->peer1 <<
" Peer2=" << (elem)->peer2 <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
" peer2Port=" << (elem)->peer2Port <<
"\n";
416 else if ((elem)->peer2Assoc ==
assocId) {
417 EV <<
"opposite way: found entry for assoc2 = " <<
assocId <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
"\n";
419 (elem)->peer2Address2 = ind->getRemoteAddr();
421 if (!(elem)->multi || ((elem)->multi && !(elem)->peer2Address2.isUnspecified() && !(elem)->peer1Address2.isUnspecified())) {
422 EV <<
"entry now: Peer1=" << (elem)->peer1 <<
" Peer2=" << (elem)->peer2 <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
" peer1Port=" << (elem)->peer1Port <<
"peer2Port=" << (elem)->peer2Port <<
"\n";
428 else if ((elem)->peer2Assoc == 0 && ((elem)->multi)) {
429 (elem)->peer2Address2 = ind->getRemoteAddr();
431 (elem)->peer2Port = ind->getRemotePort();
432 (elem)->peer2Gate = ind->getGate();
433 EV <<
"entry now: Peer1=" << (elem)->peer1 <<
" Peer2=" << (elem)->peer2 <<
" peer1Address1=" << (elem)->peer1Address1 <<
" peer1Address2=" << (elem)->peer1Address2 <<
" peer2Address1=" << (elem)->peer2Address1 <<
" peer2Address2=" << (elem)->peer2Address2 <<
" peer1Port=" << (elem)->peer1Port <<
"peer2Port=" << (elem)->peer2Port <<
"\n";
439 else if (
natVector.size() == 0 && !found) {
440 EV <<
"make new Info for ";
444 EV << info->peer1 <<
" and assoc " <<
assocId <<
"\n";
446 info->peer1Address1 = L3Address();
447 info->peer1Address2 = ind->getRemoteAddr();
448 info->peer1Port = ind->getRemotePort();
449 info->peer1Gate = ind->getGate();
451 info->peer2Address1 = L3Address();
452 info->peer2Address2 = L3Address();
454 info->peer2Assoc = 0;
455 info->peer2Gate = -1;
457 EV <<
"Info: peer1=" << info->peer1 <<
" peer1Address1=" << info->peer1Address1 <<
" peer1Address2=" << info->peer1Address2 <<
" peer1Assoc=" << info->peer1Assoc <<
"\n peer2=" << info->peer1 <<
" peer2Address1=" << info->peer2Address1 <<
" peer2Address2=" << info->peer2Address2 <<
" peer2Assoc=" << info->peer2Assoc <<
"\n";