Skip to main content

打开通道

客户端提供一个打开配置,其中包含可选的传输名称、远端 edge、通道名称和回调函数。核心会复制该配置,并使用这些回调来报告通道状态、接收数据、发送完成、接收意图请求、信号变更和中止事件。 打开通道的步骤:
  1. 准备一个包含传输名称、远端 edge、通道名称和回调函数的配置。
  2. 使用该配置调用打开函数。
  3. 在发送数据之前等待已连接通知。
在收到已连接通知之前,将返回的句柄视为待定。无效配置会返回错误,无可用传输会返回错误,通道尚不能重新打开也会返回错误。

发送和接收数据

接收端应在发送端发送之前排队意图。发送端可以对连续缓冲区或向量式缓冲区(如 SKB 或 DSM 链)调用发送函数。 发送和接收数据的步骤:
  1. 接收端:以其可接收的最大报文大小排队接收意图。
  2. 发送端:以数据和大小调用发送函数。
  3. 接收端:接收数据并处理。
  4. 接收端:使用完缓冲区后发出完成信号。
  5. 发送端:收到缓冲区已被处理的通知。
如果没有合适的意图,发送端可以向对端请求一个意图。请求可能被拒绝,此时发送操作返回错误。

控制信号

客户端可以与对端交换一个 32 位的控制信号字段:
  • 设置本地信号值。
  • 读取缓存的本地值。
  • 读取缓存的远端值。
  • 在远端信号变化时接收通知。
当客户端需要时,高位可承载标准的 modem 控制含义,但该字段仍然是对传输可见的透传数据。

关闭通道

当不再需要交换数据时调用 close。本地 close 报告本地断开;对端发起的 close 报告远端断开。close 路径必须在销毁属于回调的资源之前排空或中止挂起的工作。

传输注册

传输向核心注册接口和配置。配置提供其名称、edge、支持的版本、最大通道 ID 数和最大意图 ID 数。传输在以下状态之间流转:
  • Down(初始状态)
  • Negotiating(版本协商进行中)
  • Opened(可供通道使用)
  • Failed(协商失败)
注销传输会将其恢复到 down 状态,重置协商状态和通道标识符,并移除其通道列表。

用户空间通道访问

用户空间驱动可以将已配置的 GLink 通道暴露为字符设备。文件操作与客户端 API 的映射如下:
  • Open → 打开通道
  • Write → 发送数据
  • Read → 接收数据并完成
  • Release → 关闭通道
  • ioctl → 排队接收意图
  • poll → 等待通道可用
  • mmap → 避免额外的内核/用户缓冲区拷贝
典型的用户空间流程是:打开设备、排队意图、写入报文、读取接收到的数据、关闭文件描述符。

报文调度和迁移

GLink 在活跃通道之间按轮询方式调度报文。为了保持公平性并减少其他通道的时延,传输可以对大报文进行分片。当某条 edge 上有多条可用的传输时,核心可以根据配置的优先级和客户端选择信息迁移或选择通道的传输。

子系统重启

子系统重启处理必须在重启完成之前清理通道状态并恢复缓冲区所有权。重启通知系统可以将应用处理器作为协调器:识别受影响的 edge、通过 GLink 发送通知、等待每个子系统清理,然后允许重启序列继续。