32}SOCKET_LIST, *PSOCKET_LIST;
33#define SOCKET_LIST_ALLOC() (PSOCKET_LIST)list_alloc(sizeof(SOCKET_LIST),offsetof(SOCKET_LIST,ele))
34#define SOCKET_LIST_NEXT(sl) (PSOCKET_LIST)LIST_NEXT(sl)
36static UINT socket_id = 0;
38static bool compare_socketaddr(PSOCKETADDRESS sa1, PSOCKETADDRESS sa2)
40 return !IP_COMPARE(sa1->ip, sa2->ip) &&
41 sa1->port == sa2->port;
44static bool compare_socket(PNETSIM_SOCKET s1, PNETSIM_SOCKET s2)
51 l = compare_socketaddr(s1->localAddr, s2->localAddr);
66 r = compare_socketaddr(s1->remoteAddr, s2->remoteAddr);
81static PSOCKET_LIST find_socket_list(NETSIM_ID devid, PNETSIM_SOCKET s)
83 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devid);
84 PSOCKET_LIST sl = tcp->socket_list;
87 if (compare_socket(sl->s, s))
89 sl = SOCKET_LIST_NEXT(sl);
94void add_to_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s)
96 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devId);
98 PSOCKET_LIST sl = find_socket_list(devId, s);
101 sl = SOCKET_LIST_ALLOC();
103 LIST_ADD_LAST(&tcp->socket_list, sl);
107void remove_from_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s)
109 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devId);
110 PSOCKET_LIST sl = find_socket_list(devId, s);
113 LIST_FREE(&tcp->socket_list, sl);
117PNETSIM_SOCKET find_socket(NETSIM_ID devId,
118 NETSIM_IPAddress srcIP,
119 NETSIM_IPAddress destIP,
136 PSOCKET_LIST psl = find_socket_list(devId, &s);
137 return psl ? psl->s : NULL;
140PNETSIM_SOCKET get_Remotesocket(NETSIM_ID d, PSOCKETADDRESS addr)
142 SOCKETADDRESS localAddr;
144 memset(&s, 0,
sizeof s);
147 localAddr.ip = DEVICE_NWADDRESS(d, 1);
149 s.localAddr = &localAddr;
151 PSOCKET_LIST psl = find_socket_list(d, &s);
152 return psl ? psl->s : NULL;
155PNETSIM_SOCKET find_socket_at_source(NetSim_PACKET* packet)
157 return find_socket(packet->nSourceId,
158 packet->pstruNetworkData->szSourceIP,
159 packet->pstruNetworkData->szDestIP,
160 packet->pstruTransportData->nSourcePort,
161 packet->pstruTransportData->nDestinationPort);
164PNETSIM_SOCKET find_socket_at_dest(NetSim_PACKET* packet)
167 s = find_socket(get_first_dest_from_packet(packet),
168 packet->pstruNetworkData->szDestIP,
169 packet->pstruNetworkData->szSourceIP,
170 packet->pstruTransportData->nDestinationPort,
171 packet->pstruTransportData->nSourcePort);
172 if (!s && isSynPacket(packet))
174 extern PSOCKETADDRESS anySocketAddr;
175 s = get_Remotesocket(get_first_dest_from_packet(packet), anySocketAddr);
180PNETSIM_SOCKET tcp_create_socket()
182 PNETSIM_SOCKET s = (PNETSIM_SOCKET)calloc(1,
sizeof* s);
183 s->SocketId = ++socket_id;
187void tcp_close_socket(PNETSIM_SOCKET s, NETSIM_ID devId)
191 print_tcp_log(
"Closing socket with local addr %s:%d, Remote addr %s:%d\n",
192 s->localAddr->ip->str_ip,
194 s->remoteAddr->ip->str_ip,
195 s->remoteAddr->port);
196 tcp_change_state(s, TCPCONNECTION_CLOSED);
199 remove_from_socket_list(devId, s);
201 if(s->remoteAddr->port)
206void tcp_connect(PNETSIM_SOCKET s,
207 PSOCKETADDRESS localAddr,
208 PSOCKETADDRESS remoteAddr)
210 s->localAddr = localAddr;
211 s->remoteAddr = remoteAddr;
212 tcp_create_metrics(s);
216void tcp_bind(PNETSIM_SOCKET s,
219 s->remoteAddr = addr;
224void tcp_listen(PNETSIM_SOCKET s,
225 void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET*))
227 s->listen_callback = listen_callback;
228 tcp_change_state(s, TCPCONNECTION_LISTEN);
231PNETSIM_SOCKET tcp_accept(PNETSIM_SOCKET s,
234 PNETSIM_SOCKET localSocket = tcp_create_socket();
236 add_to_socket_list(pstruEventDetails->nDeviceId, localSocket);
238 PSOCKETADDRESS remotesocketAddr = (PSOCKETADDRESS)calloc(1,
sizeof* remotesocketAddr);
239 remotesocketAddr->ip = IP_COPY(p->pstruNetworkData->szSourceIP);
240 remotesocketAddr->port = p->pstruTransportData->nSourcePort;
242 PSOCKETADDRESS localsocketAddr = (PSOCKETADDRESS)calloc(1,
sizeof* localsocketAddr);
243 localsocketAddr->ip = IP_COPY(p->pstruNetworkData->szDestIP);
244 localsocketAddr->port = p->pstruTransportData->nDestinationPort;
246 localSocket->localDeviceId = get_first_dest_from_packet(p);
247 localSocket->remoteDeviceId = p->nSourceId;
249 print_tcp_log(
"\nDevice %d, Time %0.2lf: creating socket with local addr %s:%d, Remote addr %s:%d",
250 localSocket->localDeviceId,
251 pstruEventDetails->dEventTime,
252 localsocketAddr->ip->str_ip,
253 localsocketAddr->port,
254 remotesocketAddr->ip->str_ip,
255 remotesocketAddr->port);
257 localSocket->localAddr = localsocketAddr;
258 localSocket->remoteAddr = remotesocketAddr;
260 localSocket->sId = fn_NetSim_Socket_GetSocketInterface(localSocket->localDeviceId,
263 localSocket->localAddr->port,
264 localSocket->remoteAddr->port);
266 tcp_create_metrics(localSocket);
268 tcp_passive_open(localSocket, s);
270 rcv_SYN(localSocket,p);
275void close_all_socket(NETSIM_ID devId)
277 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devId);
278 PSOCKET_LIST sl = tcp->socket_list;
281 tcp_close_socket(sl->s, devId);
282 sl = tcp->socket_list;
286void tcp_close(PNETSIM_SOCKET s)
288 if (!isAnySegmentInQueue(&s->tcb->retransmissionQueue))
291 tcp_change_state(s, TCPCONNECTION_FIN_WAIT_1);