作者:张华  发表于:2015-07-01
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

( http://blog.csdn.net/quqi99)

将seg_id存储在ovs的metadata(不跨ovs桥)和markup标签里(跨ovs桥),然后使用seg_id与destination_ip判断是子网内的流量还是子网间的流量,其余的是南北流量。
1, 写metadata
cookie=0x0, duration=153.339s, table=0, n_packets=27, n_bytes=2462, priority=1000,in_port=11 actions=write_metadata:0x1f42/0xffff,goto_table:40
2, 将tunnel_id存储到markup标签里
cookie=0x0, duration=2211.658s, table=60, n_packets=0, n_bytes=0, priority=1 actions=move:NXM_NX_TUN_ID[0..31]->NXM_NX_PKT_MARK[],output:6
3, 东西向流量,例如两个子网10.1.0.0(seg_id=0x1f42)与10.2.0.0(seg_id=0x1f43), 目前这些流在每个计算节点都添加了。今后,可以优化,只添加计算节点有的子网的流。例如如果VM2 (10.2.0.3) ping VM1 (10.1.0.3), 第一个包会送到CONTROLLER:65535, 控制器会检查路由连通性(两个虚机是否在一个route上),然后配置流规则让通过,这样第一个包会稍微有点延迟。
cookie=0x0, duration=3063.423s, table=52, n_packets=0, n_bytes=0, priority=20,ip,metadata=0x1f43,nw_dst=10.1.0.0/24 actions=CONTROLLER:65535
cookie=0x0, duration=3063.421s, table=52, n_packets=0, n_bytes=0, priority=30,ip,metadata=0x1f42,nw_dst=10.1.0.0/24 actions=NORMAL
cookie=0x0, duration=3063.423s, table=52, n_packets=0, n_bytes=0, priority=20,ip,metadata=0x1f42,nw_dst=10.2.0.0/24 actions=CONTROLLER:65535
cookie=0x0, duration=3063.423s, table=52, n_packets=0, n_bytes=0, priority=30,ip,metadata=0x1f43,nw_dst=10.2.0.0/24 actions=NORMAL
4, 南北向流量,除了东西向流量剩下默认的都走南北向,10.1.0.3访问10.2.0.3,但当10.2.0.3向10.1.0.3返回数据时,下面流规则告诉它从该虚机在br-int上的那个qvo端口进入。
cookie=0x1008000040051, duration=5.708s, table=52, n_packets=1, n_bytes=98, idle_timeout=300, priority=100,ip,metadata=0x1f42,in_port=11,dl_src=fa:16:3e:00:17:e6,dl_dst=fa:16:3e:c0:8d:8b,nw_src=10.1.0.3,nw_dst=10.2.0.3 actions=dec_ttl,set_field:fa:16:3e:c0:8d:8b->eth_src,set_field:fa:16:3e:cf:4b:ed->eth_dst,output:12
def install_l3_forwarding_flows(
            self,
            datapath,
            msg,
            in_port_data,
            pkt_eth,
            pkt_ipv4,
            gateway_port_data,
            dst_port_data,
            cookie_filter,
    ):
        """Install the l3 forwarding flows.

:param datapath: Datapath to install into
        :param msg: Message to act upon
        :param in_port_data: The port that the message arrived in
        :type in_port_data: PortData
        :param pkt_eth: The ethernet part of the packet
        :param pkt_ipv4: The ipv4 part of the packet
        :param gateway_port_data: The gateway port through which the packet
                                 would have been routed
        :type gateway_port_data: PortData
        :param dst_port_data: The destination port.
        :type dst_port_data: PortData
        :param cookie_filter: The cookie to attach to all flows
        :type cookie_filter: CookieFilter
        """
        dst_port_dp_id = dst_port_data.local_datapath_id
        dst_seg_id = dst_port_data.segmentation_id
        in_port = in_port_data.local_port_number
        dst_port = dst_port_data.local_port_number
        src_seg_id = in_port_data.segmentation_id
        cookie = cookie_filter.to_cookie()

if dst_port_dp_id == datapath.id:
            # The dst VM and the source VM are on the same compute Node
            # Send output flow directly to port, use the same datapath

            actions = self.add_flow_subnet_traffic(
                datapath,
                self.L3_VROUTER_TABLE,
                MEDIUM_PRIORITY_FLOW,
                in_port,
                src_seg_id,
                pkt_eth.src,
                pkt_eth.dst,
                pkt_ipv4.dst,
                pkt_ipv4.src,
                gateway_port_data.mac_address,
                dst_port_data.mac_address,
                dst_port,
                cookie=cookie,
            )
            # Install the reverse flow return traffic
            self.add_flow_subnet_traffic(
                datapath,
                self.L3_VROUTER_TABLE,
                MEDIUM_PRIORITY_FLOW,
                dst_port,
                dst_seg_id,
                dst_port_data.mac_address,
                gateway_port_data.mac_address,
                pkt_ipv4.src,
                pkt_ipv4.dst,
                pkt_eth.dst,
                in_port_data.mac_address,
                in_port,
                cookie=cookie,
            )
            self.handle_packet_out_l3(datapath, msg, dst_port, actions)
        else:
            # The dst VM and the source VM are NOT on the same compute node
            # Send output to br-tun patch port and install reverse flow on the
            # dst compute node

            remote_switch = self.dp_list.get(dst_port_dp_id)
            local_switch = self.dp_list.get(datapath.id)
            actions = self.add_flow_subnet_traffic(
                datapath,
                self.L3_VROUTER_TABLE,
                MEDIUM_PRIORITY_FLOW,
                in_port,
                src_seg_id,
                pkt_eth.src,
                pkt_eth.dst,
                pkt_ipv4.dst,
                pkt_ipv4.src,
                gateway_port_data.mac_address,
                dst_port_data.mac_address,
                local_switch.patch_port_num,
                dst_seg_id=dst_seg_id,
                cookie=cookie,
            )

# Remote reverse flow install
            self.add_flow_subnet_traffic(
                remote_switch.datapath,
                self.L3_VROUTER_TABLE,
                MEDIUM_PRIORITY_FLOW,
                dst_port,
                dst_seg_id,
                dst_port_data.mac_address,
                gateway_port_data.mac_address,
                pkt_ipv4.src,
                pkt_ipv4.dst,
                pkt_eth.dst,
                in_port_data.mac_address,
                remote_switch.patch_port_num,
                dst_seg_id=src_seg_id,
                cookie=cookie,
            )

self.handle_packet_out_l3(remote_switch.datapath,
                    msg, dst_port, actions)

def handle_packet_out_l3(self, datapath, msg, in_port, actions):
        data = None

parser = datapath.ofproto_parser
        ofproto = datapath.ofproto
        if msg.buffer_id == ofproto.OFP_NO_BUFFER:
            data = msg.data
        out = parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id,
                                  in_port=in_port, actions=actions, data=data)
        datapath.send_msg(out)

