Esempio n. 1
0
    def send_frame(self, frame_body):
        PACKET = Ether()
        PACKET.length = 64
        PACKET.dst = self.dst
        PACKET.src = self.getHwAddr(self.interface)
        if self.stag:
            # WARNING: September/2016: This should be 0x88a8, but the Intel 10G
            # hardware I am currently using does not support receiving a TPID of
            # 0x88a8. So, I send double CTAGs, and I usually set this to 0x8100.
            # (NOTE: The Intel hardware can send a TPID of 0x88a8)
            PACKET.type = 0x8100
            if self.ctag:
                PACKET/=Dot1Q(type=0x8100,vlan=int(self.stag))
                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
            else:
                PACKET/=Dot1Q(type=self.etype,vlan=int(self.stag))
        else:
            if self.ctag:
                PACKET.type = 0x8100
                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
            else:
                PACKET.type = self.etype
#            PACKET/=Dot1Q(type=self.etype, vlan=int(self.ctag))
        PACKET/=SlowProtocolsSubtype()/FlagsBytes()/OAMPDU()
        PACKET/=frame_body
        PACKET/=EndOfPDU()
        if (self.verbose == True):
            PACKET.show()
            print '###[ Frame Length %d (before padding) ]###' % len(PACKET)
        if (self.hexdump == True):
            print hexdump(PACKET)
        if (self.dryrun != True):
            sendp(PACKET, iface=self.interface, verbose=self.verbose)
            time.sleep(self.sleep)
        return PACKET
Esempio n. 2
0
    def send_frame(self, frame_body):
        PACKET = Ether()
        PACKET.length = 64
        PACKET.dst = self.dst
        PACKET.src = self.getHwAddr(self.interface)
        if self.stag:
            # WARNING: September/2016: This should be 0x88a8, but the Intel 10G
            # hardware I am currently using does not support receiving a TPID of
            # 0x88a8. So, I send double CTAGs, and I usually set this to 0x8100.
            # (NOTE: The Intel hardware can send a TPID of 0x88a8)
            PACKET.type = 0x8100
            if self.ctag:
                PACKET/=Dot1Q(type=0x8100,vlan=int(self.stag))
                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
            else:
                PACKET/=Dot1Q(type=self.etype,vlan=int(self.stag))
        else:
            if self.ctag:
                PACKET.type = 0x8100
                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
            else:
                PACKET.type = self.etype
#            PACKET/=Dot1Q(type=self.etype, vlan=int(self.ctag))
        PACKET/=SlowProtocolsSubtype()/FlagsBytes()/OAMPDU()
        PACKET/=frame_body
        PACKET/=EndOfPDU()
        if (self.verbose == True):
            PACKET.show()
            print '###[ Frame Length %d (before padding) ]###' % len(PACKET)
        if (self.hexdump == True):
            print hexdump(PACKET)
        if (self.dryrun != True):
            sendp(PACKET, iface=self.interface, verbose=self.verbose)
            time.sleep(self.sleep)
        return PACKET
Esempio n. 3
0
File: lldp.py Progetto: dsaucez/l2
def create_lldp_packet(mac_addr, switch_name, port_id):
    # indicate the swith name
    chassis_tlv = Chassis_Id()
    chassis_tlv.subtype = 0x07
    chassis_tlv.length = len(switch_name) + 1
    chassis_tlv.locallyAssigned = switch_name

    # indicate the port ID
    port_tlv = Port_Id()
    port_tlv.subtype = 0x7
    port_tlv.length = len(port_id) + 1
    port_tlv.locallyAssigned = port_id

    # TTL
    ttl_tlv = TTL()
    ttl_tlv.length = 2
    ttl_tlv.seconds = 0
    
    # The end 
    end_tlv = EndOfPDU()

    # Create the frame
    frame = Ether()
    frame.src = mac_addr
    frame.dst = '01:80:c2:00:00:0e'
    frame.type = 0x88cc

    packet = frame / chassis_tlv / port_tlv / ttl_tlv / end_tlv
    return packet
    async def recv(self):
        rx_header = await self.header_sink.recv()
        rx_payload = await self.payload_sink.recv()

        assert not rx_payload.tuser

        eth = Ether()
        eth.dst = rx_header.dest_mac.integer.to_bytes(6, 'big')
        eth.src = rx_header.src_mac.integer.to_bytes(6, 'big')
        eth.type = rx_header.type.integer
        rx_pkt = eth / bytes(rx_payload.tdata)

        return Ether(bytes(rx_pkt))
