简介:
(1)五个策略:etype、tcpsyn、tup5、rss、fd
(2)每个策略的CaseSeq包括
(3)单个基础Case文件、各策略的基础Case文件
路径:/tsrn20/dv/nic_dv/tests
要求:对基础的Case进行掌握,会改、会写
难度:rss fd
unit_rqa_base_case
unit_rqa_etype_base_case
unit_rqa_tcpsyn_base_case
unit_rqa_tup5_base_case
unit_rqa_rss_base_case
unit_rqa_fd #存疑
(4)拆分功能点,写case
(5)未知
一个寄存器占4个地址
基础CASE分析
1 代码
在寄存器表配置部分,
一 etype策略
1 基本信息
作用:产生预期激励
权限:case验证人员
新版本:采用类继承和扩展以省区每个功能类中的基础函数,所以只需要对类中函数重写
2 代码
(1)文件产生
对已有的case进行基本的修改复制一个文件夹
cp -r unit_rqa_fd_profileid_000_110 unit_rqa_etype #复制当前文件夹A重命名为B
gvim unit_rqa_etype #打开编辑B
(2)代码框架:
激励报文生成
import #引用,尽量直接写函数名,不要写*
#创建class类(GenPcap) 继承自 基础类(RqaGenPcapBase)
class GenPcap(RqaGenPcapBase):
#GenPcap提供生成数据包和解析数据包的方法:
def _init_方法 #初始化函数,初始值
def genPkt方法 #生成一个数据包。创建以太网帧、APR请求、数据包填充、达到指定长度、返回数据包和配置信息 -动 p pkt_cfg
def parse_key_gen方法 #解析生成的数据包
寄存器配置
#创建Table_Set类,用于设置和管理不同类型的内存表
class Table_Set():
def __init__ #初始化函数,接收不同类型的内存表实例作为参数 -不动
def tableSet #执行表的设置操作 -动 配置寄存器
def cfgregSet #配置寄存器设置 -不动
def rqatableSet #设置表项的具体实现
def exact_mix
def signature_mix #生成混合签名
终端响应函数
#创建CaswCfg函数
def CaseCfg(): #配置字典config
config = {
,"plens": [200 for i in range(5)] #default cfg -动 长度、发多少包
}
(3)可修改部分
Part 1-寄存器配置类的tableSet部分
def tableSet(self):
#self.cfgregSet(0x12345678)#changed by cfgCtrl
self.rqatableSet(fd_table=0,fd_addr=0x82a,fd_data=0x2100)
read = self.rqatableSet(fd_table=0,fd_addr=0x82a)
print("table read data is :{read}")
table = self.exact_mix(entry_vld = 1, inputset=0x1414_1419_1414_1415, port=37, profile=0xe, action=0xfffffffff, end=1, next_fd_ptr =0xfff)
self.rqatableSet(etype_addr=0x974,etype_data=0X8000_0806) #update
#print("read table = ")
#print(read_table)
#print(len(read_table))
self.cfgregSet()
以上需要修改的部分为
self.rqatableSet(etype_addr=0x974,etype_data=0X8000_0806) #update
a etype_data 由寄存器列表可知
[31]为使能位、[30]、[29:23]、[22:20]为pnority id、[0-7]优先级最高、[9:16]保留、[15:0]协议号
在这些地址位中,只需要配置[31]、[15:0]
1 [31]=1【使能打开】,把1 左移31位 =0X8000_0000 【即etype_data = 8000_type】
2 [15:0] 先看wireshark或者华为文件 看ARP type值=0X0806 【ARP:MPLS层】
-先切换到 /tsim/unit_raq_etype ,用wireshark打开drv_pkt.pcap文件
-查看type值
所以综上所述,etype_data= 0X8000_0806
b etype_addr
---------------------------------------------------------------------------------------------------------------------
【nic要配基地址:基地址_偏移地址,rqa只配偏移地址】
基地址
---------------------------------------------------------------------------------------------------------------------
对于rqa模块的偏移地址,组成如下
memory 深128 [0-128] -[12:6]act_vport_value; 宽16 [0-15]-[5:2]
etype_addr=[12:6] 【940】+[5:2]【3c】 + [1:0]【默认0】 =940+3c=97c
-[12:6] memory address
act_vport_ok打开(=1) 就要把act_vport_value值给出去(37)为[12:6] 【代表只用第37行】
def genPkt(self,plen=64,pkt_id=0):
# plen
#==============================#
# down stream pkt gen
#==============================#
p = Ether(dst='00:%02x:%02x:ff:ff:ff'%(((pkt_id)>>8)&0xff,(pkt_id)&0xff),src='00:%02x:%02x:11:11:11'%(((pkt_id)>>8)&0xff,(pkt_id)&0xff))
p /= ARP()
p = seqPad(p,plen)
p = Ether(raw(p))
#==============================#
# cfg down stream pkt handle cmd
#==============================#
# mss = random.randint(64,len(p))
pkt_cfg = {
'act_vport_value':37,'act_vport_ok':1,'act_ovs_valid':0,'act_vir_valid':0,'act_tru_valid':0,'act_default_ring':0,'act_exin_en':1,'act_exin_sel':1,
'act_bypass_en_wire':0,'act_except_en_wire':0
}
37 左移6位 【范围0-127 因为128个vport】
范围0-128
-[5:2] :16组寄存器的选择,0-15一共16张表选一张 【每一行都16张,从前到后遍历后输出对应结果表中的数据】
匹配表
[5:2]数值范围为0-15,左移两位范围为 0-3c ,如果选取第15张表,15左移两位是3c
[5:0]= 11_1100(3c) - 00_0000 二进制
1
结果表
以下省略16行
结果
3 波形
查看是否命中
二 tcpsyn策略
1 基本信息
2 代码分解
PART1 构造数据包(packet)
(1)源代码
(plen数据长度,pkt_id数据包标识符)
def genPkt(self,plen=64,pkt_id=0):
# plen
#==============================#
# down stream pkt gen
#==============================#
p = Ether(dst='00:00:00:ff:ff:ff',src='00:00:00:22:22:22')
p /= Dot1Q(vlan=5)
#p /= ARP(op=random.randint(1,4))
p /= IP(dst="10.10.0.0",src="0.0.10.10")
p /= TCP(sport=16+pkt_id, dport=16+pkt_id, flags=2) //改
p = seqPad(p,plen)
p = Ether(raw(p))
#==============================#
# cfg down stream pkt handle cmd
#==============================#
# mss = random.randint(64,len(p))
pkt_cfg = {
'act_vport_value':0,'act_vport_ok':1,'act_ovs_valid':0,'act_vir_valid':0,'act_tru_valid':0,'act_default_ring':0,'act_exin_en':1,'act_exin_sel':1,
'act_bypass_en_wire':0,'act_except_en_wire':0
} //改
#==============================#
# cfg down strea 6ggggm pkt handle cmd
#==============================#
return [[p,pkt_cfg]]
数据包生成
对象(p)、scapy类(Ether、Dot1Q、IP、TCP)、函数(seqPad)
数据包配置
字典(pkt_cfg)、字典包含的配置项(act_vport_value、act_vport_ok等)
函数返回值
返回列表[ ]、列表包含元组[ ]、元组内的元素[p,pkt_cfg]
其他配置(被注释掉)
ARP(op=random.randint(1,4))
,这表明在某些情况下,可能需要生成ARP请求或响应,但在这个函数的当前版本中,这部分被排除了
(2)修改部分
a
p /= TCP(sport=16+pkt_id, dport=16+pkt_id, flags=2) //更改flags值
具体修改:
对于TCP
syn=1 而syn为1比特 第二位, 所以flags='b10=2
b
pkt_cfg = {
'act_vport_value':1,'act_vport_ok':1,'act_ovs_valid':0,'act_vir_valid':0,'act_tru_valid':0,'act_default_ring':0,'act_exin_en':1,'act_exin_sel':1,
'act_bypass_en_wire':0,'act_except_en_wire':0
}
act_vport_ok=1 代表打开,在此情况下,ac_vport数值将会被传递
由于在tcpsyn_addr
所以 128行 每行1张表
1行没法遍历 需要修改对应的act_vport_value值
ac_vport_value = 1 2 3 4
去分别对应地址中的 0x0004 0x0008 0x0012 0x0016 [相应为命中第1 2 3 4张表]
PART2 配置寄存器
(1)源代码
python类(Table_Set)的方法合集
tableSet方法
-用于设置、读取、打印表格信息
调用rqatableSet
方法来设置一个表格项(表格编号、地址、要写入数据)
def tableSet(self):
#self.cfgregSet(0x12345678)#changed by cfgCtrl
self.rqatableSet(fd_table=0,fd_addr=0xa3a,fd_data=0x2100)
self.rqatableSet(fd_addr=0x8,fd_data=0x8000_0001)
table = self.exact_mix(entry_vld = 1, inputset=0x0010_0010_0a0a_0000_0000_0a0a, port=0, profile=0xa, action=0x1234, end=1, next_fd_ptr =0xfff)
self.rqatableSet(tcpsyn_addr= ,tcpsyn_data=)
read_table = self.rqatableSet(2,0x1500)
#print("read table = ")
#print(read_table)
#print(len(read_table))
self.cfgregSet()
read_table = self.rqatableSet(2, 0x1500):
#这一行调用rqatableSet方法来读取表格编号为2的项,0x1500可能是一个特定的地址或者偏移量。读取的结果被赋值给变量read_table。
cfgreSet方法
rqatableSet方法
用于设置不同类型的表格项。它接受多个参数,包括fd_table
, fd_addr
, fd_data
等,这些参数对应不同类型的表格项。
def rqatableSet(self,fd_table = None,fd_addr = None,fd_data = None,
rss_addr = None,rss_data = None,tup5_addr = None,tup5_data = None,
tcpsyn_addr = None,tcpsyn_data = None,etype_addr = None,etype_data = None):
(2)修改部分
self.rqatableSet(tcpsyn_addr=0x0004,tcpsyn_data=0x8000_0000)
这一行配饰tcpsyn_addr、tcpsyn_data是由于,以下
def rqatableSet(self,fd_table = None,fd_addr = None,fd_data = None,
rss_addr = None,rss_data = None,tup5_addr = None,tup5_data = None,
tcpsyn_addr = None,tcpsyn_data = None,etype_addr = None,etype_data = None):
a tcpsyn_data
根据以下的寄存器表,需要配置
[31]使能 配1 :1左移31位 = 0X8000_0000 【即etype_data = 8000_type】
[0]优先级 1或0 配1
b tcpsyn_addr
根据寄存器列表
偏移地址为0x0299-0x0400 所以 128行 每行只有1张表
那么tcpsyn_addr数值为 0x0004 0x0008 0x0012 0x0016 【相应需要和报文中act_vport_value一致】
3 波形
需要选中的信号
(a) 在eth_syn_policy_inst(syn策略)
1 syn_match_start
2 syn_match_end
3 syn_match_ok
4 syn_match_result
(b)发现syn_match_start 没有拉高,追击syn_match_start,发现与以下信号有关(红色),而在这些信号中发现ex_tcp_syn值设置错误,回去修改case
5 ex_tunnel_flag
6 ex_tcp_syn
7 rqa_dia_cs
8 rqa_dis_fifo_rden
9 pkt_rd_cnt
10 redir_en_reg
(c)syn_match_ok也没有拉高,追击syn_match_ok发现与syn_match_lane_ok有关
11 syn_match_lane_ok
(d)追击syn_match_lane_ok发现和vport[6:0]有关
最后
三 五元组
1 基本信息
要匹配:sip dip sport dport etype
用4张表表述
2etype 3sip dip 4sport dport
第5张为结果
2 代码
(1)原代码
(2)修改部分
a 报文构造
用scapy库构造以太网帧(Ether),其中包含一个IP层和一个TCP层
步骤:创建以太网帧对象p【目的地址,源地址】-将一个IP层添加到以太网帧【源IP地址,目标IP地址】-添加一个TCP层到IP层【源端口号,目的端口号,标签】
def genPkt(self,plen=64,pkt_id=0): #函数定义:genPkt函数去生成plen数据包长度:64字节、pkt_id为数据包标识符默认0的以太网数据包
# plen
#==============================#
# down stream pkt gen
#==============================#
p = Ether(dst='00:00:00:ff:ff:ff',src='00:00:00:11:11:11')
p /= IP(src='11.12.13.0',dst='11.12.13.14')
p /= TCP(sport = 16_pkt_id, dport = 16+pkt_id,flags=0)
p = seqPad(p,plen) #自定义函数用于填充数据包,达到长度plen
p = Ether(raw(p)) #构造好的数据包重新打包成以太网帧对象,确保所有层组装到一起
#==============================#
# cfg down stream pkt handle cmd
#==============================#
# mss = random.randint(64,len(p))
pkt_cfg = {
'act_vport_value':0,'act_vport_ok':1,'act_ovs_valid':0,'act_vir_valid':0,'act_tru_valid':0,'act_default_ring':0,'act_exin_en':1,'act_exin_sel':1,
'act_bypass_en_wire':0,'act_except_en_wire':0
}
#pkt_dfg是一个字典,用于配置数据包的处理命令,指导如何生成数据包
b 寄存器表配置
def tableSet(self):
#配置rqtable表中项
self.rqatableSet(tup5_addr = 0x20,tup5_data = 0x8000_0000) #sport TCP
self.rqatableSet(tup5_addr = 0x20,tup5_data = 0x8000_0000) #dport TCP
self.rqatableSet(tup5_addr = 0x20,tup5_data = 0x8000_0000) #sip IP
self.rqatableSet(tup5_addr = 0x20,tup5_data = 0x8000_0000) #dip IP
self.rqatableSet(tup5_addr = 0x20,tup5_data = 0x8000_0000) #etype Ether
#print("read table = ")
#print(read_table)
#print(len(read_table))
self.cfgregSet() #将改后的数据写入到设备的寄存器,或更新设备的配置状态
(3)具体配置
a SIP 11.12.13.14
点分十进制 转换为 十六进制
b DIP 11.12.13.0
c SPORT DPORT 1 1
根据寄存器列表,也就是将第16位 第0位都配成1 对应的十六进制数为 tup_data
d flitter= 0xc00f_8006
[31] enum enable 是否启用特定策略 1/0
[30] vport_enable 是否设置虚拟端口(vport)1/0
[29:23] vport_num 虚拟端口编号,一般从0开始
[22:20]priority id 优先级ID,0-7,0是最高优先级
[19]L3TYPE协议类型掩码,设为1,则启用第三层L3(即网络层)协议匹配的类型
[18]目的端口掩码,设为1,启用目的端口号匹配
[17]源端口掩码
[16]目的IP掩码
[15]源IP掩码
[14:9]reserved 未被使用,保留为0
[8] IPV4/IPV6策略 0 ipv4 1 ipv6
[7:0]L3TYPE 网络层协议类型 IPV4 IPV6 ICMP TCP UDP,每个协议都对应数值
例 TCP 对应数值为0x06
e policy 0x1800_abcd
[31] 决定了数据包是通过(PASS)还是被丢弃(DROP) 0 PASS 1 DROP
[30]RING VALID :1 RING NUM
字段有效
[29]VLAN VALID: 设置为1,表示RM VLAN TYPE
字段有效。
[28]MARK VALID: 设置为1,表示MARK
字段有效。
[27]PRIORITY VALID: 设置为1,表示优先级字段有效
[26:18]RING NUM ring号
[17:16]RM VLAN TYPE 指定需要移除的VLAN标签类型
[15:0]MARK 这16位用于设置标记值
由于寄存器列表的位宽为32位,数目为512,偏移地址为0x2000-0x2800,这意味着您可能有512个这样的寄存器项,每个寄存器项占用4字节(32位)
b
tup_addr
tup_data
c
tup_addr
tup_data
d
tup_addr
tup_data
3 波形
四 rss策略
1 基本信息
2 代码
part1 报文构造
part2 寄存器配置
def tableSet(self):
for i in range (0x800):
self.rqatableSet(rss_addr=0x4 * i,rss_data=0x8000_0800)
#print("read table = ")
#print(read_table)
#print(len(read_table))
self.cfgregSet()
五 fd策略
aqa_table_ctrl ---类Table_Set
(3)可修改部分
GenPcap继承于RqaGenPcapBase
common/