我正在开发一个简单的 icmpv6 客户端,我的校验和有一些问题,这里是代码,wireshark 显示校验和设置不正确,回溯显示错误,例如pcs.FieldBoundsError: 'Value must be between 0 and 65535'
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()