Beispiel #1
0
 def __init__(self, localMac, tunnelMac):
     self.localMac = localMac
     self.tunnelMac = tunnelMac
     self.ethTunnel = EthTunnel(localMac, tunnelMac)
Beispiel #2
0
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