首页 > 解决方案 > 在 TCP 堆栈中的哪个点将各种信息添加到 skbuff?

问题描述

我正在为自定义片上数据包交换机编写自定义设备驱动程序。

试图弄清楚 skbuff 数据结构的用法。主要是在堆栈中的哪个位置添加特定的信息?

这是我对堆栈的理解:

  1. 应用程序创建一个套接字
    • 这将创建一个套接字数据结构,并向其中添加 IP 地址
  2. 应用程序调用套接字上的函数来发送消息
    • 切换到内核
    • 内核创建 skbuff 数据结构,作为进入网络堆栈的准备
    • 内核向 skbuff 添加内容——添加指向用户空间开始的消息、长度和目标 IP 地址的指针(从套接字数据结构中获取)
    • 内核将 skbuff 传递给 TCP 内核模块
    • TCP 模块向 OS 请求每个 64KB 的缓冲区,将消息中的数据复制到缓冲区中,调整 skbuff 中的指针以指向 OS 提供的缓冲区
      • 缓冲区位于内核地址空间中
      • 对于每个缓冲区,都会创建一个新的 skbuff 并将其添加到列表中
    • TCP 将 skbuff 结构列表交给 Switch Driver
      • 此时交换机设备驱动程序有: skbuff 结构的链表,每个结构都有一个指向 TCP 头的指针、指向 TCP 尾的指针和指向保存数据包有效负载的 OS 缓冲区的指针

这一切都正确吗?主要是堆栈中创建 skbuff 的点,以及将每条信息添加到 skbuff 的点

感谢您的帮助,清理这将是巨大的。

标签: linux-kernellinux-device-driver

解决方案


推荐阅读