1、配置环境

fp0接口上配置两个IP地址:

fp0       Link encap:Ethernet  HWaddr 00:0c:29:30:38:db

inet addr:192.168.56.33  Bcast:192.168.56.255  Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe30:38db/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:51791 errors:0 dropped:0 overruns:0 frame:0

TX packets:196 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:4412183 (4.4 MB)  TX bytes:38552 (38.5 KB)

fp0:0     Link encap:Ethernet  HWaddr 00:0c:29:30:38:db

inet addr:192.168.57.33  Bcast:192.168.57.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

2、测试现象

启动example/udpecho程序(udp回显,bind的port为2048)。测试现象如下:

1)pc上ping 192.168.56.33,可以ping通;pc上启动udp客户端,向目的ip 192.168.56.33发送udp报文,回显功能正常;

2)pc上ping 192.168.57.34,可以ping通;pc上启动udp客户端,向目的ip 192.168.57.33发送udp报文,回显功能不可用。

3、对测试现象的分析

pc上针对ip地址192.168.56.33发起的ping操作、发送udp报文,均是FP进行处理,这里不再分析。下文只分析针对192.168.57.33地址的操作。

3.1 pc上向ip 192.168.57.34发起的arp请求,是fp回应的,还是sp回应的?

[0] ODP to FP: 627.417
50:7b:9d:a1:ce:27 -> ff:ff:ff:ff:ff:ff
ARP 1 192.168.57.34 -> 192.168.57.33 [0] FP to ODP: 627.418
00:0c:29:30:38:db -> 50:7b:9d:a1:ce:27
ARP 2 192.168.57.33 -> 192.168.57.34
从packet.txt调试信息来看,是FP回应的。

代码确认:

ofp_eth_vlan_processing -> ofp_arp_processing:

当接收到ARP请求后,检查ARP请求的目的IP是否为本机的?如果是,则进行ARP回应。

再看ofp_ifnet_ip_find的具体实现,是检查接口的所有IP,只要有一个匹配,则认为是本机应该回应的。

结论:pc上向ip 192.168.57.34发起的arp请求,是fp回应的。

3.2 pc上ping 192.168.57.34,icmp响应是fp回应的?还是sp回应的?

[0] ODP to FP: 627.418
50:7b:9d:a1:ce:27 -> 00:0c:29:30:38:db
IP ICMP: echo 192.168.57.34 -> 192.168.57.33 id=256 seq=7424
[0] FP to ODP: 627.419
00:0c:29:30:38:db -> 50:7b:9d:a1:ce:27
IP ICMP: echo reply 192.168.57.33 -> 192.168.57.34 id=256 seq=7424
从packet.txt调试信息来看,是FP回应的。

代码确认:

ofp_eth_vlan_processing -> ofp_ipv4_processing:

这段代码的逻辑:判断报文的目的ip是不是接口上的第一个ip,如果是,则需要FP继续处理;如果不是接口上的第一个ip,则查找路由表,如果能查找到路由项,且路由项的flag为OFP_RTF_LOCAL,则需要FP继续处理。

telnet localhost 2345
> route
Destination Gateway Iface Flags
VRF: 0
192.168.56.0/24 0.0.0.0 fp0 gateway
192.168.56.33/32 0.0.0.0 fp0 local
192.168.57.0/24 0.0.0.0 fp0 gateway
192.168.57.33/32 0.0.0.0 fp0 local
通过查找快平面的路由表,发现对应的Local路由存在

结论:pc上ping 192.168.57.34,是FP回应的。

3.3 pc上启动udp客户端,向目的ip 192.168.57.33发送udp报文,此udp报文是进入fp处理,还是sp处理?

 [0] ODP to FP: 4198.938
50:7b:9d:a1:ce:27 -> 00:0c:29:30:38:db
IP UDP PKT len=1478 192.168.57.34:52512 -> 192.168.57.33:2048
[0] FP to SP: 4198.940
50:7b:9d:a1:ce:27 -> 00:0c:29:30:38:db
IP UDP PKT len=1478 192.168.57.34:52512 -> 192.168.57.33:2048
[0] SP to ODP: 4198.940
00:0c:29:30:38:db -> 50:7b:9d:a1:ce:27
IP ICMP: dest unreachable 192.168.57.33 -> 192.168.57.34
从packet.txt调试信息来看,udp报文由于FP平面不能处理,进入SP平面,但SP平面也不能处理(没有监听2048端口),所以SP回应ICMP端口不可达报文

代码确认:

ofp_eth_vlan_processing -> ofp_ipv4_processing:

与3.3的流程相同,查找路由后,发现需要本地处理。

ofp_ipv4_processing中调用ipv4_transport_classifier(功能类似于BSD中的协议开关表),进入udp处理,但发现处理不了,返回continue将此报文从FP转发到SP中。SP同样无法处理,回应icmp目的不可达报文。

疑问:example/udpecho程序为什么不能处理针对接口第二个IP的UDP报文?

通过查看代码,socket绑定ip地址时,ofp_port_get_ipv4_addr函数只取下标0对应的IP,即接口上的第一个ip。所以,example/udpecho程序不能处理针对接口第二个IP的UDP报文。

