流表分为两大类:
1、 内核中flow table 也称为fast path
2、找用户态中flow table被称为slow path
一个数据报文接收后,会经过多个流表,每个流表负责特定的功能, ovs中的多级流表存放在用户空间,内核态存放的是流表的缓存。
网卡收到报文时,Openvswitch.ko是这么处理数据报文的:
1、通过key查找内核中的flow table,得到action,然后执行action之后,直接发送这个包;
2、在内核无法查找到流表项的时候,通过netlink的方式发送到用户空间,接着会去查找用户态的流表。 真个过程是通过upcall来调用用户态ovs-vswtichd中的flow table实现的
3、如果用户态命中则将对应的信息丢给内核态进行缓存。用户空间没有查到,用户态还要继续将报文的信息丢给控制器,由控制器下发对应的规则
key的组成
MAC层的key :key->eth
网络层的key:key->ip
传输层的key:key->tp
流表发送 流表下发一般是通过以下两种方式: controller通过openflow协议下发FLOW_MOD命令给ovs的Userspace流表。 ovs-ofctl通过openflow协议下发FLOW_MOD给ovs的Userspace流表。ovs-ofctl add-flow最终调用 ofctl_flow_mod(ctx->argc, ctx->argv, OFPFC_ADD); ofctl_flow_mod handle_openflow