16#include "../Firewall/Firewall.h"
18static ptrETH_LAN get_vlan(NETSIM_ID d, UINT16 vlanId)
20 ptrETH_VAR eth = GET_ETH_VAR(d);
25 for (i = 0; i < eth->lanCount; i++)
27 ptrETH_LAN lan = eth->lanVar[i];
28 if (lan->vlanId == vlanId)
34bool isVLANTagPresent(NetSim_PACKET* packet)
36 ptrIEEE801_1Q_TAG tag = get_eth_hdr_var(packet);
38 return tag->TPId == VLAN_TPID;
43VLANPORT vlan_port_type_from_str(
char* val)
45 if (!_stricmp(val,
"ACCESS_PORT"))
46 return VLANPORT_ACCESS;
47 else if (!_stricmp(val,
"TRUNK_PORT"))
48 return VLANPORT_TRUNK;
53void vlan_add_trunk_port(ptrETH_VAR eth, NETSIM_ID in)
55 if (eth->trunkPortCount)
56 eth->trunkPortIds = realloc(eth->trunkPortIds,
57 (eth->trunkPortCount + 1) *
sizeof* eth->trunkPortIds);
59 eth->trunkPortIds = calloc(1,
sizeof* eth->trunkPortIds);
60 eth->trunkPortIds[eth->trunkPortCount] = in;
61 eth->trunkPortCount++;
64static bool is_port_present_in_lan(ptrETH_LAN lan, NETSIM_ID in)
67 for (i = 0; i < lan->interfaceCount; i++)
69 if (lan->interfaceId[i] == in)
75void free_vtag(
void* tag)
77 free((ptrIEEE801_1Q_TAG)tag);
80void* copy_vtag(
void* tag)
82 ptrIEEE801_1Q_TAG t = calloc(1,
sizeof* t);
83 memcpy(t, tag,
sizeof* t);
87static void add_vlan_tag(NetSim_PACKET* packet, UINT16 vlanId)
89 ptrIEEE801_1Q_TAG tag = calloc(1,
sizeof* tag);
90 tag->TPId = VLAN_TPID;
92 set_eth_hdr(packet, ETH_HDR_VID, tag, copy_vtag, free_vtag);
93 packet->pstruMacData->dOverhead += IEEE801_1Q_TAG_LEN;
94 packet->pstruMacData->dPacketSize = packet->pstruMacData->dOverhead +
95 packet->pstruMacData->dPayload;
98static void remove_vlan_tag(NetSim_PACKET* packet)
100 free_eth_hdr(packet);
101 packet->pstruMacData->dOverhead -= IEEE801_1Q_TAG_LEN;
102 packet->pstruMacData->dPacketSize = packet->pstruMacData->dOverhead +
103 packet->pstruMacData->dPayload;
106void vlan_forward_to_all_trunk(NETSIM_ID d,
107 NetSim_PACKET* packet,
111 ptrETH_VAR eth = GET_ETH_VAR(d);
115 NETSIM_ID incoming = eth_get_incoming_port(packet, d);
116 UINT16 vlanId = eth_get_incoming_vlanid(packet, d);
119 for (i = 0; i < eth->trunkPortCount; i++)
121 NETSIM_ID inter = eth->trunkPortIds[i];
123 if (is_port_present_in_lan(lan, inter))
126 if(inter == incoming)
129 ptrETH_LAN l = GET_ETH_LAN(d, inter, 0);
130 ptrETH_IF iif = GET_ETH_IF(l, inter);
132 if (iif->portState == PORTSTATE_BLOCKING)
135 if (fn_NetSim_MAC_Firewall(d, inter, packet, ACLTYPE_OUTBOUND) == ACLACTION_PERMIT)
137 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
138 clear_eth_incoming(p);
139 add_vlan_tag(p, vlanId);
140 send_to_phy(d, inter, p, time);
145void vlan_forward_to_trunk(NETSIM_ID d,
148 NetSim_PACKET* packet,
151 ptrETH_VAR eth = GET_ETH_VAR(d);
156 for (i = 0; i < eth->trunkPortCount; i++)
158 NETSIM_ID inter = eth->trunkPortIds[i];
163 ptrETH_LAN l = GET_ETH_LAN(d, inter, 0);
164 ptrETH_IF iif = GET_ETH_IF(l, inter);
166 if (iif->portState == PORTSTATE_BLOCKING)
169 if (fn_NetSim_MAC_Firewall(d, inter, packet, ACLTYPE_OUTBOUND) == ACLACTION_PERMIT)
171 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
172 clear_eth_incoming(p);
173 add_vlan_tag(p, vlanId);
174 send_to_phy(d, inter, p, time);
179void vlan_macin_forward_packet()
181 NETSIM_ID d = pstruEventDetails->nDeviceId;
182 NETSIM_ID in = pstruEventDetails->nInterfaceId;
183 double time = pstruEventDetails->dEventTime;
184 NetSim_PACKET* packet = pstruEventDetails->pPacket;
187 UINT16 vlanId = eth_get_incoming_vlanid(packet, d);
188 lan = GET_ETH_LAN(d, in, 0);
191 check_move_frame_up(d, in, lan, packet, time);
195 lan = get_vlan(d, vlanId);
199 vlan_forward_to_trunk(d, in, vlanId, packet, time);
200 fn_NetSim_Packet_FreePacket(packet);
201 pstruEventDetails->pPacket = NULL;
205 NETSIM_ID f = find_forward_interface(lan, packet);
210 if (fn_NetSim_MAC_Firewall(d, f, packet, ACLTYPE_OUTBOUND) == ACLACTION_PERMIT &&
213 clear_eth_incoming(packet);
214 send_to_phy(d, f, packet, time);
219 fn_NetSim_Packet_FreePacket(packet);
220 pstruEventDetails->pPacket = NULL;
227 vlan_forward_to_trunk(d, in, vlanId, packet, time);
231 for (j = 0; j < lan->interfaceCount; j++)
233 if (lan->ethIfVar[j]->interfaceId == in)
236 if (lan->ethIfVar[j]->portState == PORTSTATE_BLOCKING)
239 if (fn_NetSim_MAC_Firewall(d, lan->ethIfVar[j]->interfaceId, packet, ACLTYPE_OUTBOUND) == ACLACTION_PERMIT)
241 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
242 clear_eth_incoming(p);
243 send_to_phy(d, lan->ethIfVar[j]->interfaceId, p, time);
247 fn_NetSim_Packet_FreePacket(packet);
248 pstruEventDetails->pPacket = NULL;
252void vlan_macout_forward_packet(NETSIM_ID d,
256 NetSim_PACKET* packet,
260 ptrETH_LAN lan = GET_ETH_LAN(d, in, 0);
262 out = find_forward_interface(lan, packet);
266 if (fn_NetSim_MAC_Firewall(d, out, packet, ACLTYPE_OUTBOUND) == ACLACTION_PERMIT &&
269 clear_eth_incoming(packet);
270 send_to_phy(d, out, packet, time);
273 fn_NetSim_Packet_FreePacket(packet);
277 vlan_forward_to_trunk(d, incoming, vlanId, packet, time);
280 for (j = 0; j < lan->interfaceCount; j++)
282 if (lan->ethIfVar[j]->portState == PORTSTATE_BLOCKING)
285 if (fn_NetSim_MAC_Firewall(d, lan->ethIfVar[j]->interfaceId, packet, ACLTYPE_OUTBOUND) == ACLACTION_PERMIT &&
286 lan->ethIfVar[j]->interfaceId != incoming)
288 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
289 clear_eth_incoming(p);
290 send_to_phy(d, lan->ethIfVar[j]->interfaceId, p, time);
293 fn_NetSim_Packet_FreePacket(packet);