声明:原创作品,严禁用于商业目的。 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨。

文章目录

  • 0.写在前篇
  • 1. 相关类结构
  • 2. IPV6地址查询流程
  • 3. IPV6地址解析
  • 4. 无状态地址配置
  • 5 有状态地址配置
  • 6. DHCPv6 模块分析
    • 6.1 DHCPv6 Client 类结构
    • 6.2 DHCPv6 Server
  • 7. IPv6 Firewall模块
    • 7.1 Firewall Enabled
    • 7.2 Firewall Disabled
  • 8. IPv6 Routing
    • 8.1 LanRoutingSnoop
    • 8.2 WanRoutingSnoop
    • 8.3 Outbound
    • 8.4 Inbound
  • 9. 参数配置
    • 9.1 CLI命令及用途:
    • 9.2 NonVolSettings参数存储
  • 10. 实例
    • 10.1 LanToWan实例
    • 10.2 WanToLan
    • 10.3 IPv6 Application

0.写在前篇

本系列文章来自于博通公司相关项目开发中的学习资料和开发总结,是企业或者公司项目开发过程中必备的网络相关知识,主要涉及到ecos和linux系统编译、内存管理、接口管理、HAL抽象层、以及IPV6、DHCP、TR069等网络相关协议。为维护版权和相关知识产权,请购买官方SDK和相关服务,此系列文章仅为个人学习使用,如有不妥之处和技术相关知识,请私信留言!
博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译
博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程
博通Broadcom SDK源码学习与开发3——Cable Modem Docsis3.0
博通Broadcom SDK源码学习与开发4——ECOS系统数据流
博通Broadcom SDK源码学习与开发5——ECOS系统层剖析
博通Broadcom SDK源码学习与开发6——支持Linux系统
博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析
博通Broadcom SDK源码学习与开发8——内存与参数管理
博通Broadcom SDK源码学习与开发9——Interface接口管理
博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址
博通Broadcom SDK源码学习与开发11——Cable Modem DHCP管理
博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议
本文介绍 Cable Modem 上IPv6相关的功能。

1. 相关类结构

(1) BcmNeighborCacheEntry:
CacheEntry存储邻节点的相关信息:neighbor’s on-link IP address, IsRouter/IsHost, ReachabilityState, related Timers.
发送邻节点请求,处理邻节点公告相关的逻辑;
(2) BcmNeighborCache: Cache 是由CacheEntry组成的集合,使用neighbor’s on-link unicast IP address作为索引;
(3) BcmNeighborDiscoveryThread: ND Thread负责处理路由请求/公告,邻节点请求/公告,重复地址检测等;处理关联Cache的状态维护;
(4) BcmNeighborDiscoveryACT: 保存目的地址,以及数据包的索引,以实现异步地址解析;
(5) BcmNeighborDiscoveryManager:每个IpStack具有一个 ND Thread,维护自己所在网段的Neighbor Cache;ND Manager 为系统提供一个统一的接口,以检查某一个IPv6的地址,是否可达;
(6) BcmNeighborDiscoverySnoop: 挂载在每一个eRouter HalIfs的 Inbound/Outbound Snoops中,检查并处理ICMPv6数据包
(7) NeighborDiscoveryThread: 侦听数据ICMPv6数据包接收事件;每隔1s钟刷新CacheEntry状态;
CacheEntry 可达性状态机如下图:

2. IPV6地址查询流程

查询IPv6地址,是否在cache中的过程如下:

3. IPV6地址解析

邻节点发现相关的报文有以下五种:
(1)路由器请求报文
(2)路由器公告报文
(3)邻节点请求报文
(4)邻节点公告报文
(5)重定向报文
下面以地址解析为例,描述ND模块各组件之间的协作关系,图示如下:

其中,GetNextHop()函数,如果传入的IPv6 Address 是邻节点,则返回他自己,如果不是,则返回下一条地址。

4. 无状态地址配置

无状态地址配置过程如下:
自动生成link-local address;
针对link-local addr进行重复地址检测(DAD);
发送路由请求报文;
接收路由公告报文,其中包含参数:
M位: 若该位为1,则必须使用有状态地址配置方式;
O位: 若该位为1,则使用有状态自动配置方式,获取除地址外的其他参数;
系统作为Router接受到LAN端Host的路由请求报文之后,代码处理流程如下:

5 有状态地址配置

从DHCPv6 Server的角度分析:
接收Client的Solicit数据包;
向Client发送Advertise数据包;
接收Client的Request数据包;
向Client发送Reply数据包;
交互过程中,各组件协作序列图如下:

6. DHCPv6 模块分析

