OpenDaylight OpenvSwitch ping实验

  在本机安装odl和ovs,本来想安装mininet,结果由于centos 6的版本安装真心麻烦到吐,各种软件依赖,依赖完还是失败T_T。自己用ovs+namespace模拟mininet主机。安装完的主机和交换机的拓扑: 首先启动odl hydron版本 执行脚本: #!/bin/bash #input $1 = controller ip, $2 = controller port if [[ $# -ne 2 ]] then echo "parameter illegal" exit 1 fi #del bridge allbr=`ovs-vsctl --timeout=1 list-br` for i in $allbr do ovs-vsctl del-br $i done ovs-vsctl add-br br…

Read more

ovs 2.3 流表匹配过程

  艾妈,终于跟进新版本流表匹配了。忧伤的故事是新版本内核匹配修改了好多,下放了部分wildcard matching到内核。源码看懂是没太大问题,逻辑还需要好好梳理一下。 1.datapatch内核流表匹配   datapath收到数据包的具体流程如下,艾妈,画得太丑,大家见谅: 1. neifreceive_skb是网卡收到包的函数,将会递送给netdev_frame_hook 2. netdev_frame_hook这个函数是vport初始化使注册的钩子函数,初始化vport流程(初始化vport => ovs_netdev_vport_ops => netdev_rx_handler_register)。它主要调用了两个函数: (1) vport = ovs_netdev_get_vport(skb->dev); //获取对应d…

Read more

ovs vlan gre vxlan实验

vlan实验   在宿主即创建了一个ovs bridge,连接至宿主机的出口网卡eht0,再创建了两个vport,然后用virtualbox创建两个虚拟机,分别桥接至两个vport。搭建方式可以参考我的上篇博客:使用VirtualBox创建虚拟机连接ovs bridge。网络拓扑如下:   在没设置vlan tag之前,两个主机是可以相互ping通的。然后设置vlan tag: ovs-vsctl set port vport1 tag=100 发现VM1无法ping通至VM2,同理在VM2设置相同的tag后,两个主机可以互相ping通,位于一个vlan下了。可以用ovs-vsctl list port指令查看port的vlan等配置。 参考: https://www.youtube.com/watch?v=rYW7kQRyUvA htt…

Read more

ovs 处理openflow协议

  ovs中的ofproto模块是用于接收并处理openflows消息。这个消息主要包括两种:primary和service。   primary是与openflow controller连接,用于维持连接并发送Asynchronous消息,比如packet-in。这类消息通常包括一些主动连接,比如tcp,ssl,unix。主要是一些指导流转发的流变更消息   service是用于处理ovs-ofctl消息,这类消息由对端负责连接,不主动发送Asynchronous消息。通常包括一些被动连接,比如ptcp,pssl,punix。主要是一些用于测试,监控,查看的消息,比如添加自定义流表,查看ovs流表信息等。   vswitchd在启动后,处理下发消息流程如下: 1.  vswitchd.c。…

Read more

