构造Rqa模块的CaseSeq

博客围绕网络的五个策略(etype、tcpsyn、五元组、rss、fd)进行基础CASE分析。介绍了各策略的基本信息、代码及波形情况,包括代码框架、可修改部分,如寄存器配置、报文构造等,还提及波形查看及问题追踪与修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

(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

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_tablefd_addrfd_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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值