NetSim Source Code Help
Loading...
Searching...
No Matches
TCP_ApplicationInterface.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
28//Function prototype
31
33
35{
37 anySocketAddr->ip = STR_TO_IP("0.0.0.0", 4);
39}
40
42{
43 return anySocketAddr;
44}
45
47{
48 if (!get_anysockaddr())
50
51 print_tcp_log("\nDevice %d, Time 0.0: Create socket for listen mode with remote addr 0.0.0.0:0", d);
52
54
56
57 PSOCKETADDRESS localsocketAddr = (PSOCKETADDRESS)calloc(1, sizeof* localsocketAddr);
58 localsocketAddr->ip = DEVICE_NWADDRESS(d,1);
59 localsocketAddr->port = 0;
60
61 listenSocket->localAddr = localsocketAddr;
62
63 listenSocket->localDeviceId = d;
64
65 print_tcp_log("Binding listen socket", d);
66
68
69 print_tcp_log("Listening...", d);
71
73
74}
75
77{
78 NetSim_PACKET* packet = GET_PACKET_FROM_APP(false);
79
81
83
84 if (!s)
85 {
86
87 PNETSIM_SOCKET localSocket = tcp_create_socket();
88
90
91 PSOCKETADDRESS remotesocketAddr = (PSOCKETADDRESS)calloc(1, sizeof* remotesocketAddr);
92 remotesocketAddr->ip = IP_COPY(packet->pstruNetworkData->szDestIP);
93 remotesocketAddr->port = packet->pstruTransportData->nDestinationPort;
94
95 PSOCKETADDRESS localsocketAddr = (PSOCKETADDRESS)calloc(1, sizeof* localsocketAddr);
96 localsocketAddr->ip = IP_COPY(packet->pstruNetworkData->szSourceIP);
97 localsocketAddr->port = packet->pstruTransportData->nSourcePort;
98
99 localSocket->localDeviceId = packet->nSourceId;
100 localSocket->remoteDeviceId = get_first_dest_from_packet(packet);
101 localSocket->sId = sId;
102 localSocket->appId = pstruEventDetails->nApplicationId;
103
104 print_tcp_log("\nDevice %d, Time %0.2lf: Creating socket with local addr %s:%d, Remote addr %s:%d",
105 packet->nSourceId,
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);
113
114 }
115 else if (s->waitFromApp)
116 {
117 print_tcp_log("\nDevice %d, Time %0.2lf:",
118 packet->nSourceId,
120
121 if (!s->sId)
122 {
124 s->sId = sId;
125 }
126 else if (s->sId != sId)
127 {
128 fnNetSimError("Socket id in TCP (%d) and in application (%d) is mismatched.\n",
129 s->sId, sId);
130 }
131 send_segment(s);
132 s->waitFromApp = false;
133 }
134 else
135 {
136 //do nothing. Wait for TCP to complete previous operation
137 }
138 return 0;
139}
140
142{
143 print_tcp_log("Accepting Connection...");
144 PNETSIM_SOCKET localSocket = tcp_accept(s, p);
145}
146
148{
149 NetSim_EVENTDETAILS pevent;
150
151 if (p->pstruAppData) //Send only app layer packet
152 {
153 memcpy(&pevent, pstruEventDetails, sizeof pevent);
157 pevent.nPacketId = p->nPacketId;
160 pevent.nSubEventType = 0;
161 pevent.pPacket = p;
162 pevent.szOtherDetails = NULL;
163 fnpAddEvent(&pevent);
164 }
165
166 NetSim_PACKET* pr;
167 while(true)
168 {
170 if (!pr)
171 break;
172
173 if(!pr->pstruAppData)
174 continue;
175
176 memcpy(&pevent, pstruEventDetails, sizeof pevent);
180 pevent.nPacketId = pr->nPacketId;
182 pevent.nSegmentId = pr->pstruAppData->nSegmentId;
183 pevent.nSubEventType = 0;
184 pevent.pPacket = pr;
185 pevent.szOtherDetails = NULL;
186 fnpAddEvent(&pevent);
187
188 }
189}
unsigned int NETSIM_ID
Definition: Animation.h:45
NETSIM_IPAddress IP_COPY(NETSIM_IPAddress ip)
NETSIM_IPAddress STR_TO_IP(char *ipStr, int type)
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define calloc(c, s)
Definition: Memory.h:29
NETSIM_ID get_first_dest_from_packet(NetSim_PACKET *packet)
SOCKET listenSocket
Definition: Socket.c:15
#define PROTOCOL_APPLICATION
Definition: Stack.h:143
#define DEVICE_NWADDRESS(DeviceId, InterfaceId)
Definition: Stack.h:805
@ APPLICATION_IN_EVENT
Definition: Stack.h:113
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
NetSim_PACKET * check_for_other_segment_to_send_from_queue(PNETSIM_SOCKET s)
Definition: TCB.c:388
NetSim_PACKET * GET_PACKET_FROM_APP(bool isRemove)
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 tcp_connect(PNETSIM_SOCKET s, PSOCKETADDRESS localAddr, PSOCKETADDRESS remoteAddr)
Definition: TCP_Socket.c:206
void print_tcp_log(char *format,...)
void send_segment(PNETSIM_SOCKET s)
Definition: TCP_Outgoing.c:18
struct stru_socket_addr * PSOCKETADDRESS
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
void tcp_create_metrics(PNETSIM_SOCKET s)
PNETSIM_SOCKET find_socket_at_source(NetSim_PACKET *packet)
Definition: TCP_Socket.c:155
PNETSIM_SOCKET tcp_create_socket()
Definition: TCP_Socket.c:180
void send_to_application(PNETSIM_SOCKET s, NetSim_PACKET *p)
void fnConnectCallback(PNETSIM_SOCKET s)
PSOCKETADDRESS anySocketAddr
void init_anysockaddr()
int packet_arrive_from_application_layer()
PSOCKETADDRESS get_anysockaddr()
void fnListenCallback(PNETSIM_SOCKET s, NetSim_PACKET *)
void tcp_init(NETSIM_ID d)
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
NETSIM_ID nApplicationId
Definition: Stack.h:752
EVENT_TYPE nEventType
Definition: Stack.h:747
NETSIM_ID nProtocolId
Definition: Stack.h:748
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
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
long long int nPacketId
Definition: Packet.h:256
struct stru_NetSim_Packet_AppLayer * pstruAppData
Definition: Packet.h:273
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
bool waitFromApp
Definition: TCP.h:128
NETSIM_ID remoteDeviceId
Definition: TCP.h:126
NETSIM_ID localDeviceId
Definition: TCP.h:125
NETSIM_ID appId
Definition: TCP.h:130
ptrSOCKETINTERFACE sId
Definition: TCP.h:127
char str_ip[_NETSIM_IP_LEN]
Definition: IP_Addressing.h:54
NETSIM_IPAddress ip
Definition: TCP.h:114
UINT16 port
Definition: TCP.h:115