非VXLAN的收发包调用栈
netdev_frame_hook()
     netdev_port_receive()
          ovs_vport_receive()
               ovs_dp_process_packet()
                    (在查表失败后,对于带gso标记的大包,会分片进行upcall)
                    ovs_dp_upcall()                                                        
                    ovs_execute_actions()
                         output: do_output()
                              (通常情况下OVS_CB(skb)->mru为0,直接发送)
                              ovs_vport_send()                                             
                              (在OVS_CB(skb)->mru不为0,(即在output之前还经历了ct,且ct流程进行了分片重组。)且小于出端口的mtu的情况下,进入分片流程)
                              ovs_fragment()                                               
                                   (执行分片)
                                   ip_do_fragment(net, skb->sk, skb, ovs_vport_output);    
                                        (发包,这里代码写的比较绕)
                                        ovs_vport_output()                                 
                                             ovs_vport_send()
                         ct    : ovs_ct_execute()
                              (在进行conntrack的commit或lookup之前,会对分片进行重组,并会设置OVS_CB(skb)->mru的值不为0,为分片中最大的分片的尺寸)
                              handle_fragments()                                           
                              ovs_ct_commit() / ovs_ct_lookup()
 
          ovs_vport_send()
               vport->ops->send(skb) == dev_queue_xmit(skb) == rpl_dev_queue_xmit(skb)
                    (检查包的gso标记,需要分片的情况下进行分片,然后再递归调用dev_queue_xmit()发送分片)
                    skb_gso_segment                                                        
                    
 
总结:
     非VXLAN组网,逻辑基本如下:
          1. 收到多个分片
               1.1. datapath查表失败
                    分片各自上送至用户态,走upcall流程
               1.2. datapath查表成功,或从upcall流程下来
                    开始执行actions
                         while(1)
                              ct               会对分片进行重组,重组后的大包的OVS_CB(skb)->mru会被设置成一个非0值
                                   ovs_vport_send()
                              output           如果没有经过ct,则分片直接被转发,如果经过了ct,则大包还要进行分片操作
                                   ovs_fragment() -> ip_do_fragment() -> ovs_vport_output() -> ovs_vport_send()
                    
          2. 收到带gso标记的大包
               2.1. datapath查表失败
                    先进行分片,然后把分片各自upcall
               2.2. datapath查表成功
                    开始执行actions
                         while(1)
                              ct               直接ct,没有额外操作
                              output           由于OVS_CB(skb)->mru为0,所以直接进入ovs_vport_send()
                                   ovs_vport_send()
                                        在这里检查包的gso标记,然后进行分片,再对各个分片递归调用dev_queue_xmit()发送分片
                                        vport->ops->send == dev_queue_xmit() == rpl_dev_queue_xmit()  
 
     VXLAN组网,逻辑基本如下:
          1:首先是Kernel收到udp报文,走以下流程解封装
               udp_rcv -> __udp4_lib_rcv -> udp_queue_rcv_skb -> encap_rcv -> vxlan_rcv
          2:最终调用 netdev_port_receive -> ovs_vport_receive -> ovs_dp_process_packet
         
          也就是说,VXLAN收包终结之后,不存在分片与重组,而在终结之前的ip报文是否需要重组,则是由kernel负责,不是ovs的责任
          接下来的处理流程都与非VXLAN组网一致了,直至发包
          在VXLAN组网中,发包最终调到 ovs_vport_send() 函数时,vport->ops->send 指针实际调用的函数是 vxlan_xmit
 
          vxlan_xmit -> rpl_vxlan_xmit -> vxlan_xmit_one -> udp_tunnel_xmit_skb -> iptunnel_xmit == rpl_iptunnel_xmit -> ip_local_out == rpl_ip_local_out
          
          在 rpl_ip_local_out 中,类似于 rpl_dev_queue_xmit(),会检查gso标记,如果有gso标记,会将这个ip报文分片然后各片各自发送
          
 

