#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# ################################################################
# Copyright (C), 2022, TP-LINK Technologies Co., Ltd.
# File Name: TD428385_static_ip_connectivity_after_reboot.py
# Author: linxin@tp-link.com.hk
# History:
# 1, Mar 18 2017, linxin@tp-link.com.hk, created
# ################################################################
import pysat.sat_test
import pysat.sat_result
import logging
import time
import self as self
import topologies
import PyPing
import PyIP
try:
import pysat.rpc as rpc
except:
import rpc
class StaticIpConnectivityAfterReboot(topologies.TopoLanTestCase):
def __init__(self):
topologies.TopoLanTestCase.__init__(self)
self.logger = logging.getLogger(self.__class__.__name__)
self.case_info = pysat.sat_test.CaseInfo()
self.case_info.name = 'static_ip_connectivity_after_reboot'
self.case_info.id = 'TD428385'
self.case_info.version = '2017/03/18'
self.case_info.author = 'linxin@tp-link.com.hk'
self.case_info.testbeds = self.get_testbed_list()
self.case_info.description = '''
Step1: 恢复出厂设置并配置DUT和PC的静态IP
Step2: 重启DUT并检查网络连接信息
Step3: 验证IP地址生效
Step4: 验证子网掩码和网关设置
Step5: 验证MTU设置对TCP报文的影响
Step6: 验证MTU设置对ICMP报文的影响
Step7: 验证MTU设置对ICMP分片的影响
'''
def add_task(self):
# register the class
self.register_case(self.do_test, self.case_info)
def do_test(self):
# test start
self.logger.info('%s start...' % self.case_info.name)
try:
# -----------------------------------------------------------------------------------------
# Initialize...
# -----------------------------------------------------------------------------------------
self.logger.info('Initialize...')
result = pysat.sat_result.ResultInfo()
time.sleep(2)
# 定义测试参数
dut_ip = "192.168.202.10" # 从192.168.202.0/24网段中选择
subnet_mask = "255.255.255.0"
gateway = "192.168.202.254"
mtu = 1400
primary_dns = "192.168.202.254"
secondary_dns = "192.168.203.254"
pc_ip_same_net = "192.168.202.100"
pc_ip_different_net = "192.168.203.100"
# -----------------------------------------------------------------------------------------
# Step1: 恢复出厂设置并配置DUT和PC的静态IP
# -----------------------------------------------------------------------------------------
self.logger.step('Step1: 恢复出厂设置并配置DUT和PC的静态IP')
# 恢复出厂设置
self.topo.dut.factory_reset()
time.sleep(30) # 等待设备重启完成
# 设置DUT为静态IP
self.topo.dut.set_wan_static_ip(dut_ip, subnet_mask, gateway, primary_dns, secondary_dns, mtu)
self.logger.info('设置DUT为静态IP: %s, 掩码: %s, 网关: %s, MTU: %s' % (dut_ip, subnet_mask, gateway, mtu))
# 设置PC的IP地址
self.topo.dut_lan_iface.set_ip(pc_ip_same_net, subnet_mask)
self.logger.info('设置PC IP为: %s, 掩码: %s' % (pc_ip_same_net, subnet_mask))
# 检查设置是否成功
wan_status_info = self.topo.dut.get_wan_status_info()
if (wan_status_info['ipaddr'] == dut_ip and
wan_status_info['netmask'] == subnet_mask and
wan_status_info['gateway'] == gateway):
result.add_result(item_id="Step1: 恢复出厂设置并配置DUT和PC的静态IP", passfail=result.PASS,
test_comment="设置成功")
else:
self.break_test("Step1: 恢复出厂设置并配置DUT和PC的静态IP, 设置失败")
# -----------------------------------------------------------------------------------------
# Step2: 重启DUT并检查网络连接信息
# -----------------------------------------------------------------------------------------
self.logger.step('Step2: 重启DUT并检查网络连接信息')
# 重启DUT
self.topo.dut.reboot()
time.sleep(60) # 等待设备重启完成
# 检查网络连接信息是否与设置一致
wan_status_info = self.topo.dut.get_wan_status_info()
system_info = self.topo.dut.get_system_info()
if (wan_status_info['ipaddr'] == dut_ip and
wan_status_info['netmask'] == subnet_mask and
wan_status_info['gateway'] == gateway and
system_info['ip_address'] == dut_ip):
result.add_result(item_id="Step2: 重启DUT并检查网络连接信息", passfail=result.PASS,
test_comment="网络连接信息与设置一致")
else:
self.break_test("Step2: 重启DUT并检查网络连接信息, 网络连接信息与设置不一致")
# -----------------------------------------------------------------------------------------
# Step3: 验证IP地址生效
# -----------------------------------------------------------------------------------------
self.logger.step('Step3: 验证IP地址生效')
# 从PC端ping DUT的静态IP
is_ok = PyPing.check_ping(dut_ip)
if is_ok:
result.add_result(item_id="Step3: 验证IP地址生效", passfail=result.PASS,
test_comment="可以Ping通DUT的IP地址")
else:
self.break_test("Step3: 验证IP地址生效, Ping不通DUT的IP地址")
# -----------------------------------------------------------------------------------------
# Step4: 验证子网掩码和网关设置
# -----------------------------------------------------------------------------------------
self.logger.step('Step4: 验证子网掩码和网关设置')
# 设置PC IP为同一子网的地址
self.topo.dut_lan_iface.set_ip(pc_ip_same_net, subnet_mask)
# 开始抓包
scapy = rpc.RemoteObj(self.topo.dut_lan_iface.hostname, 'PyScapy')
linkname = self.topo.dut_lan_iface.get_linkname()
scapy.tsniff(timeout=10, iface=linkname,
lfilter=scapy.eval_lfilter(r"lambda x:x.haslayer('ICMP') and x['IP'].src == '" + dut_ip + "'"))
# 从PC ping DUT
PyPing.ping(dut_ip, count=3)
# 获取抓包结果
packets = scapy.join_tsniff(timeout=15)
# 检查回复包的目的MAC是否为PC的MAC
pc_mac = self.topo.dut_lan_iface.get_mac()
found_correct_mac = False
for pkt in packets:
if pkt.haslayer('Ether') and pkt['Ether'].dst == pc_mac:
found_correct_mac = True
break
if found_correct_mac:
result.add_result(item_id="Step4: 验证子网掩码和网关设置-同一子网", passfail=result.PASS,
test_comment="同一子网通信正常")
else:
self.break_test("Step4: 验证子网掩码和网关设置, 同一子网通信异常")
# 设置PC IP为不同子网的地址
self.topo.dut_lan_iface.set_ip(pc_ip_different_net, "255.255.255.0")
# 开始抓包
scapy.tsniff(timeout=10, iface=linkname,
lfilter=scapy.eval_lfilter(r"lambda x:x.haslayer('ICMP') and x['IP'].src == '" + dut_ip + "'"))
# 从PC ping DUT
PyPing.ping(dut_ip, count=3)
# 获取抓包结果
packets = scapy.join_tsniff(timeout=15)
# 检查回复包的目的MAC是否为网关的MAC
# 注意:这里需要先获取网关的MAC地址,可能需要通过ARP查询
# 简化处理:检查回复包的目的MAC不是PC的MAC
found_gateway_mac = False
for pkt in packets:
if pkt.haslayer('Ether') and pkt['Ether'].dst != pc_mac:
found_gateway_mac = True
break
if found_gateway_mac:
result.add_result(item_id="Step4: 验证子网掩码和网关设置-不同子网", passfail=result.PASS,
test_comment="不同子网通信正常")
else:
self.break_test("Step4: 验证子网掩码和网关设置, 不同子网通信异常")
# -----------------------------------------------------------------------------------------
# Step5: 验证MTU设置对TCP报文的影响
# -----------------------------------------------------------------------------------------
self.logger.step('Step5: 验证MTU设置对TCP报文的影响')
# 开始抓包
scapy.tsniff(timeout=30, iface=linkname,
lfilter=scapy.eval_lfilter(r"lambda x:x.haslayer('TCP') and x['IP'].src == '" + dut_ip + "'"))
# 通过web访问DUT,触发视频流传输
self.topo.dut.open_browser("chrome")
self.topo.dut.login(open_browser=True, username="admin", password=self.topo.dut.password, waittime=5)
self.topo.dut.start_video_preview()
time.sleep(10) # 等待视频流传输
# 获取抓包结果
packets = scapy.join_tsniff(timeout=15)
# 检查TCP分片包的长度
mtu_valid = True
for pkt in packets:
if (pkt.haslayer('IP') and
len(pkt['IP']) > mtu and
pkt['IP'].flags & 0x1): # 检查MF分片标志
# 计算分片包的总长度(不包括最后一片)
total_length = len(pkt['IP'].payload) + 20 # IP头20字节
if total_length > mtu:
mtu_valid = False
break
if mtu_valid:
result.add_result(item_id="Step5: 验证MTU设置对TCP报文的影响", passfail=result.PASS,
test_comment="TCP分片符合MTU设置")
else:
self.break_test("Step5: 验证MTU设置对TCP报文的影响, TCP分片不符合MTU设置")
# -----------------------------------------------------------------------------------------
# Step6: 验证MTU设置对ICMP报文的影响
# -----------------------------------------------------------------------------------------
self.logger.step('Step6: 验证MTU设置对ICMP报文的影响')
# 开始抓包
scapy.tsniff(timeout=10, iface=linkname,
lfilter=scapy.eval_lfilter(r"lambda x:x.haslayer('ICMP') and x['IP'].src == '" + dut_ip + "'"))
# 发送不会导致分片的ping请求
ping_size = mtu - 28 # IP头20字节 + ICMP头8字节
PyPing.ping(dut_ip, size=ping_size, count=3)
# 获取抓包结果
packets = scapy.join_tsniff(timeout=15)
# 检查ICMP回复包是否没有分片
icmp_no_fragment = True
for pkt in packets:
if (pkt.haslayer('IP') and
pkt['IP'].flags & 0x2): # 检查DF不分片标志
# 计算包的总长度
total_length = len(pkt['IP'])
if total_length > mtu:
icmp_no_fragment = False
break
if icmp_no_fragment:
result.add_result(item_id="Step6: 验证MTU设置对ICMP报文的影响-无分片", passfail=result.PASS,
test_comment="ICMP报文无分片,符合MTU设置")
else:
self.break_test("Step6: 验证MTU设置对ICMP报文的影响, ICMP报文异常分片")
# -----------------------------------------------------------------------------------------
# Step7: 验证MTU设置对ICMP分片的影响
# -----------------------------------------------------------------------------------------
self.logger.step('Step7: 验证MTU设置对ICMP分片的影响')
# 开始抓包
scapy.tsniff(timeout=10, iface=linkname,
lfilter=scapy.eval_lfilter(r"lambda x:x.haslayer('ICMP') and x['IP'].src == '" + dut_ip + "'"))
# 发送会导致分片的ping请求
ping_size = mtu - 27 # 比MTU小1字节,应该会导致分片
PyPing.ping(dut_ip, size=ping_size, count=3)
# 获取抓包结果
packets = scapy.join_tsniff(timeout=15)
# 检查ICMP回复包是否分片
icmp_fragmented = False
for pkt in packets:
if (pkt.haslayer('IP') and
pkt['IP'].frag > 0): # 检查分片偏移
icmp_fragmented = True
# 检查分片包长度是否符合以太网最小帧长
if len(pkt['IP']) < 64:
self.break_test("Step7: 验证MTU设置对ICMP分片的影响, 分片包长度不符合以太网最小帧长")
break
if icmp_fragmented:
result.add_result(item_id="Step7: 验证MTU设置对ICMP分片的影响", passfail=result.PASS,
test_comment="ICMP报文正确分片,符合MTU设置")
else:
self.break_test("Step7: 验证MTU设置对ICMP分片的影响, ICMP报文未分片")
except Exception as ex:
# break test by exception
self.logger.error('Test fail: %s' % ex)
result.add_result(passfail=result.FAIL, test_comment='Test fail: %s' % ex)
finally:
# saving result
try:
self.topo.dut.close_browser()
except:
self.logger.info('关闭浏览器失败')
return result
```
最新发布