linux - 将 skb->data 复制到多个描述符

标签 linux linux-kernel driver linux-device-driver ethernet

我正在研究 8139too.c 驱动程序。对于传输,驱动程序调用 skb_copy_and_csum_dev() 将整个套接字缓冲区复制到一个描述符环中,该环的缓冲区足以容纳整个套接字缓冲区。 如果描述符环形缓冲区小于 skb->data,则 break break skb->data 并将 skb->data 复制到多个描述符中的正确方法是什么? (假设未使用分散/聚集)

非常感谢。

最佳答案

在8139驱动的**rtl8139_start_xmit()**函数中,首先检查skb->data的长度是否大于TX_BUF_SIZE,即MAX_ETH_FRAME_SIZE。如果它大于 TX_BUF_SIZE,驱动程序将丢弃数据包。

if (likely(len < TX_BUF_SIZE)) {
    if (len < ETH_ZLEN)
        memset(tp->tx_buf[entry], 0, ETH_ZLEN);
    skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
    dev_kfree_skb(skb);
} else {
    dev_kfree_skb(skb);
    tp->stats.tx_dropped++;
    return 0;
}


通常,如果您尝试发送的数据包大于 MAX_ETH_FRAME_SIZE,则协议(protocol)栈的 IP 层会将数据包分段,就像您说的“分解 XXX”。但是当数据包下降到驱动程序时,它不会再被分解。



更多信息:
IP fragmentation on wikipedia

关于linux - 将 skb->data 复制到多个描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756249/

相关文章:

linux - 作为汇编, movw %ax, %bp 不起作用

linux-kernel - Linux 中断处理

linux - 进程死后,Linux 内核在哪里进行进程和 TCP 连接清理?

c - 如何从下载的 Linux 源代码编译模块?

macos - 如何测试 IOKit 用户空间驱动程序开发?

linux - 允许对/var/www/html 的完全权限

linux - 具有组成员身份的 LDAP 身份验证

linux - 当svn服务器在linux机器上时,对tortoise svn的空白注释约束?

linux - 进程控制 block ,Linux 中的进程描述符和 task_struct?

linux - 启用 linux 内核驱动程序 dev_dbg 调试消息