Get all the layers in a packet

krish7919 picture krish7919 · Nov 25, 2012 · Viewed 21.2k times · Source

How can I get a list of all the layers in scapy? Eg: Ether/IP/UDP/DNS or Ether/IP/TCP/HTTP. The only thing I can think of is to do a packet.summary() and parse the output, which seems very crude. I think there should be a method built-in, but cannot find any in the documentation. Any suggestions?

What I am trying to do is to iterate over all the fields of a specific protocol given by a user and display its values.

Update: What I am looking for exactly can be seen in wireshark: Open any capture, select a packet, and in the 'Frame' menu, one can see Protocols in frame: eth:ip:udp:data This is exactly what I am looking for in Scapy. I hope I am clearer now.

Answer

cronos picture cronos · Nov 25, 2012

Each additional layer is the payload of a packet, so you can iterate

def expand(x):
    yield x
    while x.payload:
        x = x.payload
        yield x

and then

res = list(expand(packet))

I hope that is what you meant.