一直对ovs中facet和subfacet概念搞不清楚,今天仔细查了网上,关于这个的解释信息好少,以下这个是mail list里面的回答,感觉挺正确了:
As I understand, there are two kinds of flow in OVS. One is in the user space, e.g. vswitchd, where flow key can include some wildcards to match, while the other lies in kernel space, e.g. openvswitch.ko, where the flow key can never have wildcard.
If no wildcard in user space flow (a.k.a facet), the flow from kernel space (a.k.a subfacet) will exactly match its facet, which means one facet has only one subfacet
If not, the user space flow can match multiple flows from kernel
space, leads to the scenario that one facet contains multiple
subfacets
首先我们来弄清几个名词概念:
- wildcard表示匹配元组的掩码,openflow协议中共有12项元组,包括:
inport
,dl_src
,dl_dst
,dl_vlan
,dl_vlan_pcp
,dl_type
,nw_tos
,nw_proto
,nw_src
,nw_dst
,tp_src
,tp_dst
这12个,可以用一个12位的类型表示,一位代表一个元组,具体每项含义查看openflow协议。举个例子,比如掩码3这个数字在12位二进制中是0000000000011,那么可以表示tp_src
,tp_dst
给定,其余都不给定(这个顺序不一定刚刚是这两个元组)。 - facet是模糊匹配,使用通配符进行匹配;而subfacet是精确配置。模糊匹配的意思是可以有1个或1个以上的元组不指定,而精确匹配则每个元组都必须指定。
- facet位于user space,而subfacet位于kernel space。
- 报文在通过datapath的时候,首先在kernel space查找精确匹配表,如果匹配成功,则执行对应的action;反之,如果没有找到,使用upcalls递送至user space,ovs-vswitchd.c生成的守护进程会不断轮循,如果发现有包被递送,就会查找模糊匹配表。
- subfacet在linux kernel space dp里他是exact match,不过port到其他dp上就不一定了 也可以是那个dp所支持的wildcard match。
报文匹配总结流程如下:
- kernel里面有且仅有一个table表,也就是所谓的subfacet,用于精确匹配。可以使用以下命令进行查看:
ovs-dpctl dump-flows
。默认情况下,一条subfacet的存在时间为5秒,防止因为subfacet时间过久积累过多对内核性能的影响。对于一个刚刚进入kernel的流,如果能在subfacet中找到匹配,则直接执行对应的action,例如转发到某个port。其查找过程是利用hash table实现,注意subfacet中的掩码为全1。 - 如果kernel中没有找到精确匹配的,则upcall至用户空间的vswitchd进程。该进程首先会在facet中的table 0中利用hash table按优先级进行模糊查找,所谓的模糊查找就是掩码不全为1。若存在模糊匹配成功,则直接发送对应的action给kernel,告诉kernel去执行该action,与此同时,下发该flow的12元组信息到kernel中的subfacet,保留5秒用于之后的精确匹配。注意:如果table中没有resubmit是不会跳转到别的table,只有存在resubmit动作,才会投递至别的table。
报文匹配流程参考下图(来自AlexWu大神,总结的真是太好了)
我看了最新版的源码,貌似已经取消了facet和subfacet的概念,这个版本还是1.9的,看来要跟进源码版本了。
参考:
http://blog.csdn.net/alex0/article/details/8871711
http://openvswitch.org/pipermail/discuss/2012-February/006447.html