Esempio n. 5
0
async def run_test(dut,
                   payload_lengths=None,
                   payload_data=None,
                   idle_inserter=None,
                   backpressure_inserter=None):

    tb = TB(dut)

    await tb.reset()

    tb.set_idle_generator(idle_inserter)
    tb.set_backpressure_generator(backpressure_inserter)

    test_pkts = []
    test_frames = []

    for payload in [payload_data(x) for x in payload_lengths()]:
        eth = Ether(src='5A:51:52:53:54:55',
                    dst='DA:D1:D2:D3:D4:D5',
                    type=0x8000)
        test_pkt = eth / payload

        test_pkts.append(test_pkt.copy())
        test_frame = AxiStreamFrame(test_pkt.build())
        test_frames.append(test_frame)

        await tb.source.send(test_frame)

    for test_pkt, test_frame in zip(test_pkts, test_frames):
        rx_header = await tb.header_sink.recv()
        rx_payload = await tb.payload_sink.recv()

        eth = Ether()
        eth.dst = rx_header.dest_mac.integer.to_bytes(6, 'big')
        eth.src = rx_header.src_mac.integer.to_bytes(6, 'big')
        eth.type = rx_header.type.integer
        rx_pkt = eth / bytes(rx_payload.tdata)

        tb.log.info("RX packet: %s", repr(rx_pkt))

        assert rx_pkt.build() == test_pkt.build()
        assert not rx_payload.tuser

    assert tb.header_sink.empty()
    assert tb.payload_sink.empty()

    await RisingEdge(dut.clk)
    await RisingEdge(dut.clk)
Esempio n. 6
0
    async def recv(self):
        rx_frame = await self.sink.recv()

        eth = Ether()
        eth.dst = rx_frame.eth_dest_mac.integer.to_bytes(6, 'big')
        eth.src = rx_frame.eth_src_mac.integer.to_bytes(6, 'big')
        eth.type = rx_frame.eth_type.integer
        arp = ARP()
        arp.hwtype = rx_frame.arp_htype.integer
        arp.ptype = rx_frame.arp_ptype.integer
        arp.hwlen = rx_frame.arp_hlen.integer
        arp.plen = rx_frame.arp_plen.integer
        arp.op = rx_frame.arp_oper.integer
        arp.hwsrc = rx_frame.arp_sha.integer.to_bytes(6, 'big')
        arp.psrc = rx_frame.arp_spa.integer
        arp.hwdst = rx_frame.arp_tha.integer.to_bytes(6, 'big')
        arp.pdst = rx_frame.arp_tpa.integer
        rx_pkt = eth / arp

        return Ether(bytes(rx_pkt))
