17static NetSim_PACKET* openFlow_CreatePacket(OFMSGTYPE type,
21 NETSIM_IPAddress srcIP,
22 NETSIM_IPAddress destIP,
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;
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;
50 add_dest_to_packet(packet, dest);
52 packet->pstruTransportData->nSourcePort = srcPort;
53 packet->pstruTransportData->nDestinationPort = destPort;
55 packet->pstruNetworkData->szDestIP = destIP;
56 packet->pstruNetworkData->szSourceIP = srcIP;
57 packet->pstruNetworkData->nTTL = MAX_TTL;
60 ptrOPENFLOWMSG ofmsg = calloc(1,
sizeof* ofmsg);
61 ofmsg->payload = payload;
64 ofmsg->msgTYpe = OFMSGTYPE_COMMAND;
65 ofmsg->isMore = isMore;
67 packet->pstruAppData->Packet_AppProtocol = ofmsg;
72static void openFlow_send_packet(NETSIM_ID d,
73 NetSim_PACKET* packet,
74 ptrSOCKETINTERFACE sock)
76 if (!DEVICE(d)->pstruTransportLayer->isTCP)
78 fnNetSimError(
"TCP is disabled for device %d.\n"
79 "Open flow protocol will run only over TCP.",
81 fn_NetSim_Packet_FreePacket(packet);
85 NETSIM_ID dest = get_first_dest_from_packet(packet);
86 if (!DEVICE(dest)->pstruTransportLayer->isTCP)
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);
95 int nSegmentCount=fn_NetSim_Stack_FragmentPacket(packet,(
int)fn_NetSim_Stack_GetMSS(packet));
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);
111bool fn_NetSim_OPEN_FLOW_SendCommand(NETSIM_ID dest,
116 ptrOPENFLOW of = GET_OPENFLOW_VAR(pstruEventDetails->nDeviceId);
117 ptrSDNCLIENTINFO sd = openFlow_find_clientInfo(pstruEventDetails->nDeviceId, dest);
120 fnNetSimError(
"%d is not a SDN controller for device %d.\n",
121 DEVICE_CONFIGID(pstruEventDetails->nDeviceId),
122 DEVICE_CONFIGID(dest));
126 NetSim_PACKET* packet = openFlow_CreatePacket(OFMSGTYPE_COMMAND,
128 pstruEventDetails->nDeviceId,
138 openFlow_saveHandle(pstruEventDetails->nDeviceId, of->msgId, handle);
139 openFlow_send_packet(pstruEventDetails->nDeviceId,
146void openFlow_send_response(NETSIM_ID dev,
152 ptrOPENFLOW of = GET_OPENFLOW_VAR(dev);
153 NetSim_PACKET* response = openFlow_CreatePacket(OFMSGTYPE_RESPONSE,
156 of->INFO.controllerInfo->controllerId,
158 of->INFO.controllerInfo->controllerIP,
159 of->INFO.controllerInfo->port,
164 openFlow_send_packet(dev,
166 of->INFO.controllerInfo->sock);