aboutsummaryrefslogtreecommitdiffstats
path: root/resources/traffic_scripts/ipv4_ping_ttl_check.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/traffic_scripts/ipv4_ping_ttl_check.py')
-rwxr-xr-xresources/traffic_scripts/ipv4_ping_ttl_check.py59
1 files changed, 52 insertions, 7 deletions
diff --git a/resources/traffic_scripts/ipv4_ping_ttl_check.py b/resources/traffic_scripts/ipv4_ping_ttl_check.py
index cc3afdec10..e6f5637cf9 100755
--- a/resources/traffic_scripts/ipv4_ping_ttl_check.py
+++ b/resources/traffic_scripts/ipv4_ping_ttl_check.py
@@ -21,7 +21,7 @@ from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
def check_ttl(ttl_begin, ttl_end, ttl_diff):
if ttl_begin != ttl_end + ttl_diff:
- raise Exception(
+ raise RuntimeError(
"TTL changed from {} to {} but decrease by {} expected"
.format(ttl_begin, ttl_end, ttl_diff))
@@ -33,10 +33,10 @@ def ckeck_packets_equal(pkt_send, pkt_recv):
print "Sent: {}".format(pkt_send_raw.encode('hex'))
print "Received: {}".format(pkt_recv_raw.encode('hex'))
print "Sent:"
- Ether(pkt_send_raw).show2()
+ pkt_send.show2()
print "Received:"
- Ether(pkt_recv_raw).show2()
- raise Exception("Sent packet doesn't match received packet")
+ pkt_recv.show2()
+ raise RuntimeError("Sent packet doesn't match received packet")
def main():
@@ -55,7 +55,8 @@ def main():
hops = int(args.get_arg('hops'))
if is_dst_tg and (src_if_name == dst_if_name):
- raise Exception("Source interface name equals destination interface name")
+ raise RuntimeError(
+ "Source interface name equals destination interface name")
src_if = Interface(src_if_name)
src_if.send_pkt(str(create_gratuitous_arp_request(src_mac, src_ip)))
@@ -71,7 +72,7 @@ def main():
if is_dst_tg:
pkt_req_recv = dst_if.recv_pkt()
if pkt_req_recv is None:
- raise Exception('Timeout waiting for packet')
+ raise RuntimeError('Timeout waiting for packet')
check_ttl(pkt_req_send[IP].ttl, pkt_req_recv[IP].ttl, hops)
pkt_req_send_mod = pkt_req_send.copy()
@@ -86,7 +87,7 @@ def main():
pkt_resp_recv = src_if.recv_pkt()
if pkt_resp_recv is None:
- raise Exception('Timeout waiting for packet')
+ raise RuntimeError('Timeout waiting for packet')
if is_dst_tg:
check_ttl(pkt_resp_send[IP].ttl, pkt_resp_recv[IP].ttl, hops)
@@ -95,6 +96,50 @@ def main():
del pkt_resp_send_mod[IP].chksum # update checksum
ckeck_packets_equal(pkt_resp_send_mod[IP], pkt_resp_recv[IP])
+ if not pkt_resp_recv.haslayer(IP):
+ raise RuntimeError('Received packet does not contain IPv4 header: {}'.
+ format(pkt_resp_recv.__repr__()))
+
+ if pkt_resp_recv[IP].src != pkt_req_send[IP].dst:
+ raise RuntimeError(
+ 'Received IPv4 packet contains wrong src IP address, '
+ '{} instead of {}'.format(pkt_resp_recv[IP].src,
+ pkt_req_send[IP].dst))
+
+ if pkt_resp_recv[IP].dst != pkt_req_send[IP].src:
+ raise RuntimeError(
+ 'Received IPv4 packet contains wrong dst IP address, '
+ '{} instead of {}'.format(pkt_resp_recv[IP].dst,
+ pkt_req_send[IP].src))
+
+ # verify IPv4 checksum
+ copy = pkt_resp_recv.copy()
+ chksum = copy[IP].chksum
+ del copy[IP].chksum
+ tmp = IP(str(copy[IP]))
+ if tmp.chksum != chksum:
+ raise RuntimeError('Received IPv4 packet contains invalid checksum, '
+ '{} instead of {}'.format(chksum, tmp.chksum))
+
+ if not pkt_resp_recv[IP].haslayer(ICMP):
+ raise RuntimeError(
+ 'Received IPv4 packet does not contain ICMP header: {}'.
+ format(pkt_resp_recv[IP].__repr__()))
+
+ # verify ICMP checksum
+ copy = pkt_resp_recv.copy()
+ chksum = copy[IP][ICMP].chksum
+ del copy[IP][ICMP].chksum
+ tmp = ICMP(str(copy[IP][ICMP]))
+ if tmp.chksum != chksum:
+ raise RuntimeError('Received ICMP packet contains invalid checksum, '
+ '{} instead of {}'.format(chksum, tmp.chksum))
+
+ pkt_req_send_mod = pkt_req_send.copy()
+ pkt_req_send_mod[IP][ICMP].type = pkt_resp_recv[IP][ICMP].type
+ del pkt_req_send_mod[IP][ICMP].chksum # update checksum
+ ckeck_packets_equal(pkt_req_send_mod[IP][ICMP], pkt_resp_recv[IP][ICMP])
+
if __name__ == "__main__":
main()