BFD

BFD 控制包解析器/序列化器

[RFC 5880] BFD 控制包格式

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Vers |  Diag   |Sta|P|F|C|A|D|M|  Detect Mult  |    Length     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       My Discriminator                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Your Discriminator                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Desired Min TX Interval                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Required Min RX Interval                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Required Min Echo RX Interval                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

以下类型的格式中,可选的认证部分可能存在

  1. 简单密码认证部分的格式

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Auth Type   |   Auth Len    |  Auth Key ID  |  Password...  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                              ...                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
  2. 带密钥 MD5 和精密的带密钥 MD5 认证部分的格式

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Auth Type   |   Auth Len    |  Auth Key ID  |   Reserved    |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        Sequence Number                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                      Auth Key/Digest...                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                              ...                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
  3. 带密钥 SHA1 和精密的带密钥 SHA1 认证部分的格式

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Auth Type   |   Auth Len    |  Auth Key ID  |   Reserved    |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        Sequence Number                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       Auth Key/Hash...                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                              ...                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
class os_ken.lib.packet.bfd.BFDAuth(auth_len=None)

BFD (RFC 5880) 认证部分的基类

一个实例至少具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

属性

描述

auth_type

正在使用的认证类型。

auth_len

认证部分的长度,以字节为单位,包括 auth_typeauth_len 字段。

classmethod parser_hdr(buf)

认证部分通用部分的解析器。

serialize_hdr()

认证部分通用部分的序列化函数。

class os_ken.lib.packet.bfd.KeyedMD5(auth_key_id, seq, auth_key=None, digest=None, auth_len=None)

BFD (RFC 5880) 带密钥 MD5 认证部分类

一个实例具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

属性

描述

auth_type

(固定) 正在使用的认证类型。

auth_key_id

正在使用的认证密钥 ID。

seq

此数据包的序列号。此值会偶尔递增。

auth_key

此数据包的共享 MD5 密钥。

digest

(可选) 数据包的 16 字节 MD5 摘要。

auth_len

(固定) 认证部分的长度为 24 字节。

authenticate(prev, auth_keys=None)

认证此数据包的 MD5 摘要。

只有在定义了 self.digest 时才能调用此方法。

返回一个布尔值,指示相应的 Auth Key 是否可以认证摘要。

prevbfd 实例,用于此认证部分所属的 BFD 控制报头。必须分配它,因为 MD5 摘要必须计算整个 BFD 控制包。

auth_keys 是认证密钥链的字典,其中键是 Auth Key ID 的整数,值是 Auth Key 的字符串。

serialize(payload, prev)

编码一个带密钥 MD5 认证部分。

只有在编码 BFD 控制包时才使用此方法。

payload 是紧随此部分后的数据包的其余部分。

prevbfd 实例,用于此认证部分所属的 BFD 控制报头。必须分配它,因为 MD5 摘要必须计算整个 BFD 控制包。

class os_ken.lib.packet.bfd.KeyedSHA1(auth_key_id, seq, auth_key=None, auth_hash=None, auth_len=None)

BFD (RFC 5880) 带密钥 SHA1 认证部分类

一个实例具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

属性

描述

auth_type

(固定) 正在使用的认证类型。

auth_key_id

正在使用的认证密钥 ID。

seq

此数据包的序列号。此值会偶尔递增。

auth_key

此数据包的共享 SHA1 密钥。

auth_hash

(可选) 数据包的 20 字节 SHA1 散列。

auth_len

(固定) 认证部分的长度为 28 字节。

authenticate(prev, auth_keys=None)

认证此数据包的 SHA1 散列。

只有在定义了 self.auth_hash 时才能调用此方法。

返回一个布尔值,指示相应的 Auth Key 是否可以认证散列。

prevbfd 实例,用于此认证部分所属的 BFD 控制报头。必须分配它,因为 SHA1 散列必须计算整个 BFD 控制包。

auth_keys 是认证密钥链的字典,其中键是 Auth Key ID 的整数,值是 Auth Key 的字符串。

serialize(payload, prev)

编码一个带密钥 SHA1 认证部分。

只有在编码 BFD 控制包时才使用此方法。

payload 是紧随此部分后的数据包的其余部分。

prevbfd 实例,用于此认证部分所属的 BFD 控制报头。必须分配它,因为 SHA1 散列必须计算整个 BFD 控制包。

class os_ken.lib.packet.bfd.MeticulousKeyedMD5(auth_key_id, seq, auth_key=None, digest=None, auth_len=None)

BFD (RFC 5880) 精密的带密钥 MD5 认证部分类

此类的所有方法都从 KeyedMD5 继承。

一个实例具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

属性

描述

auth_type

(固定) 正在使用的认证类型。

auth_key_id

正在使用的认证密钥 ID。

seq

此数据包的序列号。此值会为会话中传输的每个连续数据包递增。

auth_key

此数据包的共享 MD5 密钥。

