#!/usr/bin/env python3 import argparse import sys import socket import random import struct from scapy.all import sendp, send, hexdump, get_if_list, get_if_hwaddr from scapy.all import Packet, IPOption from scapy.all import Ether, IP, UDP from scapy.all import IntField, FieldListField, FieldLenField, ShortField, PacketListField, BitField from scapy.layers.inet import _IPOption_HDR from time import sleep def get_if(): ifs=get_if_list() iface=None for i in get_if_list(): if "eth0" in i: iface=i break if not iface: print("Cannot find eth0 interface") exit(1) return iface class SwitchTrace(Packet): fields_desc = [ BitField("swid", 0, 13), BitField("qdepth", 0,13), BitField("portid",0,6)] def extract_padding(self, p): return "", p class IPOption_INT(IPOption): name = "INT" option = 31 fields_desc = [ _IPOption_HDR, FieldLenField("length", None, fmt="B", length_of="int_headers", adjust=lambda pkt,l:l*2+4), ShortField("count", 0), PacketListField("int_headers", [], SwitchTrace, count_from=lambda pkt:(pkt.count*1)) ] def main(): if len(sys.argv)<4: print('pass 3 arguments: "" ') exit(1) addr = socket.gethostbyname(sys.argv[1]) iface = get_if() pkt = Ether(src=get_if_hwaddr(iface), dst="ff:ff:ff:ff:ff:ff") / IP( dst=addr, options = IPOption_INT(count=0, int_headers=[])) / UDP( dport=1234, sport=4321) / sys.argv[2] pkt.show2() try: for i in range(int(sys.argv[3])): sendp(pkt, iface=iface) sleep(1) except KeyboardInterrupt: raise if __name__ == '__main__': main()