前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OFTest(一):如何忽略一些字段在端口poll报文

OFTest(一):如何忽略一些字段在端口poll报文

作者头像
SDNLAB
发布2018-04-02 12:11:44
6820
发布2018-04-02 12:11:44
举报
文章被收录于专栏:SDNLABSDNLAB

1

前言

✔ 关于OFTest的介绍,请戳这里(https://github.com/floodlight/oftest)

✔ 总的来说,就是用python写的测试Openflow协议一致性的测试套件

✔ 可以将OFTest扩展为测试Openflow的测试平台,例如做压力测试

2

遇到的问题

OFTest的verify_packets,会要求给定期望报文的全部str,然后通过poll()来判断是否capture到报文,并且capture的报文的每个字段是否和期望值完全一致。

但是对于一些封装后的报文,例如NVGRE封装,封装后的外层IP header的Identity字段是无法预知的,当然IP header的checksum也是无法预知的。还有VXLAN的报文,除了上面说到的两个field之外,UDP的source-port也是未知的(当然dest-port一定是4789),同时UDP header的checksum也是未知的

如果要检查封装后的报文,必须提供忽略指定字段的API。

本例采用的是传入一个tuple的list,每个tuple包含需要忽略字段的起始offset和终止offset

3

具体解决

抓包相关的函数定义在/src/python/oftest/testutils里面

追溯函数调用verify_packets->verify_packets->poll->match_exp_pkt

match_exp_pkt很简单,就是return str(pkt)==str(exp_str),意味着哪怕有一个字段不相符,OFTest都会认为是没有抓到期望报文

添加上面各个函数对应的新定义函数,例如match_exp_pkt_ignore_parts,同时末尾增加一个参数,就是ignore_list,用来传递需要忽略的字段offset的起至点

match_exp_pkt_ignore_part定义如下
def match_exp_pkt_ignore_parts(exp_pkt,pkt,ignore_list):
    e = str(exp_pkt)
    p = str(okt)
    if len(e)<60:
        p = p[:len(e)]
    start_p = 0 
    for (u,v) in ignore_list:
        if (e[start_p:u]!=p[start_p:u]):
              return False
        start_p=v
    if (e[start_p:-1]!=p[start_p:-1]):
        return False
    return True

例如capture封装成nvgre格式的报文

verify_packets_ignore_list(self,str(exp_pkt),str(pkt),out_port,[ip_id_field,ip_checksum_field,gre_hash_field])

其中这些field预先定义

ip_id_field = (18,20)
ip_checksum_field = (24,26)
gre_hash_field = (41,42)

如果遇到包含vlan_tag,这些field都要增加4,就不累述了

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SDNLAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档