Cable Modem RF Online
CM上线流程介绍
CM上电启动后,RF端和CMTS进行交互,来获取RF端(wan口)的IP地址以及CM的相关配置信息
下行通道扫描
1. 扫描下行通道,与CMTS建立同步。CM上电后,开始不断调整自己的下行接收频率来搜索下行信号,直到得到某个下行通道的SYNC帧,判断该下行通道是可用后设置该下行通道DS(Downstream Channel)为Primacy Downstream Channel
确定Service Group,同时测距
2. 确定CM的Service Group,同时进行测距
2.1 如果在DS收到MDD(Mac Domain Description)消息,开始DOCSIS3.0的初始化:通过读取MDD中的信息来确定MD-DS-SG(Mac Domain Downstream Service Group)和MD-US-SG(Mac Domain Upstream Service Group),然后通过发送单播的方式进行Range
2.2 如果没有收到MDD,开始DOCSIS2.0的初始化:通过UCD(Upstream Channel Description)来获取上行通道的信息,然后使用广播的方式进行Range
EAE
3. 如果在MDD中有开启EAE(Early Authentication and Encryption)功能,开始进行认证操作
完成IP层连接
4. 初始化IP过程。通过配置和MDD的消息确定CM的Ip模式(IPv4 Only, IPv6 Only, Alternativ Provision Mode, Dual-stack Provision Mode),然后通过DHCPv4/DHCPv6来获取IP
确定IP模式
- 如果没有设置docsis相关的mib,根据MDD来确定
- 在Primary DS收到MDD,根据MDD TLV 5.1的设置来确定
- 没有收到MDD, cm默认使用IPv4
- 如果设置docsis相关的mib值(docsIf3CmMdCfgEntry),则根据该值来决定
- ipv4
- ipv6
- honor mdd
同时docsIf3CmMdCfgIpProvModeResetOnChange这个mib用来决定在docsIf3CmMdCfgEntry改变时候是否自动进行调整(默认是false-2)
以下附上以上两个docsis mib的oid
docsIf3CmMdCfgEntry: 1.3.6.1.4.1.4491.2.1.20.1.31.2.2 docsIf3CmMdCfgIpProvModeResetOnChange: 1.3.6.1.4.1.4491.2.1.20.1.31.3.2
IPv4 Only模式
IPv6模式
APM
DPM
5. 建立ToD,同ToD server获取时间。同时同TFTP server获取到当前CM的配置文件
向CMTS开始注册
6. 开始Register,完成到CMTS的注册过程
BPI
7. 运行BPI,进行安全加密
CM Mac Management Message
CM和CMTS进行交互的信息在Mac层就已经处理了,和上层无关。要研究之间的交互,就必须了解相关的Mac层的数据结构
Mac Frame
Mac包的头结构:
Mac Frame结构各字段说明:
FC中各字段含义说明:
Mac Specific Header
CM在上线以及以后和CMTS相互沟通的时候,使用的Management数据包的FC/FC_TYPE的值就是11。
在CM MAC Header后,跟上相应的Management Header
Management交互的信息不同,使用的type,version也相应不一样:
代码实现
在系统启动后,CM就会开始扫描CMTS的下行的SYN包来同步,进而能够上线。
这个过程中,会经历以下几个步骤:
1. 在BcmBfcSystem::Initialize中,建立BcmCmDocsisCtlThread线程。之后线程在等待事件中开始睡眠,直到有事件发生将他唤醒。这个线程在系统运行过程中负责处理和CMTS的交互信息
2. 在BcmBfcSystem::Start中,发送Start事件给BcmCmDocsisCtlThread线程,开始Scan动作
3. 对于CMTS发送的MacMgtMsg信息,由注册到DQM的DocsisCmHalControlThread线程来负责从DQM中接受,然后整理后复制一份数据发送给BcmCmDocsisCtlThread,同时唤醒后者进行处理
4. 对于其他控制信息,(比如console发送的跳频、锁频,以及其他等待过程发生的时间片到期等)都会发送相应的事件到BcmCmDocsisCtlThread线程中,由BcmCmDocsisCtlThread线程来负责调用不同函数进行处理
Note
Reference
上线过程中跟DHCP交互的动画演示: http://www.incognito.com/img/bcc/seq-docsis.html