ovs之hmap数据结构

  hamp是ovs提供的一种哈希表的结构。 0. 普通hash表   以前我们用的哈希表结构一般是如下情况:   左边为一维数组,每个数组元素对应一个映射之后的hash值,每个数组元素对应一条单向链表,该单向链表中所有元素的值域在哈希映射之后一致,且都为表头数组元素的值。链表中一般包含两个域,一个为值域,另一个为指针域。好的哈希映射函数应该使每条链上的长度差不多,而不是某条过长。装填因子的概念就是:散列表中的元素个数与散列表大小的比值。 1. hmap结构   而hmap的结构与之非常相似,其结构如下:   hmap为hash表总节点,其结构如下: /* A hash map. */ struct hmap { struct hmap_node **buckets; /* Mu…

Read more

linux使用nc命令传输文件

  目的主机的22端口不能使用,于是scp也不能用,想要传文件可以使用nc命令: 目的主机:nc -l 8765 > outFilename 源主机:nc 目的主机ip 目的主机nc端口 < inFilename 其中目的主机端口开大一点,别占用系统端口就好了。   nc还有很多很强大的功能,比如聊天,扫描端口等等,具体可以参考man。 参考 http://www.linuxso.com/command/nc.html…

Read more

使用VirtualBox创建虚拟机连接ovs bridge

  在宿主机上创建了一个ovs bridge,给它分配ip。本机的原来上网网卡是eth0,把它down了。并创建两个vport使得VirtualBox创建的虚拟机与vport相连。创建脚本如下: #!/bin/bash ovs-vsctl add-br mybr ovs-vsctl add-port mybr eth0 ifconfig eth0 0 dhclient mybr ifconfig mybr up ip tuntap add mod tap vport1 ip tuntap add mod tap vport2 ifconfig vport1 up ifconfig vport2 up ovs-vsctl add-port mybr vport1 ovs-vsctl add-port mybr vport2 &…

Read more

ovs中流表在内核空间与用户空间的匹配过程

  一直对ovs中facet和subfacet概念搞不清楚,今天仔细查了网上,关于这个的解释信息好少,以下这个是mail list里面的回答,感觉挺正确了: As I understand, there are two kinds of flow in OVS. One is in the user space, e.g. vswitchd, where flow key can include some wildcards to match, while the other lies in kernel space, e.g. openvswitch.ko, where the flow key can never have wildcard. If no wildcard in user space flow (a.k.a facet), the flow from…

Read more

ovs datapath笔记

  这几天在学习ovs的源码,现在来做个datapath的笔记。事先声明,本文的内容摘自博客,源码,视频以及自己的总结等,具体参考文献已经在文章末尾给出,主要参考为Baohua Yang的OpenvSwitch 代码分析。 0.模块介绍   datapath为ovs内核模块,负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。   一个datapath可以对应多个vport,一个vport类似物理交换机的端口概念。一个datapth关联一个flow table,一个flow table包含多个条目,每个条目包括两个内容:一个match/key和一个action,一个match/key可以从包中获取,对应一个action处理行为,最常见的action是在不同flow中进行转发。下图所示的是1…

Read more

shell中设置static变量

  我有一个代码,需要在并行机上跑,但是由于需要测试不同的参数,问题就很纠结。一开始我把这些参数写到文件,然后提交多次脚本,脚本中设置从文件中获取变量。结果发现提交时每个脚本总是提交最后一次的参数,因为提交时任务不确定,而写入文件的变量会发生覆盖,导致脚本开始跑的时候只有最后一次参数生效。   说的有点绕口,反正,如果需要在文件中设置static变量或者全局变量就用export到环境变量就可以了: a=1 $a=$(($a+1)) export a…

Read more

Linux网络内核数据结构之sk_buff

  sk_buff是Linux网络内核中最重要的数据结构之一。所有网络分层(MAC或L2分层上的另一种链路层协议,L3的IP,L4的TCP或UDP)都会使用这个结构来存储其报头,有关用户数据的信息,以及用来协调其工作的其他内部信息。当该结构从一个分层传到另一个分层时,其不同的字段会随之发生改变。在不同层数据传递时,通过附加报头的形式,减少了拷贝带来的开销。   内核把所有sk_buff结构链成一个双向链表,并添加了一个头元素,该头元素的结构是sk_buff_head: struct sk_buff_head {   struct sk_buff *next; 指向后继结点   struct sk_buff *prev; 指向前驱结点   __u32 qlen; 表中元素的数…

Read more

Netfilter/iptables框架总结

  今天,又把Netfilter回顾了一遍,发现经常容易遗忘,就写一篇博客总结一下。其实说起来总结,也都是参考网上大神的文献,文献已经在文章的末尾给出。 1. 概述   首先,说一下这两个是什么东西吧。netfilter是Linux内核中用于包过滤的框架,而iptables是在其之上设置的软件。它有五个钩子(Hook)去控制包的流动,总的来说就是我们可以在这5个钩子上设置过滤规则去控制包的流入/流出/转发等: INPUT:进入本机 OUTPUT:本机输出 FORWARD:转发 PREROUTING:输入控制 POSTROUTING:输出控制   其次,介绍一下这个框架到底能做些什么东西: 建立一个基于有状态和无状态的包过滤规则的因特网防火墙。 部署高度可用的有状态和无状态防火墙集群。 当公网ip不够用时,可以进行ip伪装,…

Read more

Linux内核同步方法

1. 原子操作   内核提供了两组原子操作接口--一组针对整数进行操作,另一组针对单独的位进行操作。 1.1 原子整数操作   针对整数的原子操作智能对atomic_t类型的数据进行处理。在这里之所以引入了一个特殊数据类型,而没有直接用C语言的int,主要处于以下原因: 让原子函数只接收atomic_t类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用。同时,也保证了该类型的数据不会被传递给任何非原子函数。 使用atomic_t类型确保编译器不对相应的值进行访问优化--这点使得原子操作最终接收到正确的内存地址,而不是别名。 在不同体系结构上实现原子操作的时候,使用atomic_t可以屏蔽其间的差异。   atomic_t是32位数,后来引入了64位的atomic64_t。下图是原子整数操作函数表: 1.2…

Read more

中断之后下半部和推后执行的工作

  在前面所说的中断处理程序,由于本身存在一些局限,所以它智能完成整个中断处理流程的上半部。这些局限包括: 中断处理程序以异步方式执行,并且它有可能会打断其他重要代码(甚至包括其他中断处理程序)的执行。因此,为了避免被打断的代码停止时间过长,中断处理程序应该执行得越快越好。 如果当前有一个中断处理程序正在执行,在最好的情况下,与该中断同级的其他中断会被屏蔽,在最坏的情况下,当前处理器上所有其他中断都会被屏蔽。因为禁止中断后硬件与OS无法通信,因此,中断处理程序执行得越快越好。 由于中断处理程序往往需要对硬件进行操作,所以它们通常有很高的时限要求。 中断处理程序不在进程上下文中运行,所以它们不能阻塞。 1.下半部   下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。在理想的情况下,最好是中断处理程序将所有工作都交给下半…

Read more

shadowsocks翻墙个人总结

  艾玛,这已经有好几个小伙伴问我翻墙的问题了,写个博客总结一下吧。我之前都是用goagent的,极其不稳定,一怒之下搞了shadowsocks,还是这个强大啊。 1. 下载shadowsocks客户端   下载符合自己电脑的shadowsocks客户端,下载地址:sourceforge下载地址。如果地址不好使了,就上github上下载,不过貌似shadowsocks的版本特别的多,gui那个版本就行:github shadowsocks-gui。 2. 配置客户端   这个配置的话,如果你有现成帐号或者别人帐号,就可以填写到这里面来,比如这个网址shadowsocks.cn,专门用来分享shadowsocks帐号,简直是送温暖。配置参数如下:   当然这个参数肯定是失效了的,这是n久之前截的图。参数中帐号密码…

Read more

中断与中断处理

1.中断   中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向OS反映此信号的到来,然后就由OS负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步--换句话说就是中断随时可以产生。因此,内核随时可能因为新到来的中断而被打断。   不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志。这些中断值通常被称为中断请求(IRQ)线。每个IRQ线都会被关联一个数值量。 2.中断处理程序   在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码。   中断处理程序需要负责通知硬件设备中断已经被…

Read more

Linux下安装docker

  其实一直都听过docker,但没用过,今天参考几篇文档把docker搞定了。果然起的速度比一般虚拟机快很多。   这个总结主要是整理工作,大部分内容都在文章最后的文档里已经有说明。   我的电脑是ubuntu14.04 安装的话用包源进行安装。 $ sudo apt-get install apt-transport-https $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/so…

Read more

C指针运算在高维数组中的应用

  今天,看到一个很好的例子,讲解指针和高维数组: 比如声明如下:int a[4][5]; 则:   &a: 表示数组的首地址   a: 类型为int (*)[5],即a为指向数组a第0个元素a[0]的指针,且a为常量,不可以进行赋值运算,a+i的类型也同为int (*)[5],指向a[i];&a+1等同于&(a+1)跳过全部20个元素,指向数组末尾的下一个。   *a或a[0]: 类型为int *,*a为指向数组a[0]首元素a[0][0]的指针;   *(a+1)或a[1]: 类型也为int *,因a的类型为int (*)[5],即a指向一个有5个元素的一维数组,故a+1将跳过5个元素。则(a+1)为指向数组a的第1个元素a…

Read more

linux内核中的数据结构

  linux建议开发者使用其内建的数据结构,而不要自作主张搞一套山寨的。本文讲解内核中常用的4种数据结构:链表,队列,映射,二叉树。 1.链表   链表包括单向链表(有一个后向指针),双向链表(有一个后向指针和一个前向指针),环形链表(首尾相连)。linux内核的标准链表采用环形双向链表形式实现。 1.1 链表数据结构   linux内核方式与众不同,它不是将数据结构塞入链表,而是将链表节点塞入数据结构。比如,一个普通的链表节点: struct Node {   int data;   struct Node *pre;;   struct Node *next; };   linux下的实现是把前后指针抽出来,形成单独数据结构…

Read more

系统调用

1.与内核通信   系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有三个: 它为用户空间提供了一种硬件的抽象接口。 系统调用保证了系统的稳定和安全。 如果应用程序可以随意访问硬件而内核又对此一无所知的话,几乎没办法实现多任务和虚拟内存。 举例:应用程序调用printf(),调用C库中的printf(),又调用C库中的write(),又调用内核中的write()系统调用。 2.系统调用   在linux中,每个系统调用都被赋予一个系统调用号。   linux系统调用比其他许多OS执行得要快。linux很短的上下文切换时间是一个重要的原因,进出内核都被优化得简洁高效。另外一个原因是系统调用处理程序和每个系统调用本身也都非常简洁。 3.系统调用处理程序   系统调用通知内核的机制是靠软…

Read more