NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OpenFlowMsg.c
1/************************************************************************************
2* Copyright (C) 2023 *
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* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14#include "main.h"
15#include "OpenFlow.h"
16
17static NetSim_PACKET* openFlow_CreatePacket(OFMSGTYPE type,
18 UINT id,
19 NETSIM_ID src,
20 NETSIM_ID dest,
21 NETSIM_IPAddress srcIP,
22 NETSIM_IPAddress destIP,
23 UINT16 srcPort,
24 UINT16 destPort,
25 void* payload,
26 int len,
27 bool isMore)
28{
29 NetSim_PACKET* packet = fn_NetSim_Packet_CreatePacket(APPLICATION_LAYER);
30 packet->dEventTime = pstruEventDetails->dEventTime;
31 packet->nControlDataType = type;
32 packet->nPacketPriority = Priority_Normal;
33 packet->nPacketStatus = PacketStatus_NoError;
34 packet->nPacketType = PacketType_Control;
35 packet->nQOS = QOS_BE;
36 packet->nServiceType = ServiceType_NULL;
37 packet->nSourceId = src;
38 packet->nTransmitterId = src;
39
40 packet->pstruAppData->dArrivalTime = pstruEventDetails->dEventTime;
41 packet->pstruAppData->dEndTime = pstruEventDetails->dEventTime;
42 packet->pstruAppData->dStartTime = pstruEventDetails->dEventTime;
43 packet->pstruAppData->dPayload = len;
44 packet->pstruAppData->dOverhead = OFMSG_OVERHEAD;
45 packet->pstruAppData->dPacketSize = packet->pstruAppData->dPayload +
46 packet->pstruAppData->dOverhead;
47 packet->pstruAppData->nApplicationProtocol = APP_PROTOCOL_OPENFLOW;
48 packet->pstruAppData->nPacketFragment = Segment_Unfragment;
49
50 add_dest_to_packet(packet, dest);
51
52 packet->pstruTransportData->nSourcePort = srcPort;
53 packet->pstruTransportData->nDestinationPort = destPort;
54
55 packet->pstruNetworkData->szDestIP = destIP;
56 packet->pstruNetworkData->szSourceIP = srcIP;
57 packet->pstruNetworkData->nTTL = MAX_TTL;
58
59
60 ptrOPENFLOWMSG ofmsg = calloc(1, sizeof* ofmsg);
61 ofmsg->payload = payload;
62 ofmsg->id = id;
63 ofmsg->len = len;
64 ofmsg->msgTYpe = OFMSGTYPE_COMMAND;
65 ofmsg->isMore = isMore;
66
67 packet->pstruAppData->Packet_AppProtocol = ofmsg;
68
69 return packet;
70}
71
72static void openFlow_send_packet(NETSIM_ID d,
73 NetSim_PACKET* packet,
74 ptrSOCKETINTERFACE sock)
75{
76 if (!DEVICE(d)->pstruTransportLayer->isTCP)
77 {
78 fnNetSimError("TCP is disabled for device %d.\n"
79 "Open flow protocol will run only over TCP.",
80 DEVICE_CONFIGID(d));
81 fn_NetSim_Packet_FreePacket(packet);
82 return;
83 }
84
85 NETSIM_ID dest = get_first_dest_from_packet(packet);
86 if (!DEVICE(dest)->pstruTransportLayer->isTCP)
87 {
88 fnNetSimError("TCP is disabled for device %d.\n"
89 "Open flow protocol will run only over TCP.",
90 DEVICE_CONFIGID(dest));
91 fn_NetSim_Packet_FreePacket(packet);
92 return;
93 }
94
95 int nSegmentCount=fn_NetSim_Stack_FragmentPacket(packet,(int)fn_NetSim_Stack_GetMSS(packet));
96 nSegmentCount;
97 fn_NetSim_Socket_PassPacketToInterface(d, packet, sock);
98 NetSim_EVENTDETAILS pevent;
99 memset(&pevent, 0, sizeof pevent);
100 pevent.dEventTime = pstruEventDetails->dEventTime;
101 pevent.dPacketSize = packet->pstruAppData->dPacketSize;
102 pevent.nDeviceId = d;
103 pevent.nDeviceType = DEVICE_TYPE(d);
104 pevent.nEventType = TRANSPORT_OUT_EVENT;
105 pevent.nProtocolId = TX_PROTOCOL_TCP;
106 pevent.pPacket = packet;
107 pevent.szOtherDetails = sock;
108 fnpAddEvent(&pevent);
109}
110
111bool fn_NetSim_OPEN_FLOW_SendCommand(NETSIM_ID dest,
112 void* handle,
113 void* command,
114 UINT len)
115{
116 ptrOPENFLOW of = GET_OPENFLOW_VAR(pstruEventDetails->nDeviceId);
117 ptrSDNCLIENTINFO sd = openFlow_find_clientInfo(pstruEventDetails->nDeviceId, dest);
118 if (!sd)
119 {
120 fnNetSimError("%d is not a SDN controller for device %d.\n",
121 DEVICE_CONFIGID(pstruEventDetails->nDeviceId),
122 DEVICE_CONFIGID(dest));
123 return false;
124 }
125
126 NetSim_PACKET* packet = openFlow_CreatePacket(OFMSGTYPE_COMMAND,
127 ++of->msgId,
128 pstruEventDetails->nDeviceId,
129 sd->clientId,
130 of->myIP,
131 sd->clientIP,
132 OFMSG_PORT,
133 sd->clientPort,
134 command,
135 len,
136 false);
137
138 openFlow_saveHandle(pstruEventDetails->nDeviceId, of->msgId, handle);
139 openFlow_send_packet(pstruEventDetails->nDeviceId,
140 packet,
141 sd->sock);
142
143 return true;
144}
145
146void openFlow_send_response(NETSIM_ID dev,
147 UINT id,
148 char* payload,
149 int len,
150 bool isMore)
151{
152 ptrOPENFLOW of = GET_OPENFLOW_VAR(dev);
153 NetSim_PACKET* response = openFlow_CreatePacket(OFMSGTYPE_RESPONSE,
154 id,
155 dev,
156 of->INFO.controllerInfo->controllerId,
157 of->myIP,
158 of->INFO.controllerInfo->controllerIP,
159 of->INFO.controllerInfo->port,
160 OFMSG_PORT,
161 payload,
162 len,
163 isMore);
164 openFlow_send_packet(dev,
165 response,
166 of->INFO.controllerInfo->sock);
167}