HCPv6 模块的基本结构与DHCPv4的基本相同。DHCPv6 Client(获取IPv6地址)主要有以下几个部分组成:

DhcpV6ClientIf;
DhcpV6ClientNeighborDiscoveryACT;
DhcpV6ClientSnoop;
DhcpV6ClientThread;

DHCPv6 Server部分与Client类似,亦由ServerIf, ServerACT, ServerSnoop, ServerThread组成;

6.1 DHCPv6 Client 类结构

DhcpV6ClientIf:处理接收到DHCPv6数据包;发送DHCPv6 请求、Renew、释放等数据包;
DhcpV6ClientNeighborDiscoveryACT: 将重复地址检测的结果,通知ClientIf进行处理;
DhcpV6ClientSnoop:挂载于每个Ip Stack 的 Outbound Snoops中,因为Ip Stack的TransimitPacket函数,实际上是向eCos系统发送数据包,所以这里处理的是将要被系统接收的DHCPv6数据包;因为eCos系统中实际上并没有进程等待这个数据包,所以该数据包会在这个Snoop中被Consume掉;
侦听并检查接收到的DHCPv6数据包,向pfDhcpV6ClientThread->AnnounceDhcpV6Packet();
DhcpV6ClientThread:侦听kAnnounceDhcpV6Packet等事件,调用ClientIf处理接收到的数据包;侦听计时事件,并调用Timer进行相关处理;
DHCPv6初始化获取IPv6地址的过程如下图:

6.2 DHCPv6 Server

DHCPv6 Server模块的基本结构和流程,与DHCP Server 相近,在下一篇继续分析。

7. IPv6 Firewall模块

7.1 Firewall Enabled

Discard IPv6 packets with with Routing Type ZERO in extension headers;
检查是否存在相应的Session, 做一系列检查;
为FTP/TFTP 检查ALG,添加响应的Expectation;
Check Port Triggering, if a port triggering entry is found, then an expectation is automatically created;
如果Session已存在,则只需做硬件加速处理即可;
流程图:

7.2 Firewall Disabled

在Disabled的情况下,处理比较简单:
如果Session存在,则做硬件加速处理;
如果Session不存在,创建相应的Session;

8. IPv6 Routing

Routing的主要功能由以下三个Snoop实现,基本功能与IPv4是一致的,即是查找下一跳,修改目的MAC地址。
其中:
pfWanIpHalIf:为Ip Stack3;
pfLanIpHalIf: 为Ip Stack5;
pfDefaultHalIf:为WAN-MAN Interface;
fCmMacAddress:为Ip Stack1的MAC地址;
fWanManMacAddress:为Ip Stack3的MAC地址;

8.1 LanRoutingSnoop

挂载于lan-side halifs 的Outbound Snoops中;
处理发往Lan的IPv6数据包, 处理方式如下:
Discard packets originated from WanIpHalIf accessing the DHCP Server in LAN.
ICMPv6 数据包的处理如下:
Discarding Neighbor Solictitation from Wan;
Discarding DAD from WAN-MAN interface;
Pass other 邻节点请求和公告数据包;

8.2 WanRoutingSnoop

8.3 Outbound

因为数据包在Lan口的Inbound Snoops中,即做了路由(查询下一条路由地址),所以这里只做简单处理;
Drop Destination Unreachable message sent from Stack;
Discarding frame with link local source IP destined to WAN,but allow only MLD ICMPv6 through;
Decrement or send time exceeded msg.
Pass multicast packets;
如果pDestHalIf是 pfDefaultHalIf,则修改源Mac地址为pfWanIpHalIf的Mac地址;\

8.4 Inbound

这里执行向Lan端路由的相关功能;
ICMPv6数据包处理:
如果是邻节点请求数据包,且目的IP地址与fLanIpAddress的节点多播地址相同,则修改目的Mac地址为pfWanIpHalIf的Mac地址,并Pass数据包;
Passing NeighborAdvertisement packets;
Pass packets with site-local or loopback ip address;
pass traffic going to the CM stack;
Passing link local frame to IP stack;
Passing packet to WAN/LAN IP stack;
Decrement or send time exceeded msg.
Check for IPv6 multicast and pass those packets;
Destined to the LAN:
if packet’s dst-ip-addr in reachable cache, change the mac-da;
otherwise, resolve the dst-ip-addr for the dst-mac-addr;
if the mac-ds is fWanManMacAddress, and kRgWanBlocking feature is enabled, discard the packet;

9. 参数配置

9.1 CLI命令及用途:

如下表CLI命令和用途:

9.2 NonVolSettings参数存储

