6.8.6. Reception of BFD Control Packets (接收 BFD Control 报文)
当接收到 BFD Control 报文时,必须按照指定的顺序遵循以下过程。如果根据这些规则丢弃报文,则必须在该点停止对报文的处理。
版本号检查:
如果版本号不正确(1),则必须丢弃报文。
长度字段检查:
如果 Length 字段小于最小正确值(如果 A 位清除则为 24,如果 A 位设置则为 26),则必须丢弃报文。
如果 Length 字段大于封装协议的有效载荷,则必须丢弃报文。
Detect Mult 字段检查:
如果 Detect Mult 字段为零,则必须丢弃报文。
Multipoint 位检查:
如果 Multipoint (M) 位非零,则必须丢弃报文。
My Discriminator 字段检查:
如果 My Discriminator 字段为零,则必须丢弃报文。
Your Discriminator 字段处理:
如果 Your Discriminator 字段非零,则必须使用它来选择与此 BFD 报文关联的会话。如果未找到会话,则必须丢弃报文。
如果 Your Discriminator 字段为零且 State 字段不是 Down 或 AdminDown,则必须丢弃报文。
如果 Your Discriminator 字段为零,则必须基于其他字段的某种组合来选择会话,可能包括源地址信息、My Discriminator 字段以及接收报文的接口。确切的选择方法是特定于应用程序的,因此不在本规范的范围之内。如果未找到匹配的会话,则可以创建新会话,或者可以丢弃报文。此选择不在本规范的范围之内。
认证检查:
如果设置了 A 位且未使用认证(bfd.AuthType 为零),则必须丢弃报文。
如果清除了 A 位且正在使用认证(bfd.AuthType 非零),则必须丢弃报文。
如果设置了 A 位,则必须根据第 6.7 节的规则和正在使用的认证类型(bfd.AuthType)对报文进行认证。这可能会导致丢弃报文。
更新状态变量:
将 bfd.RemoteDiscr 设置为 My Discriminator 的值。
将 bfd.RemoteState 设置为 State (Sta) 字段的值。
将 bfd.RemoteDemandMode 设置为 Demand (D) 位的值。
将 bfd.RemoteMinRxInterval 设置为 Required Min RX Interval 的值。
Required Min Echo RX Interval 处理:
如果 Required Min Echo RX Interval 字段为零,则 Echo 报文的传输(如果有)必须停止。
Poll Sequence 处理:
如果本地系统正在传输 Poll Sequence 并且接收到的报文中的 Final (F) 位已设置,则必须终止 Poll Sequence。
更新传输间隔和检测时间:
按照第 6.8.2 节中的描述更新传输间隔。
按照第 6.8.4 节中的描述更新 Detection Time。
会话状态机处理:
如果 bfd.SessionState 为 AdminDown:
- 丢弃报文
如果接收到的状态为 AdminDown:
- 如果 bfd.SessionState 不是 Down:
- 将 bfd.LocalDiag 设置为 3 (Neighbor signaled session down - 邻居发出会话 down 信号)
- 将 bfd.SessionState 设置为 Down
否则:
-
如果 bfd.SessionState 为 Down:
- 如果接收到的 State 为 Down:
- 将 bfd.SessionState 设置为 Init
- 否则,如果接收到的 State 为 Init:
- 将 bfd.SessionState 设置为 Up
- 如果接收到的 State 为 Down:
-
否则,如果 bfd.SessionState 为 Init:
- 如果接收到的 State 为 Init 或 Up:
- 将 bfd.SessionState 设置为 Up
- 如果接收到的 State 为 Init 或 Up:
-
否则(bfd.SessionState 为 Up):
- 如果接收到的 State 为 Down:
- 将 bfd.LocalDiag 设置为 3 (Neighbor signaled session down - 邻居发出会话 down 信号)
- 将 bfd.SessionState 设置为 Down
- 如果接收到的 State 为 Down:
Demand 模式激活检查:
检查 Demand 模式是否应该激活(参见第 6.6 节)。
如果 bfd.RemoteDemandMode 为 1、bfd.SessionState 为 Up 并且 bfd.RemoteSessionState 为 Up,则 Demand 模式在远程系统上激活,本地系统必须停止 BFD Control 报文的周期性传输(参见第 6.8.7 节)。
如果 bfd.RemoteDemandMode 为 0,或 bfd.SessionState 不是 Up,或 bfd.RemoteSessionState 不是 Up,则 Demand 模式在远程系统上未激活,本地系统必须发送周期性 BFD Control 报文(参见第 6.8.7 节)。
Poll 位处理:
如果设置了 Poll (P) 位,则向远程系统发送一个清除了 Poll (P) 位并设置了 Final (F) 位的 BFD Control 报文(参见第 6.8.7 节)。
Detection Time 规则:
如果报文未被丢弃,则出于第 6.8.4 节中 Detection Time 过期规则的目的,该报文已被接收。