29void fnConnectCallback(PNETSIM_SOCKET s);
30void fnListenCallback(PNETSIM_SOCKET s, NetSim_PACKET*);
32PSOCKETADDRESS anySocketAddr = NULL;
34void init_anysockaddr()
36 anySocketAddr = (PSOCKETADDRESS)calloc(1,
sizeof* anySocketAddr);
37 anySocketAddr->ip = STR_TO_IP(
"0.0.0.0", 4);
38 anySocketAddr->port = 0;
41PSOCKETADDRESS get_anysockaddr()
46void tcp_init(NETSIM_ID d)
48 if (!get_anysockaddr())
51 print_tcp_log(
"\nDevice %d, Time 0.0: Create socket for listen mode with remote addr 0.0.0.0:0", d);
53 PNETSIM_SOCKET listenSocket = tcp_create_socket();
55 add_to_socket_list(d, listenSocket);
57 PSOCKETADDRESS localsocketAddr = (PSOCKETADDRESS)calloc(1,
sizeof* localsocketAddr);
58 localsocketAddr->ip = DEVICE_NWADDRESS(d,1);
59 localsocketAddr->port = 0;
61 listenSocket->localAddr = localsocketAddr;
63 listenSocket->localDeviceId = d;
65 print_tcp_log(
"Binding listen socket", d);
67 tcp_bind(listenSocket, get_anysockaddr());
69 print_tcp_log(
"Listening...", d);
70 tcp_listen(listenSocket, fnListenCallback);
72 tcp_create_metrics(listenSocket);
76int packet_arrive_from_application_layer()
78 NetSim_PACKET* packet = GET_PACKET_FROM_APP(
false);
80 ptrSOCKETINTERFACE sId = pstruEventDetails->szOtherDetails;
82 PNETSIM_SOCKET s = find_socket_at_source(packet);
87 PNETSIM_SOCKET localSocket = tcp_create_socket();
89 add_to_socket_list(pstruEventDetails->nDeviceId, localSocket);
91 PSOCKETADDRESS remotesocketAddr = (PSOCKETADDRESS)calloc(1,
sizeof* remotesocketAddr);
92 remotesocketAddr->ip = IP_COPY(packet->pstruNetworkData->szDestIP);
93 remotesocketAddr->port = packet->pstruTransportData->nDestinationPort;
95 PSOCKETADDRESS localsocketAddr = (PSOCKETADDRESS)calloc(1,
sizeof* localsocketAddr);
96 localsocketAddr->ip = IP_COPY(packet->pstruNetworkData->szSourceIP);
97 localsocketAddr->port = packet->pstruTransportData->nSourcePort;
99 localSocket->localDeviceId = packet->nSourceId;
100 localSocket->remoteDeviceId = get_first_dest_from_packet(packet);
101 localSocket->sId = sId;
102 localSocket->appId = pstruEventDetails->nApplicationId;
104 print_tcp_log(
"\nDevice %d, Time %0.2lf: Creating socket with local addr %s:%d, Remote addr %s:%d",
106 pstruEventDetails->dEventTime,
107 localsocketAddr->ip->str_ip,
108 localsocketAddr->port,
109 remotesocketAddr->ip->str_ip,
110 remotesocketAddr->port);
111 print_tcp_log(
"Connecting socket...", packet->nSourceId);
112 tcp_connect(localSocket,localsocketAddr,remotesocketAddr);
115 else if (s->waitFromApp)
117 print_tcp_log(
"\nDevice %d, Time %0.2lf:",
119 pstruEventDetails->dEventTime);
123 s->appId = pstruEventDetails->nApplicationId;
126 else if (s->sId != sId)
128 fnNetSimError(
"Socket id in TCP (%d) and in application (%d) is mismatched.\n",
132 s->waitFromApp =
false;
141void fnListenCallback(PNETSIM_SOCKET s, NetSim_PACKET* p)
143 print_tcp_log(
"Accepting Connection...");
144 PNETSIM_SOCKET localSocket = tcp_accept(s, p);
147void send_to_application(PNETSIM_SOCKET s, NetSim_PACKET* p)
149 NetSim_EVENTDETAILS pevent;
153 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
154 pevent.dPacketSize = p->pstruAppData->dPacketSize;
155 pevent.nApplicationId = p->pstruAppData->nApplicationId;
156 pevent.nEventType = APPLICATION_IN_EVENT;
157 pevent.nPacketId = p->nPacketId;
158 pevent.nProtocolId = PROTOCOL_APPLICATION;
159 pevent.nSegmentId = p->pstruAppData->nSegmentId;
160 pevent.nSubEventType = 0;
162 pevent.szOtherDetails = NULL;
163 fnpAddEvent(&pevent);
169 pr = check_for_other_segment_to_send_from_queue(s);
173 if(!pr->pstruAppData)
176 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
177 pevent.dPacketSize = pr->pstruAppData->dPacketSize;
178 pevent.nApplicationId = pr->pstruAppData->nApplicationId;
179 pevent.nEventType = APPLICATION_IN_EVENT;
180 pevent.nPacketId = pr->nPacketId;
181 pevent.nProtocolId = PROTOCOL_APPLICATION;
182 pevent.nSegmentId = pr->pstruAppData->nSegmentId;
183 pevent.nSubEventType = 0;
185 pevent.szOtherDetails = NULL;
186 fnpAddEvent(&pevent);