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
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))
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)
def getEtherPacket(self): """ 构造以太网数据包 :return: """ try: payload = self.entries[2].get() ether_packet = Ether() / payload ether_packet.src = self.entries[0].get() ether_packet.des = self.entries[1].get() self.resultText.insert('end', str(ether_packet) + '\n') self.resultText.insert('end', ether_packet.summary() + '\n') return ether_packet except Exception as e: print(e.with_traceback()) finally: pass
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))
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
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)