OVS源码阅读
文章平均质量分 77
vonzhou
这个作者很懒,什么都没留下…
展开
-
OVS vswitchd 模块分析(1)
1.开启RPC服务。在当前进程中启动一个worker process作为子进程,当前只支持一个,所以要确保只被调用一次并且要在客户程序主循环中呼叫 worker_run() 和worker_wait() 。worker_start 定义在lib/worker.c,工作流程:通过socketpair函数(仅适用于Unix域套接字)创建一个流管道work_fds[0],work_fds[1],然后原创 2014-02-21 15:55:48 · 2413 阅读 · 0 评论 -
OVS处理upcall过程分析
处理upcall的整体框架是:1.由函数handle_upcalls()批量处理(in batches)的是由内核传上来的dpif_upcalls,会解析出upcall的类型。这里主要看在内核中匹配流表失败的MISS_UPCALL。处理完成后会得到多个flow_miss。结构体dpif_upcall代表的是由内核传到用户空间的一个包,包括上传原因,pac原创 2014-06-08 12:14:48 · 5867 阅读 · 0 评论 -
hmap理解
hash map数据结构在ovs kernel space中经常用到。每个hmap_node 中包括哈希值和指针next,具有相似hash值得节点会通过next域串联起来(注意:所有hash值都是不同的,只是在一个桶中链接的结点hash值具有某种可追踪性or局部性,即与mask相掩之后值相同),可以缩短查找时间。容器hmap中buckets是一个pointer to struct hmap_n原创 2014-02-20 20:13:38 · 8723 阅读 · 0 评论 -
对 dpif_class 结构体的一点认识
类 dpif_class 抽象的是OVS交换机用户空间和内核层datapath的通信接口(通过netlink),分层是出于性能和生产效率的考虑,通过接口dpif_class,用户层ovs-vswitchd会把发送各种端口,流表,查询等动作到内核层进行实际的执行,比如说我们增加一个端口到ovs中,那么就会从用户空间构造增加端口的 dpif_linux_vport 请求到datapath层。重点要原创 2014-08-18 20:44:26 · 3490 阅读 · 0 评论 -
OVS 发送OFPT_PORT_STATUS 过程
根据openflow协议,当一个物理端口从ovs datapath 增加,修改或者删除的时候,都会通过ofp_port_status异步消息告知Controller,比如当我们执行 ovs-vsctl add-port br0 eth0 之类的命令后,就会更新ovsdb数据库,而后全局变量 reconfiguring 变为true,从而会重新配置这个ovs。if (reconfig原创 2014-08-24 10:09:57 · 4623 阅读 · 0 评论 -
ovs处理openflow消息的流程
ovs处理openflow消息的流程原创 2014-06-07 14:23:50 · 4545 阅读 · 0 评论 -
OVS中对于用户层和datapath层的多个通道利用epoll进行控制
这里先暂时记录下代码流程,有待完善。static intconstruct(struct ofproto *ofproto_){ struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); const char *name = ofproto->up.name; int max_ports;原创 2014-08-18 20:56:39 · 1875 阅读 · 0 评论 -
OVS datapath模块分析:packet处理流程
这来主要看看ovs从网络接口收到packet后的一系列操作。 在初始化vport子系统的时候(ovs_vport_init)会struct netdev_vport { struct rcu_head rcu; struct net_device *dev;};const struct vport_ops ovs_netdev_vport_o原创 2014-02-24 20:43:54 · 6039 阅读 · 3 评论 -
OpenvSwitch中端口的抽象层次结构
OpenvSwitch中对端口的抽象层次结构 struct vport抽象的是OVS中datapath层的每个端口,通过它将ovs中的各种数据结构与Port关联起来,而结构体netdev_vport 就是vport和底层真实网络设备结构net_device 的入口,关键数据结构如下:struct vport { struct rcu_he原创 2014-09-16 15:08:14 · 2727 阅读 · 0 评论 -
用户空间发送flow,packet操作告知内核处理过程
用户空间从flow_miss_ops分门别类构造nla告知内核中相应的genl family。接下来分别调用对应的处理函数对流表进行添加删除操作,同时发送通知消息。内核层响应用户空间下发来的流表以及packet操作。原创 2014-03-10 20:32:07 · 3602 阅读 · 1 评论 -
用户空间具体是如何处理dpif_upcall ?(1)构造flow_miss批量处理
通过前面的分析,现在用户空间拿到了自内核传上来的关于未能在内核得到匹配的packet的netlink message的信息,接下来批量处理这些upcalls。流程图如下: 这个模块可以分成三个阶段:1)由dpif_upcall得到flow_miss 集合,构造填充相应的字段;2);3)。处理upcall的数据结构有:flow_miss是将具原创 2014-03-08 10:19:46 · 2110 阅读 · 0 评论 -
用户空间具体是如何处理dpif_upcall ?(2)构造datapath actions
阶段一完成后会将upcall中的相应信息构造早flow_miss中,接下来批量处理,查找facet,如果没有找到的话就要根据ofproto_dpif->rule和flow_miss->flow来创建facet,然后为其构建subfacet,继而subfacet_make_actions会由subfacet->rule->ofpacts相关信息构造odp_actions,然后根据具体的openflo原创 2014-03-09 12:56:24 · 4511 阅读 · 0 评论 -
OVS datapath模块分析:基本架构
20140220 datapath.h/c 代码分析 ovs内核模块的入口就是这个dp_init函数,所有的调用关系从此展开。datapath模块是最底层交换机机制的实现,接收网包-查表-执行action,若匹配失败则upcall给userspace的vswitchd处理。----------------------------------static int __init原创 2014-02-20 14:11:45 · 7601 阅读 · 0 评论 -
ovs-vsctl add-port br0 eth1 实际做了什么?
ovsctl这个应用程序主要职责是根据用户的命令和ovsdb沟通,将配置信息更新到数据库中,而vswitchd会在需要重新配置的时候和ovsdb打交道,而后和内核datapath通信执行真正的动作。这里规定了命令的语法格式(vsctl_command_syntax )以及所支持的所有命令,这里主要看add-port相关的。 struct vsctl_command_syntax {原创 2014-02-26 15:42:53 · 11784 阅读 · 1 评论 -
如何由skb构造sw_flow_key?
sw_flow_key相当于流表的索引,对其哈希后可以找到对应的flow entry,从而找到action list。构建key是由 ovs_flow_extract函数完成的,它从以太网帧中提携相关信息构造sw_flow_key ,参数中skb->data指向的是以太帧头ether header,in_port是收到skb的端口号,最后俩是值-结果参数。int ovs_flow_ex原创 2014-02-28 14:30:58 · 2715 阅读 · 1 评论 -
OVS vswitchd 模块分析(2)
3.bridge,ofproto模块是vswitchd的核心,启动的时候初始化网桥(OVSDB配置相关),接着一次运行RPC服务,网桥,网络设备相关的调用。----------vswitchd/ovs-vswitchd.c bridge_init(remote); free(remote); exiting = false; while (!exi原创 2014-02-23 19:40:33 · 4193 阅读 · 0 评论 -
packet在内核空间匹配失败后传到用户空间的处理逻辑是什么?
我们知道当packet到达交换机之后会提取出flow key->查询流表,如果匹配成功就执行对应的action,否则构造netlink attribute发送到用户空间对应的进程,这里vswitchd会调用handle_upcalls(ofproto/ofproto-dpif.c)来处理。主要流程图是:结构体 dpif_upcall 表征的是从datapath传到use原创 2014-03-04 18:12:49 · 2543 阅读 · 0 评论 -
用户空间具体是如何处理dpif_upcall ?(3)执行flow_miss_op->dpif_op,与内核沟通
阶段三:调用datapath interface具体实现类(这里是dpif_linux_class)的operate方法进行批量处理,后面如果有剩余项的话再分别调用/put/del/execute。将对应的参数通过nla发送到内核(内核来真正的执行操作)然后接收回应来更新统计信息。流程图如下:-------------lib/dpif.cvoid dpif原创 2014-03-09 15:00:07 · 7430 阅读 · 0 评论 -
OVS 响应 OFPT_SET_CONFIG 过程分析
ovs 对于 OFPT_SET_CONFIG消息的处理过程非常简单,其实就是通过TCP协议(或其它)交换了几个整型值,而且交换机不需要对此消息进行回复;只需要解析出消息体(struct ofp_switch_config)然后设置max miss len 即可。通过分析Floodlight发送它的过程 和 OVS 处理它的过程,我们可以对openflow协议有更好的理解。下面是代码流程:原创 2014-07-16 10:46:06 · 2456 阅读 · 1 评论 -
OVS流表查询过程分析
OVS中流表操作的理解关键在于这里哈希表的实现,引入的 flex_array方便了内存的管理,通过 hash&(桶数-1)可以随机的将一个元素定位到某一个桶中。 接下来是代码细节。一. 核心数据结构//流表struct flow_table{ struct flex_array * buckets; //具体的流表项 unsigned原创 2014-06-30 15:54:46 · 9449 阅读 · 0 评论 -
OVS响应OFPT_FLOW_MOD过程分析
整理处理流程图:1. 通过对of msg进行解码,可以得到具体的flow_mod以及对应的actions,(这里看增加流表的情况),接下来add_flow函数就会根据flow_mod制定的流来构建特定的规则分类器,增加到oftable中。具体过程是:选择一个合适的表;构建一个分类规则(关键代码如下);插入。这样此次通信的任务就完成了,当再有packet因为在datapa原创 2014-06-09 14:05:42 · 4148 阅读 · 2 评论 -
对openvSwitch中不同类型端口的理解
同一主机上的OVS中可以创建多个网桥(即多个datapath实例),每个bridge可以通过patch ports互联,而netdev ports是OVS对底层物理端口的抽象封装,internal 类型的端口比较不好理解,可以看做每个OVS交换机有个可以用来处理数据报的本地端口,可以为这个网络设备配置 IP 地址(比如在把eth0加入某个bridge的时候,它的IP地址就失效了,可以把IP地址原创 2014-10-10 18:49:50 · 10894 阅读 · 5 评论