def submit(self, pkt: Packet): if pkt.haslayer(ARP): eth_src = pkt.getlayer(Ether).src if eth_src == "ff:ff:ff:ff:ff:ff" or eth_src == "00:00:00:00:00:00" or pkt.hwsrc == "ff:ff:ff:ff:ff:ff" or pkt.hwsrc == "00:00:00:00:00:00": self.on_eth_broadcast(pkt) return if eth_src != pkt.hwsrc: # source mac arp mismatch self.on_eth_mismatch(pkt) if pkt.psrc != '0.0.0.0' and pkt.psrc != '255.255.255.255': self.update(pkt.hwsrc, pkt.psrc, pkt.time) if pkt.op == 2 and pkt.hwdst != "ff:ff:ff:ff:ff:ff" and pkt.hwdst != "00:00:00:00:00:00": self.update(pkt.hwdst, pkt.pdst, pkt.time) elif Ether in pkt and IP in pkt and pkt.getlayer(IP).src != '0.0.0.0' \ and pkt.getlayer(IP).src != '255.255.255.255': self.update( pkt.getlayer(Ether).src, pkt.getlayer(IP).src, pkt.time)
def getlayer(self, cls, nb=1, _track=None): layer = None if cls == RadiusAttribute: for attr_class in RadiusAttribute.registered_attributes.values(): if isinstance(self, attr_class): layer = self break else: layer = Packet.getlayer(self, cls, nb, _track) return layer
def getlayer(self, cls, nb=1, _track=None): layer = None if cls == EAP: for eap_class in EAP.registered_methods.values(): if isinstance(self, eap_class): layer = self break else: layer = Packet.getlayer(self, cls, nb, _track) return layer
def PacketParser(dut: cocotb.handle, packet: scapy_packet, scapy_to_VHDL): """setUp interface of dut with packet info If process header recursively, if not on dut raise error. This function is the expected output of a packet parser """ if not isinstance(packet, scapy_packet): raise TypeError("expected scapy Packet type") dut._log.info("debut parsage") for i in scapy_to_VHDL: signal_en = "{}_valid".format(scapy_to_VHDL[i][0]) if signal_en in dut._sub_handles: dut._sub_handles[signal_en].value = 0 if packet.haslayer(i): signal = "{}_bus".format(scapy_to_VHDL[i][0]) if not (signal in dut._sub_handles): raise ValueError("unvalid header : {}".format(signal)) val = BinaryValue() signal_width = int(scapy_to_VHDL[i][1] / 8) val.binstr = BitArray(raw(packet.getlayer(i))[0:signal_width]).bin val.buff = val.buff[::-1] dut._sub_handles[signal].value = val dut._sub_handles[signal_en].value = 1 dut._log.info("fin parser")
def on_eth_mismatch(self, pkt: Packet): msg = "ETH_MISMATCH\nNAME = {}\n{}".format( self.get_alias(pkt.getlayer(Ether).src), pkt.show(dump=True)) self.send_to_telegram(msg)