2011-06-14 41 views
2

我正在一個簡單的ICMPv6客戶端上,和我有一些問題,校驗 這裏是代碼,Wireshark的顯示校驗設置不正確, 回溯節目,如pcs.FieldBoundsError: 'Value must be between 0 and 65535'的Python的ICMPv6客戶

import pcs, sys 
from socket import * 
from pcs.packets.ethernet import * 
from pcs.packets.ipv6 import * 
from pcs.packets.icmpv6 import * 

class packet: 
    def __init__(self, src, dst, mac): 
     self.src = src 
     self.dst = dst 
     self.mac = mac 

    def construct(self): 
     e    = ethernet() 
     e.src   = ether_atob("de:de:de:de:de:de") 
     e.dst   = ether_atob(self.mac) 
     e.type   = ETHERTYPE_IPV6 

     ip6    = ipv6() 
     ip6.version  = 6 
     ip6.traffic_class = 0 
     ip6.flow   = 0 
     ip6.length  = 8    # icmpv6 packet length 
     ip6.next_header = IPPROTO_ICMPV6 
     ip6.hop   = 255 
     ip6.src   = inet_pton(AF_INET6, self.src) 
     ip6.dst   = inet_pton(AF_INET6, self.dst) 

     icmp6   = icmpv6(ICMP6_ECHO_REQUEST) 
     icmp6.code  = 0 
     icmp6.id  = 0xf0 
     icmp6.seq  = 1 
     icmp6.mtu  = 1280 
     icmp6.checksum = 0 

     ip6.length  = len(icmp6.getbytes()) 
     ip6.flow  = len(ip6.getbytes()) + ip6.length 

     icmp6.checksum = icmp6.cksum(ip6) 
     pkt = pcs.Chain([e, ip6, icmp6]) 

     s = pcs.PcapConnector('eth0') 
     s.write(pkt.bytes, len(pkt.bytes)) 

if __name__=='__main__': 
    p = packet(sys.argv[1], sys.argv[2], sys.argv[3]) 
    p.construct()      
錯誤

回答

1

這似乎與python-pcs中的bug有關,導致校驗和計算不正確。刪除錯誤位應該工作:

cs = icmp6.cksum(ip6) & 0xffff