2015-10-21 2 views
0

Я хочу сделать что-то вроде следующегоДоступ к более низкие уровни полей с лямбда-функции в Scapy

class Upper(Packet): 

    name = "UpperLayer" 
    fields_desc = [ 
     ConditionalField(IntField("Field",0xABCDEF00), 
         lambda pkt: pkt[IP].src == "1.2.3.4") 
        ] 

p = IP(src="1.2.3.4")/Upper() 

Но это не работает - я предполагаю, потому что верхний слой Upper не имеет никакой информации о нижнем IP слое и поэтому не может получить доступ к полю src. Но мне необходимо получить доступ к значению, хранящемуся на нижнем уровне. В протоколе, который я пытаюсь реализовать, это необходимо. Итак, как я мог это сделать?

ответ

1

Нижний или левый слой называется underlayer. Вот что вы ищете:

class Upper(Packet): 
    name = "UpperLayer" 
    fields_desc = [ 
     ConditionalField(IntField("Field",0xABCDEF00), 
         lambda pkt: hasattr(pkt.underlayer,"src") and pkt.underlayer.src == "1.2.3.4") 
        ]