NetSim Source Code Help
Loading...
Searching...
No Matches
TCP_Socket.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2022 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* This source code is licensed per the NetSim license agreement. *
12* *
13* No portion of this source code may be used as the basis for a derivative work, *
14* or used, for any purpose other than its intended use per the NetSim license *
15* agreement. *
16* *
17* This source code and the algorithms contained within it are confidential trade *
18* secrets of TETCOS and may not be used as the basis for any other software, *
19* hardware, product or service. *
20* *
21* Author: Shashi Kant Suman *
22* *
23* ----------------------------------------------------------------------------------*/
24#include "main.h"
25#include "TCP.h"
26#include "List.h"
27
28typedef struct stru_socket_list
29{
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)
35
36static UINT socket_id = 0;
37
39{
40 return !IP_COMPARE(sa1->ip, sa2->ip) &&
41 sa1->port == sa2->port;
42}
43
45{
46 bool l = false;
47 bool r = false;
48 if (s1->localAddr)
49 {
50 if (s2->localAddr)
52 else
53 return false;
54 }
55 else
56 {
57 if (s2->localAddr)
58 return false;
59 else
60 l = true;
61 }
62
63 if (s1->remoteAddr)
64 {
65 if (s2->remoteAddr)
67 else
68 return false;
69 }
70 else
71 {
72 if (s2->remoteAddr)
73 return false;
74 else
75 r = true;
76 }
77
78 return l && r;
79}
80
82{
83 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devid);
84 PSOCKET_LIST sl = tcp->socket_list;
85 while (sl)
86 {
87 if (compare_socket(sl->s, s))
88 return sl;
89 sl = SOCKET_LIST_NEXT(sl);
90 }
91 return NULL;
92}
93
95{
96 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devId);
97
98 PSOCKET_LIST sl = find_socket_list(devId, s);
99 if (!sl)
100 {
101 sl = SOCKET_LIST_ALLOC();
102 sl->s = s;
103 LIST_ADD_LAST(&tcp->socket_list, sl);
104 }
105}
106
108{
109 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devId);
110 PSOCKET_LIST sl = find_socket_list(devId, s);
111 if (sl)
112 {
113 LIST_FREE(&tcp->socket_list, sl);
114 }
115}
116
118 NETSIM_IPAddress srcIP,
119 NETSIM_IPAddress destIP,
120 UINT16 srcPort,
121 UINT16 destPort)
122{
124
125 SOCKETADDRESS ssa;
126 ssa.ip = srcIP;
127 ssa.port = srcPort;
128
129 SOCKETADDRESS dsa;
130 dsa.ip = destIP;
131 dsa.port = destPort;
132
133 s.localAddr = &ssa;
134 s.remoteAddr = &dsa;
135
136 PSOCKET_LIST psl = find_socket_list(devId, &s);
137 return psl ? psl->s : NULL;
138}
139
141{
142 SOCKETADDRESS localAddr;
144 memset(&s, 0, sizeof s);
145 s.remoteAddr = addr;
146
147 localAddr.ip = DEVICE_NWADDRESS(d, 1);
148 localAddr.port = 0;
149 s.localAddr = &localAddr;
150
151 PSOCKET_LIST psl = find_socket_list(d, &s);
152 return psl ? psl->s : NULL;
153}
154
156{
157 return find_socket(packet->nSourceId,
159 packet->pstruNetworkData->szDestIP,
162}
163
165{
168 packet->pstruNetworkData->szDestIP,
172 if (!s && isSynPacket(packet))
173 {
176 }
177 return s;
178}
179
181{
182 PNETSIM_SOCKET s = (PNETSIM_SOCKET)calloc(1, sizeof* s);
183 s->SocketId = ++socket_id;
184 return s;
185}
186
188{
189 if (s->tcb)
190 {
191 print_tcp_log("Closing socket with local addr %s:%d, Remote addr %s:%d\n",
192 s->localAddr->ip->str_ip,
193 s->localAddr->port,
194 s->remoteAddr->ip->str_ip,
195 s->remoteAddr->port);
197 free_tcb(s->tcb);
198 }
199 remove_from_socket_list(devId, s);
200 free(s->localAddr);
201 if(s->remoteAddr->port)
202 free(s->remoteAddr);
203 free(s);
204}
205
207 PSOCKETADDRESS localAddr,
208 PSOCKETADDRESS remoteAddr)
209{
210 s->localAddr = localAddr;
211 s->remoteAddr = remoteAddr;
214}
215
217 PSOCKETADDRESS addr)
218{
219 s->remoteAddr = addr;
220 create_TCB(s);
221 return;
222}
223
225 void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET*))
226{
227 s->listen_callback = listen_callback;
229}
230
232 NetSim_PACKET* p)
233{
234 PNETSIM_SOCKET localSocket = tcp_create_socket();
235
237
238 PSOCKETADDRESS remotesocketAddr = (PSOCKETADDRESS)calloc(1, sizeof* remotesocketAddr);
239 remotesocketAddr->ip = IP_COPY(p->pstruNetworkData->szSourceIP);
240 remotesocketAddr->port = p->pstruTransportData->nSourcePort;
241
242 PSOCKETADDRESS localsocketAddr = (PSOCKETADDRESS)calloc(1, sizeof* localsocketAddr);
243 localsocketAddr->ip = IP_COPY(p->pstruNetworkData->szDestIP);
244 localsocketAddr->port = p->pstruTransportData->nDestinationPort;
245
247 localSocket->remoteDeviceId = p->nSourceId;
248
249 print_tcp_log("\nDevice %d, Time %0.2lf: creating socket with local addr %s:%d, Remote addr %s:%d",
250 localSocket->localDeviceId,
252 localsocketAddr->ip->str_ip,
253 localsocketAddr->port,
254 remotesocketAddr->ip->str_ip,
255 remotesocketAddr->port);
256
257 localSocket->localAddr = localsocketAddr;
258 localSocket->remoteAddr = remotesocketAddr;
259
260 localSocket->sId = fn_NetSim_Socket_GetSocketInterface(localSocket->localDeviceId,
261 0,
263 localSocket->localAddr->port,
264 localSocket->remoteAddr->port);
265
266 tcp_create_metrics(localSocket);
267
268 tcp_passive_open(localSocket, s);
269
270 rcv_SYN(localSocket,p);
271
272 return localSocket;
273}
274
276{
277 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(devId);
278 PSOCKET_LIST sl = tcp->socket_list;
279 while (sl)
280 {
281 tcp_close_socket(sl->s, devId);
282 sl = tcp->socket_list;
283 }
284}
285
287{
289 {
290 send_fin(s);
292 }
293}
unsigned int NETSIM_ID
Definition: Animation.h:45
NETSIM_IPAddress IP_COPY(NETSIM_IPAddress ip)
#define IP_COMPARE(ip1, ip2)
Definition: IP_Addressing.h:67
#define UINT
Definition: Linux.h:38
#define UINT16
Definition: Linux.h:33
#define LIST_ADD_LAST(ls, mem)
Definition: List.h:30
#define LIST_FREE(ls, mem)
Definition: List.h:32
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
NETSIM_ID get_first_dest_from_packet(NetSim_PACKET *packet)
#define DEVICE_NWADDRESS(DeviceId, InterfaceId)
Definition: Stack.h:805
@ TX_PROTOCOL_TCP
Definition: Stack.h:180
ptrSOCKETINTERFACE fn_NetSim_Socket_GetSocketInterface(NETSIM_ID deviceId, APPLICATION_LAYER_PROTOCOL appProtocol, TRANSPORT_LAYER_PROTOCOL trxProtocol, UINT16 localPort, UINT16 remotePort)
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
bool isAnySegmentInQueue(PTCP_QUEUE queue)
Definition: TCB.c:348
void create_TCB(PNETSIM_SOCKET s)
Definition: TCB.c:90
void tcp_change_state(PNETSIM_SOCKET s, TCP_CONNECTION_STATE state)
Definition: TCB.c:138
void free_tcb(PTCB tcb)
Definition: TCB.c:126
void rcv_SYN(PNETSIM_SOCKET s, NetSim_PACKET *syn)
static PTCP_DEV_VAR GET_TCP_DEV_VAR(NETSIM_ID d)
Definition: TCP.h:167
void tcp_active_open(PNETSIM_SOCKET s)
void send_fin(PNETSIM_SOCKET s)
@ TCPCONNECTION_LISTEN
Definition: TCP.h:59
@ TCPCONNECTION_CLOSED
Definition: TCP.h:58
@ TCPCONNECTION_FIN_WAIT_1
Definition: TCP.h:63
void print_tcp_log(char *format,...)
bool isSynPacket(NetSim_PACKET *packet)
Definition: TCP_Packet.c:28
struct stru_socket_addr * PSOCKETADDRESS
void tcp_create_metrics(PNETSIM_SOCKET s)
void tcp_passive_open(PNETSIM_SOCKET s, PNETSIM_SOCKET ls)
PSOCKETADDRESS anySocketAddr
#define PNETSIM_SOCKET
Definition: TCP_Header.h:24
void tcp_close(PNETSIM_SOCKET s)
Definition: TCP_Socket.c:286
PNETSIM_SOCKET tcp_accept(PNETSIM_SOCKET s, NetSim_PACKET *p)
Definition: TCP_Socket.c:231
void add_to_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s)
Definition: TCP_Socket.c:94
void remove_from_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s)
Definition: TCP_Socket.c:107
static UINT socket_id
Definition: TCP_Socket.c:36
static bool compare_socket(PNETSIM_SOCKET s1, PNETSIM_SOCKET s2)
Definition: TCP_Socket.c:44
void tcp_connect(PNETSIM_SOCKET s, PSOCKETADDRESS localAddr, PSOCKETADDRESS remoteAddr)
Definition: TCP_Socket.c:206
PNETSIM_SOCKET find_socket(NETSIM_ID devId, NETSIM_IPAddress srcIP, NETSIM_IPAddress destIP, UINT16 srcPort, UINT16 destPort)
Definition: TCP_Socket.c:117
struct stru_socket_list SOCKET_LIST
struct stru_socket_list * PSOCKET_LIST
PNETSIM_SOCKET find_socket_at_dest(NetSim_PACKET *packet)
Definition: TCP_Socket.c:164
#define SOCKET_LIST_NEXT(sl)
Definition: TCP_Socket.c:34
PNETSIM_SOCKET get_Remotesocket(NETSIM_ID d, PSOCKETADDRESS addr)
Definition: TCP_Socket.c:140
void tcp_bind(PNETSIM_SOCKET s, PSOCKETADDRESS addr)
Definition: TCP_Socket.c:216
void tcp_listen(PNETSIM_SOCKET s, void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET *))
Definition: TCP_Socket.c:224
static bool compare_socketaddr(PSOCKETADDRESS sa1, PSOCKETADDRESS sa2)
Definition: TCP_Socket.c:38
#define SOCKET_LIST_ALLOC()
Definition: TCP_Socket.c:33
PNETSIM_SOCKET find_socket_at_source(NetSim_PACKET *packet)
Definition: TCP_Socket.c:155
static PSOCKET_LIST find_socket_list(NETSIM_ID devid, PNETSIM_SOCKET s)
Definition: TCP_Socket.c:81
void tcp_close_socket(PNETSIM_SOCKET s, NETSIM_ID devId)
Definition: TCP_Socket.c:187
void close_all_socket(NETSIM_ID devId)
Definition: TCP_Socket.c:275
PNETSIM_SOCKET tcp_create_socket()
Definition: TCP_Socket.c:180
Definition: List.h:43
NETSIM_ID nDeviceId
Definition: Stack.h:750
NETSIM_IPAddress szDestIP
Definition: Packet.h:199
NETSIM_IPAddress szSourceIP
Definition: Packet.h:198
unsigned short int nSourcePort
Definition: Packet.h:184
unsigned short int nDestinationPort
Definition: Packet.h:185
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
struct stru_NetSim_Packet_TransportLayer * pstruTransportData
Definition: Packet.h:274
NETSIM_ID nSourceId
Definition: Packet.h:263
PTCB tcb
Definition: TCP.h:132
PSOCKETADDRESS localAddr
Definition: TCP.h:121
NETSIM_ID remoteDeviceId
Definition: TCP.h:126
NETSIM_ID localDeviceId
Definition: TCP.h:125
PSOCKETADDRESS remoteAddr
Definition: TCP.h:122
void(* listen_callback)(struct stru_TCP_Socket *s, NetSim_PACKET *)
Definition: TCP.h:138
UINT SocketId
Definition: TCP.h:120
ptrSOCKETINTERFACE sId
Definition: TCP.h:127
void * socket_list
Definition: TCP.h:146
char str_ip[_NETSIM_IP_LEN]
Definition: IP_Addressing.h:54
NETSIM_IPAddress ip
Definition: TCP.h:114
UINT16 port
Definition: TCP.h:115
PNETSIM_SOCKET s
Definition: TCP_Socket.c:30