DragonFlow导读(by quqi99)相关推荐

  1. Vmware中的虚拟网络 ( by quqi99 )

    Vmware中的虚拟网络 ( by quqi99 ) 作者:张华  发表于:2013-03-27 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http: ...

  2. settimeout需要清除吗_【期刊导读】新证据:HBsAg水平极低的非活动性HBsAg携带者经聚乙二醇干扰素治疗24周, HBsAg清除率高达83.3%...

    编者按:目前指南并没有推荐非活动性HBsAg携带者(IHC)进行抗病毒治疗,但在长期随访中发现有IHC仍存在一定的复发和肝癌风险,而获得HBsAg清除会将慢乙肝患者肝癌风险降至最低.因此许多IHC会有 ...

  3. 《C陷阱与缺陷》一导读

    前 言 C陷阱与缺陷 对于经验丰富的行家而言,得心应手的工具在初学时的困难程度往往要超过那些容易上手的工具.刚刚接触飞机驾驶的学员,初航时总是谨小慎微,只敢沿着海岸线来回飞行,等他们稍有经验就会明白这 ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(1月17日-1月23日)

    上周微软Silverlight团队发布"微软发布Silverlight Native Extensions 1.0 - 扩展OOB应用功能",对于Silverlight开发人员而言 ...

  5. 关于计算机视觉的那些论文 | CCF推荐论文导读

    目 录 1 Quality Evaluation for Image Retargeting With Instance Semantics 2 PFAN++: Bi-Directional Imag ...

  6. 转:经典论文翻译导读之《Google File System》

    首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 -首页所有文章资讯Web架构基础技术书籍教程Java小组工具资源 经典论文翻译导读之<Google ...

  7. 分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日)

    分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日) 本周Silverlight学习资源更新: [Silverlight入门系列]ListboxIte ...

  8. 分享Silverlight/WPF/Windows Phone一周学习导读(10月30日-11月6日)

    分享Silverlight/WPF/Windows Phone一周学习导读(10月30日-11月6日) 本周Silverlight学习资源更新 Silverlight 定位 niejunhua [学习 ...

  9. 分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日)

    分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日) 本周Silverlight学习资源更新: Silverlight Tools 4安装时的错误提示 ...

  10. 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)

    休假一个月,没有更新Silverlight/WPF/Windows Phone学习导读.从本周开始继续分享每周最新的Silverlight/WPF/Windows Phone开发学习导读. 本周Sil ...

最新文章

  1. python函数都有啥_什么是python函数
  2. [译]通过使用Chrome的开发者工具来学习JavaScript
  3. 记一次网易前端实习面试
  4. Keil uVision5 下载程序 add flash programming algorithm选项缺少需要的下载算法的解决办法
  5. powertool 使用学习总结
  6. 自己设计java流程审核_关于工作流引擎取回审批的设计方案与实现过程
  7. 计算器的程序代码java_求用JAVA编写的计算器程序代码
  8. Java并发编程实战~Lock
  9. 自定义TBE算子入门,不妨从单算子开发开始
  10. html ios按钮,ios样式开关按钮jQuery插件
  11. android屏幕亮度测试,屏幕亮度与可视角度测试_手机Android频道-中关村在线
  12. 统计学习方法读书笔记2-极大似然估计与梯度下降法
  13. HDOJ 1465 不容易系列之一
  14. oracle ntile函数,Oracle分析函数ntile
  15. 2个抖音工程师搞出新工具,意外风靡字节内部,项目经理用上安静多了,程序员不骗程序员...
  16. iOS开发 动画(Animation)图片360度不停旋转
  17. 去掉数组中重复出现元素的算法
  18. ffmpeg运行在服务器上,如何在脱离流媒体服务器的时候使用ffmpeg 监测.m3u8直播视频流的状态?...
  19. 如何通俗地解释欧拉公式(e^πi+1=0)
  20. mybatis-config.xml配置文件中“http://mybatis.org/dtd/mybatis-3-config.dtd”报错

热门文章

  1. 智能中医诊疗系统php代码,智能新型中西医处方系统
  2. matlab三维作图知识点
  3. 淘宝店铺新手:实战提升流量销量经验
  4. 多智能体(MARL)强化学习与博弈论
  5. 投影仪融合+拼接处理系统制作原理
  6. Axure RP 8.0 软件安装教程
  7. ENVI裁剪遥感图像
  8. php 批量上传多个文件,小白浅析PHP中的单文件、多文件、批量上传
  9. 压缩文件RAR和ZIP的区别
  10. SDRAM控制器设计(8)SDRAM控制器仿真验证