2014-10-17 2 views
0

Я пытаюсь создать новый слой/протокол в Scapy. Я вижу эту ошибку, когда пытаюсь отправить/show2.Scapy: TypeError при добавлении нового протокола/уровня

Я поставил точки останова, чтобы увидеть, что происходит, но как-то внутренне str преобразуется в кортеж. Я не уверен, что мне не хватает. Может кто-нибудь помочь мне решить проблему?

>>> p1=PCEPOPEN() 
>>> p1.show2() 
> /usr/local/lib64/python2.6/site-packages/scapy/fields.py(71)addfield() 
-> return s+struct.pack(self.fmt, self.i2m(pkt,val)) 
(Pdb) val 
1 
(Pdb) p s 
'' 
(Pdb) c 
> /usr/local/lib64/python2.6/site-packages/scapy/fields.py(71)addfield() 
-> return s+struct.pack(self.fmt, self.i2m(pkt,val)) 
(Pdb) p s 
'\x01\x10' 
(Pdb) val 
4 
(Pdb) p s 
'\x01\x10' 
(Pdb) c 
> /usr/local/lib64/python2.6/site-packages/scapy/fields.py(71)addfield() 
-> return s+struct.pack(self.fmt, self.i2m(pkt,val)) 
(Pdb) val 
10 
(Pdb) p s 
('\x01\x10\x00\x04', 3, 1L) 
(Pdb) c 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 831, in show2 
    self.__class__(str(self)).show() 
    File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 262, in __str__ 
    return self.build() 
    File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 321, in build 
    p = self.do_build() 
    File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 309, in do_build 
    pkt = self.self_build() 
    File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 300, in self_build 
    p = f.addfield(self, p, val) 
    File "/usr/local/lib64/python2.6/site-packages/scapy/fields.py", line 71, in addfield 
    return s+struct.pack(self.fmt, self.i2m(pkt,val)) 
TypeError: can only concatenate tuple (not "str") to tuple 
>>> p1.show() 
###[ OPEN Object for Open message ]### 
    oclass= OPEN 
    oType= 1 
    resflags= 
    pflag= 
    iflag= 
    obLength= 4 
    ver= 1 
    kalive= 10 
    dead= 40 
    sid= 1 
>>>  


class PCEPOPEN(Packet): 
    """OPEN message to establish a PCEP session""" 

    name="OPEN Object for Open message" 
    fields_desc = [ByteEnumField("oclass",1,_object_class), 
        BitField("oType",1,4), 
        BitField("resflags", 0, 2), 
        FlagsField("pflag", 0x0, 1, "P"), 
        FlagsField("iflag", 0x0, 1, "I"), 
        ShortField("obLength", 4), 
        BitField("ver",1,3), 
        ByteField("kalive",10), 
        ByteField("dead",40), 
        ByteField("sid",1)] 

    def post_build(self, pkt, pay): 
    if self.obLength is 4: 
     olen = len(pkt) + len(pay) 
     pkt = pkt[:2]+struct.pack("!h", olen) 
    return pkt+pay 

ответ

1

Похоже, что я случайно удалил поле, вызвавшее проблему. Я использовал BitField и добавил 3 бита, но я удалил строку, содержащую BitField с еще 5 битами. Поскольку пакеты байт выровнен, scapy жаловался. Хорошо было узнать, что :)

Смежные вопросы