CONJUNCTIVE MATCH FIELDS原理

问题?

一条单独的openflow的字段只能匹配一个条件,但是总会有需要匹配多个条件的使用场景。

为了匹配一组字段可以通过多加对应个数的流表来实现,当然这是最简单高效的方法。

eg: 把原地址是a,b,c,d发给控制器处理,你可以通过如下多条流表实现:

ip,ip_src=a actions=controller

ip,ip_src=b actions=controller

ip,ip_src=c actions=controller

ip,ip_src=d actions=controller

当然和其相识的场景如下,e,f,g,h的目的地址的发给控制器处理

ip,ip_dst=e actions=controller

ip,ip_dst=f actions=controller

ip,ip_dst=g actions=controller

ip,ip_dst=h actions=controller

但是问题来了,你把上述两种情况流表,都放到一个table中,就会出现问题:

当前情况是,如果源ip是a,b,c,d,目的ip是e,f,g,h;或者两个条件只要满足一个,数据包就被发给controller处理

很显然,上述流表可能命中多个,一般来讲出现这种情况需要优先级概念来区分查找到精确的流表,否则优先级别全部相同情况下,命中策略就是不稳定性的

也不知道会命中哪一条策略。

假定,如果想要连续匹配,源地址和目的地址必须分别在abcd和efgh中选取,那么共有16总流表来实现此需求,当然我们举例的场景使用这种方法不会别扭,但是如果情况更复杂?

综上所述,conjunction就诞生了(ovs2.4+支持)

如何实现的?

32-bit id for conjunctive

32位的id是openflow table中具有唯一性

如何实现的?

首先根据conjunction ID找到第一条流表,然后,查找对应conjunction 匹配集合;conjunction(id, k/n)来表示,其中id为conjunction ID ,k是dimension的编号,n是dimension 总数

那么怎么样算是满足条件?n个dimension集合中,每一个集合必须有一个满足;这样必须有n个条件满足才算这个conjunction 满足情况,进行相应的动作执行。

eg:

conj_id=1234 actions=controller
ip,ip_src=10.0.0.1 actions=conjunction(1234, 1/2)
ip,ip_src=10.0.0.4 actions=conjunction(1234, 1/2)
ip,ip_src=10.0.0.6 actions=conjunction(1234, 1/2)
ip,ip_src=10.0.0.7 actions=conjunction(1234, 1/2)
ip,ip_dst=10.0.0.2 actions=conjunction(1234, 2/2)
ip,ip_dst=10.0.0.5 actions=conjunction(1234, 2/2)
ip,ip_dst=10.0.0.7 actions=conjunction(1234, 2/2)
ip,ip_dst=10.0.0.8 actions=conjunction(1234, 2/2)

两个条件,源IP(dimension 1 of2)和目的IP(dimension 2 of 2)同时满足的写法;假设有如下流量模型:

a. src ip 10.0.0.1 dst ip 114.114.114.114 

b. src ip 10.0.0.7 dst ip 10.0.0.8

c. src ip 10.0.0.8 dst ip 10.0.0.1

d. src ip 1.1.1.1 dst ip 2.2.2.2 

上述abcd四个选项,只有b是满足条件的,可以执行actions=controller(将数据包发给控制器)