def __init__(self, localMac, tunnelMac): self.localMac = localMac self.tunnelMac = tunnelMac self.ethTunnel = EthTunnel(localMac, tunnelMac)
class ArpTunnel(PacketProcessor): protocol = arp agent = ArpAgent def __init__(self, localMac, tunnelMac): self.localMac = localMac self.tunnelMac = tunnelMac self.ethTunnel = EthTunnel(localMac, tunnelMac) def matchesIn(self, pkt): res = self.ethTunnel.matchesIn(pkt) if not res: return False arpPkt = self.agent.extract(pkt) if not arpPkt: return False return True def matchesOut(self, pkt): res = self.ethTunnel.matchesOut(pkt) if not res: return False arpPkt = self.agent.extract(pkt) if not arpPkt: return False if self.localMac not in [arpPkt.hwsrc or arpPkt.hwdst]: return False return True def processInPacket(self, pkt): pkt = self.ethTunnel.processInPacket(pkt) if not pkt: return None arpPkt = self.agent.extract(pkt) if arpPkt.hwsrc == self.tunnelMac: arpPkt.hwsrc = self.localMac if arpPkt.hwdst == self.tunnelMac: arpPkt.hwdst = self.localMac pkt.set_payload(arpPkt) return pkt def processOutPacket(self, pkt): pkt = self.ethTunnel.processOutPacket(pkt) if not pkt: return None arpPkt = self.agent.extract(pkt) if arpPkt.hwsrc == self.localMac: arpPkt.hwsrc = self.tunnelMac if arpPkt.hwdst == self.localMac: arpPkt.hwdst = self.tunnelMac pkt.set_payload(arpPkt) return pkt