Esempio n. 7
0
 def getIPPacket(self):
     """
     构造IP数据包
     :return:
     """
     # chksum = self.entries[9].get()
     try:
         eth = Ether()
         eth.src = self.entries[0].get()
         eth.dst = self.entries[1].get()
         eth.type = int(self.entries[2].get())
         ip_packet = IP()
         ip_packet.versionion = int(self.entries[3].get())
         ip_packet.ihl = int(self.entries[4].get())
         ip_packet.tos = int(self.entries[5].get())
         ip_packet.len = int(self.entries[6].get())
         ip_packet.id = int(self.entries[7].get())
         ip_packet.flags = int(self.entries[8].get())
         ip_packet.frag = int(self.entries[9].get())
         ip_packet.ttl = int(self.entries[10].get())
         ip_packet.proto = int(self.entries[11].get())
         payload = self.entries[16].get()
         ip_packet.src = self.entries[13].get()
         ip_packet.dst = self.entries[14].get()
         # 不含payload计算首部校验和
         if payload == '':
             print("无payload的IP报文")
             ip_packet.show()
             checksum_scapy = IP(raw(ip_packet)).chksum
             # 自主计算验证IP首部检验和并进行填充
             print("scapy自动计算的IP首部检验和是:%04x (%s)" %
                   (checksum_scapy, str(checksum_scapy)))
             # 1.将IP首部和自动设置为0
             ip_packet.chksum = 0
             # 2.生成ip首部的数据字符串
             x = raw(ip_packet)
             ipString = "".join("%02x" % orb(x) for x in x)
             # 3.将ip首部的数据字符串转换成字节数组
             ipbytes = bytearray.fromhex(ipString)
             # 4.调用校验和计算函数计算校验和
             checksum_self = self.IP_headchecksum(ipbytes)
             # 5.进行校验和验证
             print("验证计算IP首部的检验和是:%04x (%s)" %
                   (checksum_self, str(checksum_self)))
         # 含payload计算首部校验和
         else:
             print("含有payload的IP报文")
             ip_packet = ip_packet / payload
             ip_packet.show()
             ip_packet.len = 20 + len(payload)
             checksum_scapy = IP(raw(ip_packet)).chksum
             print("scapy自动计算的IP首部检验和是:%04x (%s)" %
                   (checksum_scapy, str(checksum_scapy)))
             ip_packet.chksum = 0
             ip_packet.ihl = 5
             print('\n 报文长度是:%s' % str(ip_packet.len))
             x = raw(ip_packet)
             ipString = "".join("%02x" % orb(x) for x in x)
             ipbytes = bytearray.fromhex(ipString)
             checksum_self = self.IP_headchecksum(ipbytes[0:ip_packet.ihl *
                                                          4])
             print("验证计算IP首部的检验和是:%04x (%s)" %
                   (checksum_self, str(checksum_self)))
         if checksum_self == checksum_scapy:
             print("检验和正确")
         else:
             print("检验和不正确")
         ip_packet.chksum = checksum_self
         self.entries[12].delete(0, END)
         self.entries[12].insert(0, hex(ip_packet.chksum))
         ip_packet.show()
         self.resultText.insert('end', ip_packet.summary() + '\n')
         self.resultText.insert('end', str(ip_packet) + '\n')
         return eth / ip_packet
     except Exception as e:
         print(e.with_traceback())
     finally:
         pass
Esempio n. 8
0
def send_ARP(_source, _destination, _count, _response, _gratuitous, _target_ip,
             _tell_ip, _target_ip_custom, _tell_ip_custom, interfaces):
    print()
    if interfaces == "all":
        interfaces = psutil.net_if_addrs()
        elem = []

        for k, v, in interfaces.items():
            # if v[0].address.find('-') == -1:
            if not check_mac(v[0].address):
                elem.append(k)
        for i in elem:
            print(i, " is not interface with correct address")
            del interfaces[i]

    if _target_ip_custom or _tell_ip_custom:
        for _ in range(_count):
            ether = Ether()
            ether.src = _source
            ether.dst = _destination
            op = "who-has"
            if _response:
                op = "is-at"
            if target_ip_custom:
                _target_ip = generate_random_ip()

            if _tell_ip_custom:
                _tell_ip = generate_random_ip()

            if _gratuitous:
                _target_ip = _tell_ip

            print(f"Source: {_tell_ip}, destination: {_target_ip}")
            arp = ARP(op=op, psrc=_tell_ip, pdst=_target_ip)

            packet_to_send = ether / arp
            try:
                if isinstance(interfaces, dict):
                    for interface in interfaces:
                        sendp(packet_to_send,
                              iface=interface,
                              count=1,
                              verbose=0)
                else:
                    sendp(packet_to_send, iface=interfaces, count=1, verbose=0)
            except ValueError as e:
                print(e)
        print(f"{_count} packets has been sent")
    else:
        ether = Ether()
        ether.src = _source
        ether.dst = _destination
        op = "who-has"
        if _response:
            op = "is-at"

        if _gratuitous:
            _target_ip = _tell_ip

        print(f"Source: {_tell_ip}, destination: {_target_ip}")
        arp = ARP(op=op,
                  psrc=_tell_ip,
                  hwsrc=get_mac(_tell_ip),
                  pdst=_target_ip,
                  hwdst=get_mac(_target_ip))
        packet_to_send = ether / arp
        try:
            if isinstance(interfaces, dict):
                for interface in interfaces:
                    sendp(packet_to_send,
                          iface=interface,
                          count=_count,
                          verbose=0)
                print(f"{_count} packets has been sent")
            else:
                sendp(packet_to_send,
                      iface=interfaces,
                      count=_count,
                      verbose=0)
                print(f"{_count} packets has been sent")
        except ValueError as e:
            print(e)