4、结论

OpenFastPath 3.0.0版本已经支持多IP。(说明:2018年1月份的版本是不支持的)

5、SP平面配置的接口ip如何同步到FP平面

通过netlink机制进行同步。

代码线索:start_netlink_nl_server –> route_recv  –> route_read

当接收到RTM_NEWADDR/RTM_DELADDR消息时,调用handle_ipv4v6_addr函数进行IP地址同步。

OpenFastPath(1):快平面接口是否支持多ip的更多相关文章

  1. 上网爱快?EasyRadius FOR 爱快V2接口测试版正式推出,欢迎广大爱迷们测试噢

    …… …… 有些人问:为什么上面要打省略号?那些因为此处省略无数字,但是我还是要和大伙们谈谈EasyRadius支持爱快的故事 早在2013年的时候,我们内部就有发布爱快接口,但是由于当时V1的爱快, ...

  2. 下一代USB接口将支持双向拔插,于明年亮相

    近日,USB接口标准制定组织表示新一代USB接口将于明年年中亮相,而其名称目前被暂定为了USB Type-C.该组织表示USB Type-C标准将允许制造商采用更纤薄的接口设计,在实用性大大提高的同时 ...

  3. 关于WinCE流接口驱动支持10以上的端口号(COM10)

    一般情况下,WinCE流驱动的索引为0~9.应用程序中,通过CreateFile(_T("XXXN:"),…)打开对应的驱动,N也为0~9.这样看来,似乎在WinCE下同名流驱动个 ...

  4. 开源:矿Android新闻client,快、小、支持离线阅读、操作简单、内容丰富,形式多样展示、的信息量、全功能 等待(离开码邮箱)

    分享:矿Android新闻client.快.小.支持离线阅读.操作简单.内容丰富,形式多样展示.的信息量.全功能 等待(离开码邮箱) 历时30天我为了开发这个新闻clientAPP,下面简称觅闻 ht ...

  5. Openfire开发广播服务接口,支持离线广播消息

    Openfire开发广播服务接口,支持离线广播消息 概要 最近公司要求做一个web端向所有移动端发送公告,所以考虑到即时性就用openfire做服务.不过为了减轻web端的工作量,我们开发一个简单的插 ...

  6. Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问

    Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问 1.使用场景: 需求1.家中服务器 ubuntu 主机,跑接口服务,需要对外暴漏, 需求2.同时需要在外网ssh远程 ​ 关键词: frp内网 ...

  7. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  8. mormot支持TCP/IP

    mormot支持TCP/IP http.sys本来就构建于TCP/IP之上,因此HTTP.SYS是支持TCP/IP连接的. 笔者为此特意写了一个测试DEMO.TCP/IP连接成功. 如果客户端过一段时 ...

  9. 迅为iMX6UL Cortex-A7架构单核ARM开发板接口介绍-支持定制

    支持商业级和工业级核心板 1. POWER 电源接口电源输入为 5V/2A+,给核心板提供 5V 电源,给底板供电.原理图部分如下图所示. 电源接口位置如下图所示. 2. SWITCH 电源开关轻触电 ...

随机推荐

  1. Spring-IOC bean 创建过程中的 ObjectFactory

    AbstractBeanFactory中doGetBean方法里有一段拿到RootBeanDefinition后,实例化该bean的方法 // Create bean instance. if (mb ...

  2. 有关linqtosql和EF的区别

    LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF对数据库架构和我们查询的类型实行了更好的解耦.使用EF,我们查询的对象不再 ...

  3. linq to sql 中增删改查

    首先我先说一下,如果真的要用linq做项目的话,也会是比较方便的.已经尝试了在三层架构中应用linq to sql 比较方便. //有三个不同的数据库表,所以写法不一样 public class Li ...

  4. leetcode 217. Contains Duplicate 287. Find the Duplicate Number 442. Find All Duplicates in an Array 448. Find All Numbers Disappeared in an Array

    后面3个题都是限制在1-n的,所有可以不先排序,可以利用巧方法做.最后两个题几乎一模一样. 217. Contains Duplicate class Solution { public: bool ...

  5. 爬虫工具——Selenium和PhantomJS

    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏 ...

  6. springboot项目打war包pom设置

    <build> <finalName>PayManager</finalName><!--打包后的名字PayManager.war--> <plu ...

  7. JS数组的赋值

    var test=[1,2,3,4,5,6,7];  var arr=test;  arr.splice(2,1);  alert(test);//1,2,4,5,6,7 JS数组实质上是对象.因此, ...

  8. Linux-2.6驱动程序分层分离概念

    下面以一个按键的实验作为驱动分离时间简单学习: #include <linux/module.h> #include <linux/version.h> #include &l ...

  9. Source Insight 创建工程(linux-2.6.22.6内核源码)

    1. 软件设置 安装完Source Insight,需要对其进行设置添加对“.S”汇编文件的支持: 2. 新建linux-2.6.22.6工程 1)选择工程存放的路径: 2)下载linux-2.6.2 ...

  10. 读取和修改app.config文件

    本处主要是指读取和修改appSettings节点: 读取: string port = ConfigurationManager.AppSettings["port"];  //p ...