相关参数存储在NonVolSettings中;
Firewall Enable/Disable 参数存储在NonVolSettings中;
Pass MacDa Multicast的数据包;
Pass 源IP地址link-local的数据包;
Pass 含有扩展头的IP后续分片数据包;

10. 实例

假设条件:以普通TCP数据包为例,目的IP地址为WAN端Server的IPv6地址,目的Mac地址为IP Stack5的Mac地址;

10.1 LanToWan实例

Eth(n) 接收数据包,调用WanRoutingSnoop的 Inbound函数:
非ICMPv6数据包;
目的地址不在Lan prefix内;
非MLD数据包;
HopIdentifier没问题;
目的IPv6地址不在cache中;
获取下一条路由的地址,在cache中查询该地址对应的Mac地址;若无,则发送邻节点请求数据包,并返回kPacketConsumed;
否则,修改数据包目的Mac地址,返回kPassPacket;
WAN-MAN Interface 发送数据包,调用DefaultInterfaceIpv6RoutingSnoop 的 Outbound 函数:
非ICMPv6数据包,源IPv6地址非链路本地地址,未超出跳数限制;
非多播数据包;
修改源Mac地址为pfWanIpHalIf的Mac地址;

10.2 WanToLan

WAN-MAN Interface 接收数据包,调用DefaultInterfaceIpv6RoutingSnoop 的 Inbound函数:
非ICMPv6数据包;
dst-ip-addr 非site-local,非loopback;
dst-ip-addr 非link-local, 非fWanIpAddress,非fLanIpAddress;
未超出跳数限制;
非多播;
Destined to the LAN:
dst-ipv6-addr in cache, change the mac-da and pass it;
Eth(n)发送数据报,调用LanRoutingSnoop 的Outbound 函数:
非ICMPv6;
非DHCP数据包;
非多播数据包;
修改源Mac地址为pfLanIpHalIf的Mac地址;

10.3 IPv6 Application

可以使用AF_INET6创建 IPv6 的 socket, 来创建 IPv6 的应用程序;

博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址相关推荐

  1. 博通Broadcom SDK源码学习与开发3——Cable Modem Docsis3.0

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. Ch ...

  2. 博通Broadcom SDK源码学习与开发11——Cable Modem DHCP管理

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. DH ...

  3. 博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 博通 ...

  4. 博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 0.写在前 ...

  5. 博通Broadcom SDK源码学习与开发4——ECOS系统数据流

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. SD ...

  6. 博通Broadcom SDK源码学习与开发5——ECOS系统层剖析

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. Op ...

  7. 博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. TR ...

  8. 博通Broadcom SDK源码学习与开发8——内存与参数管理

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 内存 ...

  9. 博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. HA ...

最新文章

  1. 【MyBatis】myBatis动态传入表名进行查询
  2. 双网口相机平台搭建C++(大恒水星)
  3. WPF之复杂形状控件
  4. 中大计算机研究生英语免修条件,通知|关于接受2017级理科研究生 基础英语课程免修免考申请的通知...
  5. Acwing第 29 场周赛【完结】
  6. Eclipse中最常用的热键
  7. 连续三年蝉联第一,Flink 荣膺全球最活跃的 Apache 开源项目
  8. HALCON示例程序class_ndim_norm.hdev基于多通道图像的分类
  9. 驱动兼容_【重磅】上海数明发布国内首款兼容光耦隔离式单通道栅极驱动器系列产品SLM34x...
  10. 当程序发布特别慢的时候,如何高效使用Eclipse
  11. 链表分割——牛客剑指offer
  12. 印象笔记Mac版的快捷键有哪些?Evernote for Mac快捷键大全
  13. java 分布式 定时任务_Java中实现分布式定时任务的方法
  14. ubuntu服务器配置php,Ubuntu下配置PHP服务器
  15. 2013年12月新四六级翻译相关词汇汇总
  16. Nat Methods | 德州大学西南医学中心王涛/王莉等开发空间转录组数据降噪的新方法...
  17. uniapp中隐藏Android虚拟按键
  18. 手机视频监控解决方案(客户端)
  19. 康耐视In-Sight操作流程
  20. 词袋模型BoW和词集模型SoW比较

热门文章

  1. 院士解读:海洋研究为何需要超级计算机?
  2. Apprentice: Using Knowledge Distillation Techniques To Improve Low-Precision Network Accuracy
  3. python数组实现差分操作:后一项减去前一项,两项作差
  4. 【sbt】sbt package与sbt assembly
  5. 运行零币Zcash(ZEC)
  6. 谨慎使用多线程中的fork
  7. Git 的一些使用细枝末节
  8. Flutter Drawer详解
  9. scrapy爬虫框架简绍与安装使用
  10. 【PADS入门教程】