OpenvSwitch-匹配流程

http://blog.csdn.net/alex0/article/details/8871711


版本:OVS 1.7.1

简称:dp->datapath, of->OpenFlow, sw->switch

背景:

  • 报文匹配的流程可以说是对一个switch效率影响最大的地方,现在已经有很多厂家(包括一些研究院)说可以做到比OVS效率高十倍的流表匹配。
  • 当然这是有可能的,毕竟都是纯软件,非常容易创新。而ovs也没有做多级流表,跟of标准上不一定比得过别人。我们接下来就分析一下OVS的匹配流程。
TIPS:

  • 整体的匹配逻辑很简单,都是OpenFlow规定好的。
  • 报文通过dp时先查找精确匹配表(facet),如果找不到,那么进行upcall,上送到用户态。
  • 在用户态会查找模糊匹配表(table),这个地方可以说是较没有效率的地方。下面我们看一看具体的代码。

调用流程(内核)

ovs_vport_receive->ovs_dp_process_received_packet->ovs_flow_tbl_lookup->ovs_dp_upcall->queue_userspace_packet

调用流程(用户态):

handle_miss_upcalls->handle_flow_miss->rule_dpif_lookup->rule_dpif_lookup__->classifier_lookup->find_match

  1. handle_miss_upcalls里解析了报文,生成了报文的精确匹配项,如果我们把它遮盖掉(mask)一部分,那么它就是一个模糊匹配的flow了。实际上ovs也就是这么做的。
  2. 注意到每个flow table拥有一个cls,一个cls拥有多个cls_table,cls_table中拥有mask完全一致的flow。
  3. 而在find_match中,ovs将精确匹配项对应cls_table的mask位置0,然后通过hash查找是否有匹配的flow。

关键代码

[cpp]  view plain copy
  1. /* 在'cls'中取出优先级最高的匹配'flow'. 
  2.  * 如果'cls'中无匹配'flow'则返回空指针.  如果多条rule 
  3.  * 匹配'flow'且优先级相同, 随便拿一条. */  
  4. struct cls_rule *  
  5. classifier_lookup(const struct classifier *cls, const struct flow *flow)  
  6. {  
  7.     struct cls_table *table;  
  8.     struct cls_rule *best;  
  9.     best = NULL;  
  10.     HMAP_FOR_EACH (table, hmap_node, &cls->tables) {  
  11.         struct cls_rule *rule = find_match(table, flow);  
  12.         if (rule && (!best || rule->priority > best->priority)) {  
  13.             best = rule;  
  14.         }  
  15.     }  
  16.     return best;  
  17. }  
[cpp]  view plain copy
  1. static struct cls_rule *  
  2. find_match(const struct cls_table *table, const struct flow *flow)  
  3. {  
  4.     struct cls_rule *rule;  
  5.     //如果cls_table是获取所有流的(掩码全0),那么直接尝试匹配  
  6.     if (table->is_catchall) {  
  7.         HMAP_FOR_EACH (rule, hmap_node, &table->rules) {  
  8.             return rule;  
  9.         }  
  10.     } else {  
  11.         struct flow f;  
  12.   
  13.         f = *flow;  
  14.         //将table掩码对应的flow位置0(相当于被mask了)  
  15.         flow_zero_wildcards(&f, &table->wc);  
  16.         //取出hash一致的flow进行迭代  
  17.         HMAP_FOR_EACH_WITH_HASH (rule, hmap_node, flow_hash(&f, 0),  
  18.                                  &table->rules) {  
  19.             //尝试匹配hash对得上的flow,效率不高(里面就是memcmp)  
  20.             if (flow_equal(&f, &rule->flow)) {  
  21.                 return rule;  
  22.             }  
  23.         }  
  24.     }  
  25.   
  26.     return NULL;  
  27. }  

报文匹配流程图:




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值