Rmnet 驱动程序

1. 简介

rmnet 驱动程序用于支持多路复用和聚合协议 (MAP)。 此协议被所有最近使用 Qualcomm Technologies, Inc. 调制解调器的芯片组使用。

此驱动程序可用于在 IP 模式下注册到任何物理网络设备。 物理传输包括 USB、HSIC、PCIe 和 IP 加速器。

多路复用允许创建逻辑网络设备(rmnet 设备)来处理多个私有数据网络 (PDN),如默认互联网、网络共享、多媒体消息服务 (MMS) 或 IP 多媒体子系统 (IMS)。 硬件发送带有 MAP 标头的包到 rmnet。 基于多路复用器 ID,rmnet 在移除 MAP 标头后路由到相应的 PDN。

需要聚合来实现高数据速率。 这涉及到硬件发送聚合的 MAP 帧束。 rmnet 驱动程序将解聚合这些 MAP 帧并将它们发送到相应的 PDN。

2. 包格式

  1. MAP 包 v1(数据/控制)

MAP 标头字段采用大端格式。

包格式

Bit             0             1           2-7      8-15           16-31
Function   Command / Data   Reserved     Pad   Multiplexer ID    Payload length

Bit            32-x
Function      Raw bytes

命令 (1)/数据 (0) 位值用于指示包是 MAP 命令还是数据包。 命令包用于传输级流量控制。 数据包是标准 IP 包。

保留位在发送时必须为零,接收时忽略。

填充是要附加到有效负载的字节数,以确保 4 字节对齐。

多路复用器 ID 用于指示数据必须发送到的 PDN。

有效负载长度包括填充长度,但不包括 MAP 标头长度。

  1. Map 包 v4(数据/控制)

MAP 标头字段采用大端格式。

包格式

Bit             0             1           2-7      8-15           16-31
Function   Command / Data   Reserved     Pad   Multiplexer ID    Payload length

Bit            32-(x-33)      (x-32)-x
Function      Raw bytes      Checksum offload header

命令 (1)/数据 (0) 位值用于指示包是 MAP 命令还是数据包。 命令包用于传输级流量控制。 数据包是标准 IP 包。

保留位在发送时必须为零,接收时忽略。

填充是要附加到有效负载的字节数,以确保 4 字节对齐。

多路复用器 ID 用于指示数据必须发送到的 PDN。

有效负载长度包括填充长度,但不包括 MAP 标头长度。

校验和卸载标头,具有关于硬件完成的校验和处理的信息。校验和卸载标头字段采用大端格式。

包格式

Bit             0-14        15              16-31
Function      Reserved   Valid     Checksum start offset

Bit                31-47                    48-64
Function      Checksum length           Checksum value

保留位在发送时必须为零,接收时忽略。

有效位指示部分校验和是否已计算并且有效。 如果有效,则设置为 1。 否则设置为 0。

填充是要附加到有效负载的字节数,以确保 4 字节对齐。

校验和起始偏移量,指示从 IP 标头开始的字节偏移量,调制解调器从该偏移量计算校验和。

校验和长度是从 CKSUM_START_OFFSET 开始的字节长度,计算校验和。

校验和值,指示计算出的校验和。

  1. MAP 包 v5(数据/控制)

MAP 标头字段采用大端格式。

包格式

Bit             0             1         2-7      8-15           16-31
Function   Command / Data  Next header  Pad   Multiplexer ID   Payload length

Bit            32-x
Function      Raw bytes

命令 (1)/数据 (0) 位值用于指示包是 MAP 命令还是数据包。 命令包用于传输级流量控制。 数据包是标准 IP 包。

下一个标头用于指示是否存在另一个标头,目前仅限于校验和标头。

填充是要附加到有效负载的字节数,以确保 4 字节对齐。

多路复用器 ID 用于指示数据必须发送到的 PDN。

有效负载长度包括填充长度,但不包括 MAP 标头长度。

  1. 校验和卸载标头 v5

校验和卸载标头字段采用大端格式。

位 0 - 6 7 8-15 16-31 功能 标头类型 下一个标头 校验和有效 保留

标头类型用于指示标头的类型,这通常设置为 CHECKSUM

标头类型 = ========================================== 0 保留 1 保留 2 校验和标头

校验和有效用于指示标头校验和是否有效。 值 1 表示在此包上计算了校验和并且有效,值 0 表示计算出的包校验和无效。

保留位在发送时必须为零,接收时忽略。

  1. MAP 包 v1/v5(命令特定)

    Bit             0             1         2-7      8 - 15           16 - 31
    Function   Command         Reserved     Pad   Multiplexer ID    Payload length
    Bit          32 - 39        40 - 45    46 - 47       48 - 63
    Function   Command name    Reserved   Command Type   Reserved
    Bit          64 - 95
    Function   Transaction ID
    Bit          96 - 127
    Function   Command data
    

命令 1 表示禁用流量,而 2 表示启用流量

命令类型

0

用于 MAP 命令请求

1

用于确认收到命令

2

用于不支持的命令

3

用于命令处理期间的错误

  1. 聚合

聚合是在单个线性 skb 中传递给 rmnet 的多个 MAP 包(可以是数据或命令)。 rmnet 将处理各个包,并根据需要确认 MAP 命令或将 IP 包传递到网络堆栈

MAP 标头|IP 包|可选填充|MAP 标头|IP 包|可选填充....

MAP 标头|IP 包|可选填充|MAP 标头|命令包|可选填充...

3. 用户空间配置

rmnet 用户空间配置通过使用 iproute2 的 netlink 完成 https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/

该驱动程序使用 rtnl_link_ops 进行通信。