from time import sleep from scapy.all import ICMP, IP, Dot1Q, Ether, sendp, AsyncSniffer, wrpcap from tqdm import tqdm a = AsyncSniffer(iface="enp5s0d1", filter="icmp") a.start() for i in tqdm(range(0, 4095)): sendp( Ether(dst="00:02:c9:27:10:73", src="00:f0:cb:ef:e0:3b") / Dot1Q(vlan=i) / IP(dst="10.0.45.45", src="10.0.45.5") / ICMP(id=i), iface="enp2s0", verbose=False, ) print("Wrapping up and waiting for last packets") sleep(1) plist = a.stop() seen = [False for i in range(4095)] icmpid = [False for i in range(4095)] def pprint(seen): last = None s = "" for k, v in enumerate(seen): if v and last is None: last = k s += str(k) if not v and last is not None: if k-1 == last: s += "," else: s += f"-{k-1}," last = None if last is not None and last < k: s += f"-{k}" return s + "\n" for p in plist: if Dot1Q in p: vlan = int(p[Dot1Q].vlan) seen[vlan] = True if ICMP in p and p[ICMP].id == vlan: icmpid[vlan] = True print("Icmp correspondance") print(pprint(icmpid)) print("Seen vlans") print(pprint(seen))