digest

(可选) 数据包的 16 字节 MD5 摘要。

auth_len

(固定) 认证部分的长度为 24 字节。

class os_ken.lib.packet.bfd.MeticulousKeyedSHA1(auth_key_id, seq, auth_key=None, auth_hash=None, auth_len=None)

BFD (RFC 5880) 精密的带密钥 SHA1 认证部分类

此类的所有方法都从 KeyedSHA1 继承。

一个实例具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

属性

描述

auth_type

(固定) 正在使用的认证类型。

auth_key_id

正在使用的认证密钥 ID。

seq

此数据包的序列号。此值会为会话中传输的每个连续数据包递增。

auth_key

此数据包的共享 SHA1 密钥。

auth_hash

(可选) 数据包的 20 字节 SHA1 散列。

auth_len

(固定) 认证部分的长度为 28 字节。

class os_ken.lib.packet.bfd.SimplePassword(auth_key_id, password, auth_len=None)

BFD (RFC 5880) 简单密码认证部分类

一个实例具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

属性

描述

auth_type

(固定) 正在使用的认证类型。

auth_key_id

正在使用的认证密钥 ID。

password

在此会话中使用的简单密码。密码是一个二进制字符串,长度必须在 1 到 16 字节之间。

auth_len

认证部分的长度,以字节为单位,包括 auth_typeauth_len 字段。

authenticate(prev=None, auth_keys=None)

认证此数据包的密码。

只有在定义了 self.password 时才能调用此方法。

返回一个布尔值,指示是否可以认证密码。

prevbfd 实例,用于 BFD 控制报头。对于认证简单密码,它不是必需的。

auth_keys 是认证密钥链的字典,其中键是 Auth Key ID 的整数,值是 Password 的字符串。

serialize(payload, prev)

编码一个简单密码认证部分。

payload 是紧随此部分后的数据包的其余部分。

prevbfd 实例,用于 BFD 控制报头。仅编码简单密码部分时,它不是必需的。

class os_ken.lib.packet.bfd.bfd(ver=1, diag=0, state=0, flags=0, detect_mult=0, my_discr=0, your_discr=0, desired_min_tx_interval=0, required_min_rx_interval=0, required_min_echo_rx_interval=0, auth_cls=None, length=None)

BFD (RFC 5880) 控制包编码器/解码器类。

序列化的数据包看起来像以下部分中描述的那样。

  • RFC 5880 通用 BFD 控制包格式

一个实例至少具有以下属性。其中大部分与线上的对应项相同,但采用主机字节序。

__init__ 接受以下顺序的相应参数。

属性

描述

ver

协议的版本号。此类实现协议版本 1。

diag

指定本地系统上次更改会话状态的原因的诊断代码。

state

传输系统看到的当前 BFD 会话状态。

flags

以下标志的位图:BFD_FLAG_POLLBFD_FLAG_FINALBFD_FLAG_CTRL_PLANE_INDEPBFD_FLAG_AUTH_PRESENTBFD_FLAG_DEMANDBFD_FLAG_MULTIPOINT

detect_mult

检测时间乘数。

my_discr

我的鉴别器。

your_discr

你的鉴别器。

desired_min_tx_interval

期望的最小 TX 间隔。(以微秒为单位)

required_min_rx_interval

所需的最小 RX 间隔。(以微秒为单位)

required_min_echo_rx_interval

所需的最小 Echo RX 间隔。(以微秒为单位)

auth_cls

(可选) 认证部分实例。仅当标志中设置了认证存在 (A) 位时才定义。分配以下类的一个实例:SimplePasswordKeyedMD5MeticulousKeyedMD5KeyedSHA1MeticulousKeyedSHA1

长度

(可选) BFD 控制包的长度,以字节为单位。

authenticate(*args, **kwargs)

认证此数据包。

返回一个布尔值,指示数据包是否可以被认证。

如果此数据包的标志中未设置 Authentication Present (A),则返回 False

如果此数据包的认证部分不存在,则返回 False

有关此方法参数的描述,请参考认证部分类的认证方法。

pack()

编码一个不带认证部分的 BFD 控制数据包。

classmethod parser(buf)

解码协议头。

此方法仅在解码数据包时使用。

在字节数组 buf 的偏移量 0 处解码协议头。返回以下三个对象:

  • 一个描述解码后的头对象。

  • 一个适当于数据包其余部分的 packet_base.PacketBase 子类。如果数据包的其余部分应被视为原始有效负载,则为 None。

  • 数据包的其余部分。

serialize(payload, prev)

编码协议头。

此方法仅在编码数据包时使用。

编码协议头。返回一个包含头的字节数组。

payload 是将立即跟随此头的其余数据包。

prev 是外部协议头的 packet_base.PacketBase 子类。如果当前头是外部头,则 prev 为 None。例如,对于 tcp.serialize,prev 是 ipv4 或 ipv6。