@@ -29,15 +29,20 @@ def __init__(self):
2929
3030 async def _read_message_queue (self ):
3131 while True :
32- packet , device_entry = await self ._message_queue .get ()
33- await self ._process_packet (packet , device_entry )
32+ packet = await self ._message_queue .get ()
33+ await self ._process_packet (packet )
3434
35- async def _process_packet (self , packet , src_device_entry ):
35+ async def _process_packet (self , packet ):
3636 dst_mac = Ether (packet ).dst
37+ src_mac = Ether (packet ).src
38+
39+ src_vlan = self ._get_vlan_by_mac (src_mac )
40+ if src_vlan is None :
41+ return None
3742
3843 # Looking for the destination device
3944 for dst_device in self ._devices :
40- if dst_device .dev .get_mac == dst_mac and dst_device .vlan == src_device_entry . vlan :
45+ if dst_device .dev .get_mac == dst_mac and dst_device .vlan == src_vlan :
4146
4247 if dst_device .port_type == PortType .TRUNK :
4348 packet = add_vlan_tag (packet , dst_device .vlan )
@@ -48,7 +53,7 @@ async def _process_packet(self, packet, src_device_entry):
4853 def _read_raw_packet (self , device_entry ):
4954 try :
5055 packet = device_entry .sock .recv (IP_MAX_SIZE )
51- self ._message_queue .put_nowait (( packet , device_entry ) )
56+ self ._message_queue .put_nowait (packet )
5257 except OSError :
5358 # TODO: Currently the interface is closed successfully, but the cb
5459 # raises an exception.
@@ -83,6 +88,13 @@ def _update_arp_tables(self, new_dev):
8388 curr_dev .dev .run_from_namespace ('arp -s {ip} {mac}' .format (
8489 ip = new_dev .dev .get_ip , mac = new_dev .dev .get_mac ))
8590
91+ def _get_vlan_by_mac (self , mac ):
92+ for dev_entry in self ._devices :
93+ if mac == dev_entry .dev .get_mac :
94+ return dev_entry .vlan
95+
96+ return None
97+
8698 def append_device (self , dev , vlan , port_type ):
8799 def _append_device_entry (self , new_dev_entry ):
88100 self ._devices .append (new_dev_entry )
0 commit comments