2014-10-17 67 views
0

我想在Scapy中構建一個新圖層/協議。當我試圖發送/顯示它時,我看到這個錯誤。Scapy:添加新協議/圖層時出現TypeError

我已經把斷點看看發生了什麼,但不知怎的,內部str被轉換爲Tuple。我不知道我錯過了什麼。有人可以幫我指出這個問題嗎?

>>> 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正在抱怨。這是很好的學習:) :)