ovs + kernel datapath 的分片与重组流程的更多相关文章

  1. OVS + kernel datapath 的安装

    ***kernel datapath的OVS编译安装 下载源代码 $ git clone https://github.com/openvswitch/ovs.git 准备工具:生成configure ...

  2. OVS+DPDK Datapath 包分类技术

    本文主体内容译于[DPDK社区文档],但并没有逐字翻译,在原文的基础上进行了一些调整,增加了对TSS分类器的详细阐述. 1. 概览 本文描述了OVS+DPDK中的包分类器(datapath class ...

  3. 转自:Tsihang 三层网络设备对于IP报文的分片和重组处理原理

    三层网络设备对于IP报文的分片和重组处理原理 对于网络分片,我一年前就想整理出来,虽然说网络上的资料很多,但是真正掌握精髓的除非真正做过分片程序,不然很难将协议栈整体联系起来理解.这篇文章,包括设计分 ...

  4. openVswitch(OVS)源码分析之工作流程(哈希桶结构体的解释)

    这篇blog是专门解决前篇openVswitch(OVS)源码分析之工作流程(哈希桶结构体的疑惑)中提到的哈希桶结构flex_array结构体成员变量含义的问题. 引用下前篇blog中分析讨论得到的f ...

  5. DPDK IP分片及重组库(学习笔记)

    1 前置知识学习 1.1 MTU MTU是最大传输单元( Maximum Transmission Unit)的缩写,指一个接口无需分片所能发送的数据包的最大字节数.  MTU范围在46 ~ 1500 ...

  6. IP分片与重组详解

    大家对IP数据包头,应该不陌生吧 分片便是与图中圈出来的两个地址有关,本文也是将主要围绕他们展开. 那我们先来了解他们的概念. 标志一个三比特字段遵循与用于控制或识别片段.他们是(按顺序,从高分以低位 ...

  7. Open vSwitch FAQ (一)

    Basic Configuration Q: How do I configure a port as an access port? A: Add "tag=VLAN" to y ...

  8. OpenVSwitch 硬件加速浅谈

    https://zhuanlan.zhihu.com/p/57870521 本文首发SDNLAB. 现代的虚拟化技术使得开发和部署高级网络服务变得更加简单方便.基于虚拟化的网络服务,具有多样性,低成本 ...

  9. openvswith Frequently Asked Questions

    Open vSwitch <http://openvswitch.org> 参考地址:http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=ope ...

随机推荐

  1. 封装Web Uploader 上传插件、My97DatePicker、百度 编辑器 的使用 (ASP.NET MVC)

    Web Uploader: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优 ...

  2. lua metatable(元表)

    lua metatable (元表) 概述 普通 table 类型的表仅能够做一些单表操作, 无法进行一些特殊的以及两个表的操作, 比如 table1 + table2, print(table3) ...

  3. java复习(9)---数据库JDBC

    java写工程当然需要连接数据库.JDBC技术是连接数据库和应用程序的纽带,本节主要说明如何连接数据库. java中提供sql类. package re09; import java.sql.*; p ...

  4. iOS 播放GIf图, 动态效果

    一.如果你集成了SDWebImage , 有一个很简单的方法 //导入sdwebImage的某个头文件 #import "UIImage+GIF.h" _bubble1.backg ...

  5. CF #344 D. Messenger KMP/Z

    题目链接:http://codeforces.com/problemset/problem/631/D 给定两个压缩形式的字符串,如a3b5a4k7这样的形式 问A在B中出现次数. 分类讨论,如果A是 ...

  6. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  7. Angular2.js——多个组件

    目前我们的英雄列表和英雄详情位于同一个文件的同一个组件中,我们将来可能会受到新的需求,修改这个组件又不能影响另外一个.然而每一次更改都会给这两个组件带来风险和双倍的测试负担,没有任何好处.如果我们需要 ...

  8. 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题

    继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...

  9. [进程管理]Linux进程状态解析之T、Z、X

             Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态.          向进程发送一个SIGSTOP信号,它就会因响应该信号而进入 ...

  10. java线程(二)

    线程范围变量 我们知道线程在cpu上的使用权并不是长时间的,因为计算机的cpu只有一个,而在计算上运行的进程有很多,线程就更不用说了,所以cpu只能通过调度来上多个线程轮流占用cpu资源运行,且为了保 ...