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 功能 头部类型 下一个头部 校验和有效 保留

头部类型用于指示头部类型,通常设置为校验和。

头部类型 = ========================================== 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 将处理各个报文,并根据需要 ACK MAP 命令或将 IP 报文传递到网络堆栈

MAP 头部|IP 报文|可选填充|MAP 头部|IP 报文|可选填充....

MAP 头部|IP 报文|可选填充|MAP 头部|命令报文|可选填充...

3. 用户空间配置

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

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