def hashret(self):
if ( (self.proto == socket.IPPROTO_ICMP)
and (isinstance(self.payload, ICMP))
and (self.payload.type in [3,4,5,11,12]) ):
return self.payload.payload.hashret()
else:
if conf.checkIPsrc and conf.checkIPaddr:
return strxor(inet_aton(self.src),inet_aton(self.dst))+struct.pack("B",self.proto)+self.payload.hashret()
else:
return struct.pack("B", self.proto)+self.payload.hashret()
python类IPPROTO_ICMP的实例源码
def createInternetSocket(self):
s = socket.socket(
socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
s.setblocking(0)
fd = s.fileno()
# Set close-on-exec
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
flags = flags | fcntl.FD_CLOEXEC
fcntl.fcntl(fd, fcntl.F_SETFD, flags)
return s
def hashret(self):
if ( (self.proto == socket.IPPROTO_ICMP)
and (isinstance(self.payload, ICMP))
and (self.payload.type in [3,4,5,11,12]) ):
return self.payload.payload.hashret()
else:
if conf.checkIPsrc and conf.checkIPaddr:
return strxor(inet_aton(self.src),inet_aton(self.dst))+struct.pack("B",self.proto)+self.payload.hashret()
else:
return struct.pack("B", self.proto)+self.payload.hashret()
def simple_icmp_packet(self,
pktlen=100,
dl_dst='00:01:02:03:04:05',
dl_src='00:06:07:08:09:0a',
dl_vlan_enable=False,
dl_vlan_type=ETHERTYPE_VLAN,
dl_vlan=0,
dl_vlan_pcp=0,
dl_vlan_cfi=0,
mpls_type=None,
mpls_tags=None,
ip_src='192.168.0.1',
ip_dst='192.168.0.2',
ip_tos=0,
ip_ttl=64,
icmp_type=8, # ICMP_ECHO_REQUEST
icmp_code=0,
):
"""
Return a simple dataplane ICMP packet
Supports a few parameters:
@param len Length of packet in bytes w/o CRC
@param dl_dst Destinatino MAC
@param dl_src Source MAC
@param dl_vlan_enable True if the packet is with vlan, False otherwise
@param dl_vlan_type Ether type for VLAN
@param dl_vlan VLAN ID
@param dl_vlan_pcp VLAN priority
@param ip_src IP source
@param ip_dst IP destination
@param ip_tos IP ToS
@param tcp_dport TCP destination port
@param ip_sport TCP source port
Generates a simple TCP request. Users shouldn't assume anything
about this packet other than that it is a valid ethernet/IP/TCP frame.
"""
self.data = ""
self._make_ip_packet(dl_dst, dl_src, dl_vlan_enable, dl_vlan_type,
dl_vlan, dl_vlan_pcp, dl_vlan_cfi,
mpls_type, mpls_tags,
ip_tos,
ip_ttl, ip_src, ip_dst, socket.IPPROTO_ICMP)
# Add ICMP header
self.data += struct.pack("!BBHHH",
icmp_type,
icmp_code,
0, # icmp.checksum
os.getpid() & 0xffff, # icmp.echo.id
Packet.icmp_counter # icmp.echo.seq
)
Packet.icmp_counter += 1
# Fill out packet
self.data += "D" * (pktlen - len(self.data))
return self