前言
- 關(guān)于OFTest的介紹,請(qǐng)戳這里
- 總的來(lái)說(shuō)猪瞬,就是用python寫(xiě)的測(cè)試Openflow協(xié)議一致性的測(cè)試套件
- 可以將OFTest擴(kuò)展為測(cè)試Openflow的測(cè)試平臺(tái)啸胧,例如做壓力測(cè)試
遇到的問(wèn)題
- OFTest的verify_packets邑闲,會(huì)要求給定期望報(bào)文的全部str戳寸,然后通過(guò)poll()來(lái)判斷是否capture到報(bào)文,并且capture的報(bào)文的每個(gè)字段是否和期望值完全一致努释。
- 但是對(duì)于一些封裝后的報(bào)文碘梢,例如NVGRE封裝,封裝后的外層IP header的Identity字段是無(wú)法預(yù)知的伐蒂,當(dāng)然IP header的checksum也是無(wú)法預(yù)知的煞躬。還有VXLAN的報(bào)文,除了上面說(shuō)到的兩個(gè)field之外逸邦,UDP的source-port也是未知的(當(dāng)然dest-port一定是4789)恩沛,同時(shí)UDP header的checksum也是未知的
- 如果要檢查封裝后的報(bào)文,必須提供忽略指定字段的API缕减。
- 本例采用的是傳入一個(gè)tuple的list雷客,每個(gè)tuple包含需要忽略字段的起始o(jì)ffset和終止offset
具體解決
- 抓包相關(guān)的函數(shù)定義在/src/python/oftest/testutils里面
- 追溯函數(shù)調(diào)用verify_packets->verify_packets->poll->match_exp_pkt
- match_exp_pkt很簡(jiǎn)單,就是return str(pkt)==str(exp_str)桥狡,意味著哪怕有一個(gè)字段不相符佛纫,OFTest都會(huì)認(rèn)為是沒(méi)有抓到期望報(bào)文
- 添加上面各個(gè)函數(shù)對(duì)應(yīng)的新定義函數(shù)妓局,例如match_exp_pkt_ignore_parts,同時(shí)末尾增加一個(gè)參數(shù)总放,就是ignore_list呈宇,用來(lái)傳遞需要忽略的字段offset的起至點(diǎn)
- 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格式的報(bào)文
verify_packets_ignore_list(self,str(exp_pkt),str(pkt),out_port,[ip_id_field,ip_checksum_field,gre_hash_field])
- 其中這些field預(yù)先定義
ip_id_field = (18,20)
ip_checksum_field = (24,26)
gre_hash_field = (41,42)
- 如果遇到包含vlan_tag,這些field都要增加4局雄,就不累述了
本文首發(fā)于SDNLAB http://www.sdnlab.com/16838.html