OVS2.5.0源码分析
文章平均质量分 76
one_clouder
这个作者很懒,什么都没留下…
展开
-
【OVS2.5.0源码分析】vlan&trunk实现原理分析(2)
梳理OVS交换和传统交换机的差异,从整体上看行为上略有差异。1、OVS交换机2、传统交换机原创 2016-08-15 23:39:28 · 1042 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(1)
OVS dp支持的action都在do_execute_actions函数中定义,支持的action包括:OVS_ACTION_ATTR_OUTPUT、OVS_ACTION_ATTR_USERSPACE、OVS_ACTION_ATTR_HASH、OVS_ACTION_ATTR_PUSH_MPLS、OVS_ACTION_ATTR_POP_MPLS、OVS_ACTION_ATTR_PUSH_VLAN、原创 2016-09-02 22:13:15 · 1810 阅读 · 1 评论 -
【OVS2.5.0源码分析】upcall处理线程分析(1)
upcall线程处理由datapath通过netlink机制上送的报文,其入口函数为udpif_upcall_handler,这一篇我们先分析该线程是如何收取upcall报文的。1、udpif_upcall_handler函数/* The upcall handler thread tries to read a batch of UPCALL_MAX_BATCH * upcalls f原创 2016-09-02 22:52:43 · 2039 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(2)
本篇分析OVS_ACTION_ATTR_HASH action,该action的处理函数为execute_hash函数1、execute_hash函数static void execute_hash(struct sk_buff *skb, struct sw_flow_key *key, const struct nlattr *attr){ struct ovs_actio原创 2016-09-04 00:33:34 · 1127 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(3)
本篇分析OVS_ACTION_ATTR_PUSH_VLAN action,该action的处理函数为push_vlan。1、push_vlan函数static int push_vlan(struct sk_buff *skb, struct sw_flow_key *key, const struct ovs_action_push_vlan *vlan){ if (s原创 2016-09-04 08:30:24 · 1219 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(4)
本篇分析OVS_ACTION_ATTR_POP_VLAN action的处理函数pop_vlan。1、pop_vlan函数static int pop_vlan(struct sk_buff *skb, struct sw_flow_key *key){ int err; err = skb_vlan_pop(skb); if (skb_vlan_tag_present(skb)原创 2016-09-04 09:20:49 · 978 阅读 · 0 评论 -
【OVS2.5.0源码分析】openflow连接实现分析(1)
openflow连接有两个用途: 1)与controller连接;2)提供给ovs-ofctl工具配置流表等。我们先看连接的初始化过程,配置入口是bridge_reconfigure函数。1、bridge_reconfigure函数 collect_in_band_managers(ovs_cfg, &managers, &n_managers); //收集配置的m原创 2016-08-25 22:36:03 · 2260 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(5)
今天分析OVS_ACTION_ATTR_SET action的处理函数execute_set_action函数。1、execute_set_action函数static int execute_set_action(struct sk_buff *skb, struct sw_flow_key *flow_key, const struct nlattr原创 2016-09-05 21:52:15 · 931 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(6)
今天分析OVS_ACTION_ATTR_RECIRC action的处理函数execute_recirc。1、execute_recirc函数static int execute_recirc(struct datapath *dp, struct sk_buff *skb, struct sw_flow_key *key, const struct nlattr *a原创 2016-09-05 22:45:14 · 1609 阅读 · 1 评论 -
【OVS2.5.0源码分析】datapath之action分析(7)
本篇分析OVS_ACTION_ATTR_SET_MASKED 和 OVS_ACTION_ATTR_SET_TO_MASKED action,处理函数为execute_masked_set_action函数。1、execute_masked_set_action函数static int execute_masked_set_action(struct sk_buff *skb,原创 2016-09-05 23:51:25 · 897 阅读 · 0 评论 -
【OVS2.5.0源码分析】vlan&trunk实现原理分析(1)
传统交换机的端口可以按照vlan可以划分为access、trunk和hybrid三类接口。 首先,我们先看OVS的VLAN实现原理,最后对比OVS与传统交换机的差异。OVS中,数据面的转发流表都是从用户态下发的,所以流表生成的入口是upcall_actions函数(该函数不是upcall的总入口,由于层次比较多,以该函数作为分析的入口是合适的)。1、xlate_actions函数原创 2016-08-14 23:10:37 · 3631 阅读 · 3 评论 -
【OVS2.5.0源码分析】sFlow实现分析(3)
本篇分析,sflow的消息处理,处理入口函数是在process_upcall函数。1、process_upcall函数 case SFLOW_UPCALL: if (upcall->sflow) { union user_action_cookie cookie; const struct nlattr *actions原创 2016-09-18 18:36:25 · 1581 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之action分析(8)
本篇分析OVS_ACTION_ATTR_SAMPLE action的处理函数sample。1、sample函数static int sample(struct datapath *dp, struct sk_buff *skb, struct sw_flow_key *key, const struct nlattr *attr, const struct nlattr *原创 2016-09-06 22:01:40 · 1003 阅读 · 0 评论 -
【OVS2.5.0源码分析】nlattr数据结构分析
从nlattr类型定义来看,是非常简单,但是OVS使用该数据结构来定义action,nlattr自身是不存储数据,而使用来定义数据格式的,OVS也会使用skb来存储真实数据。nlattr数据结构定义struct nlattr { uint16_t nla_len; //数据长度 uint16_t nla_type; //数据类型};使用nlattr构造的数据原创 2016-09-06 22:33:01 · 4270 阅读 · 0 评论 -
【OVS2.5.0源码分析】dpif向dp发送netlink消息分析
OVS用户态进程与内核模块是通过netlink进行通信的,本篇分析下用户态向内核态发送netlink消息的方法,发送消息入口有两个函数nl_transact和nl_transact_multiple,本篇以nl_transact_multiple为例进行分析。1、nl_transact_multiple函数voidnl_transact_multiple(int protocol,原创 2016-09-07 22:59:46 · 1618 阅读 · 0 评论 -
【OVS2.5.0源码分析】upcall处理线程分析(2)
上一篇介绍了netlink报文的接收过程,其中用到了sock对象、event对象等、channel对象,本篇分析这些对象是何时构建的。 构建入口是dpif_netlink_port_add函数。1、dpif_netlink_port_add函数static intdpif_netlink_port_add(struct dpif *dpif_, struct netdev *netdev原创 2016-09-08 21:48:42 · 1093 阅读 · 0 评论 -
【OVS2.5.0源码分析】upcall处理线程分析(3)
第一篇介绍了netlink消息的接收,接收到的消息是最原始的消息格式,本篇介绍如何把原始的消息,转化为upcall对象。1、parse_odp_packet函数static intparse_odp_packet(const struct dpif_netlink *dpif, struct ofpbuf *buf, struct dpif_upcall原创 2016-09-08 22:22:33 · 1192 阅读 · 0 评论 -
【OVS2.5.0源码分析】vxlan发包流程分析
发包处理函数最终会调用到ovs_vport_send函数,该函数最终会调用vport_ops的send函数。1、ovs_vport_send函数void ovs_vport_send(struct vport *vport, struct sk_buff *skb){ int mtu = vport->dev->mtu; if (unlikely(packet_length(skb原创 2016-09-21 22:27:27 · 6492 阅读 · 2 评论 -
【OVS2.5.0源码分析】ofpbuf数据结构分析
OVS中ofpbuf结构体应用较多,例如action保存等,其本质是支持数据自动伸缩的连续内存。1、数据结构定义struct ofpbuf { void *base; /* First byte of allocated space. */ void *data; /* First byte actually原创 2016-08-11 22:15:08 · 1069 阅读 · 0 评论 -
【OVS2.5.0源码分析】normal action精确流表生成和刷新过程分析
一、首包精确流表生成首包到达OVS交换机时,尚未建立基于目的mac的流表规则,需要upcall到用户态进行学习,此时生成的规则是把报文flood到其他端口。1、upcall_xlate函数 upcall->dump_seq = seq_read(udpif->dump_seq); upcall->reval_seq = seq_read(udpif->reval_seq)原创 2016-08-11 21:40:44 · 5866 阅读 · 0 评论 -
【OVS2.5.0源码分析】openflow连接实现分析(2)
上回调用到vconn_stream_open函数,没有进一步分析,今天继续往下看,确定controller连接的整个过程。9、stream_open_with_default_port函数/* Like stream_open(), but the port defaults to 'default_port' if no port * number is given. */ints原创 2016-08-28 07:34:34 · 1347 阅读 · 1 评论 -
【OVS2.5.0源码分析】openflow连接实现分析(3)
上两篇分析了controller连接建立的完整流程,本篇分析下接收openflow报文的过程,openflow报文的处理在后续文章中分析。 整个调用过程,可以根据上一篇的对象关系图得出,本篇只是把调用关系细化到函数。1、connmgr_run函数 if (mgr->in_band) { if (!in_band_run(mgr->in_band)) {原创 2016-08-28 08:07:22 · 1861 阅读 · 0 评论 -
【OVS2.5.0源码分析】mirror实现原理(1)
端口镜像是交换机的标准功能之一,针对某个端口的报文拷贝到除真实目的之外的另外一个目的地(output),这一篇我们先分析配置mirror之后,如何生成流表,在什么阶段生成流表。1、xlate_actions函数 mirror_ingress_packet(&ctx); //生成满足入端口的流表生成,即进入该端口的报文会被镜像到其他目的地。原创 2016-08-17 23:11:31 · 2086 阅读 · 0 评论 -
【OVS2.5.0源码分析】mirror实现原理(2)
OVS实现mirror功能时,限制了out端口的通信能力。1、限制mirror out端口通信总结xlate_normal_flood函数static voidxlate_normal_flood(struct xlate_ctx *ctx, struct xbundle *in_xbundle, uint16_t vlan){ str原创 2016-08-17 23:37:52 · 1866 阅读 · 0 评论 -
【OVS2.5.0源码分析】openflow连接实现分析(4)
前面几篇介绍controller的连接,这篇分析ofservice的创建过程,直接从bridge_configure_remotes函数开始分析。1、bridge_configure_remotes函数 n_controllers = bridge_get_controllers(br, &controllers); ocs = xmalloc((n_controlle原创 2016-08-28 10:39:35 · 1111 阅读 · 0 评论 -
【OVS2.5.0源码分析】openflow连接实现分析(5)
上一篇分析了ofservice创建过程,本篇将分析ofservice处理请求的过程,ofservice处理请求的过程也是在connmgr_run函数。1、connmgr_run函数voidconnmgr_run(struct connmgr *mgr, void (*handle_openflow)(struct ofconn *,原创 2016-08-28 15:21:41 · 1069 阅读 · 0 评论 -
【OVS2.5.0源码分析】openflow连接实现分析(6)
上两篇分析了ofservice的建立,请求处理的过程,本篇分析ovs-ofctl命令行是如何和 ofservice交互的。1、mian函数intmain(int argc, char *argv[]){ struct ovs_cmdl_context ctx = { .argc = 0, }; set_program_name(argv[0]); ser原创 2016-08-28 16:56:34 · 1401 阅读 · 0 评论 -
【OVS2.5.0源码分析】upcall处理线程分析(4)
前两篇分析了接收netlink消息和解析netlink消息生成upcall对象,本篇分析upcall的处理。 处理函数为process_upcall。1、process_upcall函数static intprocess_upcall(struct udpif *udpif, struct upcall *upcall, struct ofpbuf *odp原创 2016-09-09 21:46:20 · 1423 阅读 · 0 评论 -
【OVS2.5.0源码分析】sFlow实现分析(1)
sFlow实现可以分成4个部分:1)配置;2)流表生成(生成datapath的流表);3)datapath中的处理(已经分析);4)sFlow处理过程。本篇分析sFlow的配置过程。1、bridge_configure_sflow函数/* Set sFlow configuration on 'br'. */static voidbridge_configure_sflow(struc原创 2016-09-09 22:33:49 · 1906 阅读 · 0 评论 -
【OVS2.5.0源码分析】ovsd进程运行机制分析(1)
ovsd作为ovs的用户态管理主进程,负责处理ovs-vsctl命令接口、ovs-ofctl命令接口、与controller交互等等。 本篇分析它的整个处理机制。1、main函数 bridge_init(remote); free(remote); exiting = false; while (!exiting) { //while循环,直到退出原创 2016-08-30 22:03:37 · 2909 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之主流程分析
网络报文到达主机后,最终会到达协议栈的netif_receive_skb函数,该函数会通过设备对象的rx_handler函数把报文交给OVS处理。 而该rx_handler函数其实就是OVS 定义的netdev_frame_hook函数,本篇内容就是从netdev_frame_hook函数开始,分析报文在datapath中的整个主处理过程。1、netdev_frame_hook函数该函数为原创 2016-08-31 20:46:41 · 2846 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之netlink
ovs datapath是通过netlink与用户态进行通信的,实现dp、端口、流表、packet的操作。 netlink的注册是在datapath模块的初始化函数中实现的。1、dp_init函数static int __init dp_init(void){ int err; BUILD_BUG_ON(sizeof(struct ovs_skb_cb) > FIELD_SIZEO原创 2016-09-13 06:25:09 · 1080 阅读 · 0 评论 -
【OVS2.5.0源码分析】sFlow实现分析(2)
本篇分析,sFlow流表生成过程,sFlow流表是在xlate_actions函数中生成,然后通过netlink下发给datapath的。1、xlate_actions函数 /* Sampling is done only for packets really received by the bridge. */ unsigned int user_cooki原创 2016-09-13 06:49:35 · 1289 阅读 · 0 评论 -
【OVS2.5.0源码分析】bridge&bundle&port分析(1)
一、按照用途划分,openvswitch中桥、端口大致可以分成如下几类: 1、配置管理 主要对象包括:bridge、port、interface。 2、openflow 主要对象包括:ofproto、ofproto_dpif、ofbundle、ofport、ofport_dpif。 3、端口镜像 主要对象包括:mbridge、mbundle。原创 2016-08-10 20:39:13 · 2004 阅读 · 0 评论 -
【OVS2.5.0源码分析】enqueue action精确流表生成过程分析
1、xlate_actions函数 openflow流表匹配完成后,调用do_xlate_actions函数把openflow action转化为精确流表的action;2、do_xlate_actions函数 case OFPACT_ENQUEUE: memset(&wc->masks.skb_priority, 0xff,原创 2016-08-10 21:04:24 · 3060 阅读 · 5 评论 -
【OVS2.5.0源码分析】datapath之流表查询
流表查询是datapath报文处理过程中,最为关键的一个步骤,一个skb报文进入如何能够快速地进行匹配流表? 本篇分析ovs是如何查询流表的。1、ovs_flow_tbl_lookup_stats函数struct sw_flow *ovs_flow_tbl_lookup_stats(struct flow_table *tbl, const struct sw_flow_ke原创 2016-09-01 23:57:22 · 1511 阅读 · 0 评论 -
【OVS2.5.0源码分析】datapath之流表创建过程
上一篇分析了流表查找过程,支撑流表查询的相关信息是什么时候建立,是怎么建立的将在本篇分析。 datapath流表更新的入口函数都定义在dp_flow_genl_ops中,流表创建的入口函数是ovs_flow_cmd_new函数,通过该函数,我们可以一窥流表相关信息的建立。1、ovs_flow_cmd_new函数static int ovs_flow_cmd_new(struct sk_bu原创 2016-09-02 00:20:09 · 2080 阅读 · 0 评论 -
【OVS2.5.0源码分析】vxlan端口创建流程分析
vxlan端口是通过ovs-vsctl命令创建的,整个调用流程如下:bridge_reconfigure->bridge_add_ports->bridge_add_ports__->iface_create->iface_do_create->ofproto_port_add->port_add(ofproto_class)->dpif_port_add->dpif_netlink_port原创 2016-11-12 10:58:03 · 2698 阅读 · 1 评论