25#ifndef _NETSIM_ETHERNET_H_
26#define _NETSIM_ETHERNET_H_
31#pragma comment(lib,"NetworkStack.lib")
32#pragma comment(lib,"Metrics.lib")
34#define isETHConfigured(d,i) (DEVICE_MACLAYER(d,i)->nMacProtocolId == MAC_PROTOCOL_IEEE802_3)
36 PNETSIM_MACADDRESS multicastSPTMAC;
40 typedef enum enum_eth_packet
42 ETH_CONFIGBPDU = MAC_PROTOCOL_IEEE802_3 * 100 + 1,
46 typedef enum enum_SwitchingTechnique
48 SWITCHINGTECHNIQUE_NULL,
49 SWITCHINGTECHNIQUE_STORE_FORWARD,
50 SWITCHINGTECHNIQUE_CUT_THROUGH,
51 SWITCHINGTECHNIQUE_FRAGMENT_FREE,
55 typedef enum enum_PortState
64 typedef enum enum_port_type
67 PORTTYPE_NONDESIGNATED,
75#define ETH_HDR_CBPDU 1
82 void* (*fncopy)(
void*);
85 void set_eth_hdr(NetSim_PACKET* packet, UINT type,
void* var,
void*(fncopy)(
void*),
void(*fnfree)(
void*));
86 void free_eth_hdr(NetSim_PACKET* packet);
87 void* get_eth_hdr_var(NetSim_PACKET* packet);
91 UINT16 protocolIdentifier;
92 UINT8 protocolVersionIdentifier;
103 }ETH_BPDU, *ptrETH_BPDU;
104#define ETH_BPDU_LEN 60
112 }IEEE801_1Q_TAG, *ptrIEEE801_1Q_TAG;
113#define IEEE801_1Q_TAG_LEN 4
114#define VLAN_TPID 0x8100
115 bool isVLANTagPresent(NetSim_PACKET* packet);
120 PNETSIM_MACADDRESS mac;
123 }SWITCHTABLE, *ptrSWITCHTABLE;
124#define SWITCHTABLE_ALLOC() (ptrSWITCHTABLE)list_alloc(sizeof(SWITCHTABLE),offsetof(SWITCHTABLE,ele))
125#define SWITCHTABLE_ADD(l,m) LIST_ADD_LAST((void**)(l),m)
126#define SWITCHTABLE_NEXT(t) t=(ptrSWITCHTABLE)LIST_NEXT(t)
127#define SWITCHTABLE_GET(d,in) (GET_ETH_LAN(d,in,0)->switchTable)
128#define SWITCHTABLE_GET_LAN(lan) (lan->switchTable)
129 ptrSWITCHTABLE SWITCHTABLE_FIND(ptrETH_LAN lan, PNETSIM_MACADDRESS dest);
130 void SWITCHTABLE_NEW(ptrETH_LAN lan, PNETSIM_MACADDRESS dest, NETSIM_ID outport);
131 void switchtable_metrics_print(PMETRICSWRITER metricsWriter);
139 VLANPORT vlan_port_type_from_str(
char* val);
143 NETSIM_ID interfaceId;
144 PNETSIM_MACADDRESS macAddress;
145 SWITCH_PORTSTATE portState;
146 SWITCH_PORTTYPE portType;
147 VLANPORT vlanPortType;
149 ptrETH_IF GET_ETH_IF(ptrETH_LAN lan, NETSIM_ID i);
162 }ETH_SPT, *ptrETH_SPT;
168 NETSIM_ID* interfaceId;
169 NETSIM_IPAddress lanIP;
177 SWITCHING_TECHNIQUE switchingTechnique;
180 ptrSWITCHTABLE switchTable;
182 char* ethernetStandard;
185 bool ispromiscuousMode;
187 ptrETH_LAN GET_ETH_LAN(NETSIM_ID d, NETSIM_ID i, UINT16 vlanId);
197 NetSim_BUFFER* buffer;
201 NETSIM_ID* trunkPortIds;
204 }ETH_VAR,*ptrETH_VAR;
205 ptrETH_VAR GET_ETH_VAR(NETSIM_ID d);
206 void SET_ETH_VAR(NETSIM_ID d, ptrETH_VAR var);
207 void FREE_ETH_VAR(NETSIM_ID d);
211 NETSIM_ID interfaceId;
214 double propagationDelay;
215 NETSIM_ID connectedDevice;
216 NETSIM_ID connectedInterface;
219 NetSim_BUFFER* packet;
220 double lastPacketEndTime;
223 }ETH_PHY, *ptrETH_PHY;
224#define ETH_PHY_GET(d,i) ((ptrETH_PHY)DEVICE_PHYLAYER(d,i)->phyVar)
227 void init_spanning_tree_protocol();
228 int multicast_config_bpdu();
229 void process_configbpdu();
232 void vlan_add_trunk_port(ptrETH_VAR eth, NETSIM_ID in);
233 void vlan_forward_to_all_trunk(NETSIM_ID d,
234 NetSim_PACKET* packet,
237 void vlan_macout_forward_packet(NETSIM_ID d,
241 NetSim_PACKET* packet,
243 void vlan_macin_forward_packet();
246 NETSIM_ID find_forward_interface(ptrETH_LAN lan, NetSim_PACKET* packet);
247 void check_move_frame_up(NETSIM_ID d,
250 NetSim_PACKET* packet,
252 void forward_frame(NETSIM_ID d,
255 NetSim_PACKET* packet,
257 void send_to_phy(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet,
double time);
260 NETSIM_ID get_interface_id(NETSIM_ID d, NETSIM_ID c);
261 void print_ethernet_log(
char* format, ...);
262 void print_spanning_tree();
263 void store_eth_param_macin(NetSim_PACKET* packet, NETSIM_ID devId, NETSIM_ID in, ptrETH_LAN lan);
264 void store_eth_incoming(NetSim_PACKET* packet, NETSIM_ID devId, NETSIM_ID incomingPort, UINT16 vlanId);
265 UINT16 eth_get_incoming_vlanid(NetSim_PACKET* packet, NETSIM_ID devId);
266 NETSIM_ID eth_get_incoming_port(NetSim_PACKET* packet, NETSIM_ID devId);
267 void clear_eth_incoming(NetSim_PACKET* packet);
268 double get_ifg(
double link_speed);