#!/usr/bin/env python import sys import struct from scapy.all import sniff, sendp, hexdump, get_if_list, get_if_hwaddr from scapy.all import Packet, IPOption from scapy.all import PacketListField, ShortField, IntField, LongField, BitField, FieldListField, FieldLenField from scapy.all import IP, UDP, Raw from scapy.layers.inet import _IPOption_HDR 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 = [ IntField("swid", 0), IntField("qdepth", 0)] def extract_padding(self, p): return "", p class IPOption_MRI(IPOption): name = "MRI" option = 31 fields_desc = [ _IPOption_HDR, FieldLenField("length", None, fmt="B", length_of="swtraces", adjust=lambda pkt,l:l*2+4), ShortField("count", 0), PacketListField("swtraces", [], SwitchTrace, count_from=lambda pkt:(pkt.count*1)) ] def handle_pkt(pkt): print "got a packet" pkt.show2() # hexdump(pkt) sys.stdout.flush() def main(): iface = 'h2-eth0' print "sniffing on %s" % iface sys.stdout.flush() sniff(filter="udp and port 4321", iface = iface, prn = lambda x: handle_pkt(x)) if __name__ == '__main__': main()