1

我正在学习 8139too.c 驱动程序。对于传输,驱动程序调用 skb_copy_and_csum_dev() 将整个套接字缓冲区复制到一个描述符环中,其缓冲区对于整个套接字缓冲区来说是足够大的。如果描述符环形缓冲区小于 skb->data,打破 skb->data 并将 skb->data 复制到多个描述符中的正确方法是什么?(假设没有使用分散/聚集)

非常感谢您。

4

1 回答 1

0

在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,则协议栈的 IP 层会将数据包分片,就像您说的“break XXX up”。但是当数据包下到驱动程序时,它就不会再被分解了。



更多信息:
维基百科上的 IP 碎片

于 2013-07-22T07:39:16.693 回答