我也在学习8139C司机。对于传输,驱动程序调用skb_copy_和_csum_dev(),将整个套接字缓冲区复制到一个描述符环中,该描述符环的缓冲区足以容纳整个套接字缓冲区。
如果描述符环缓冲区小于skb->data,那么如何正确地将break skb->data up和copy skb->data分成多个描述符?
(假设没有使用散射/聚集)
非常感谢。

最佳答案

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

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;
}

通常,如果您尝试发送的数据包大于最大帧大小,则协议栈的IP层将对数据包进行分段,就像您所说的“分段XXX”。但当数据包送到驱动程序时,就不会再被破坏了。
更多信息:
IP fragmentation on wikipedia

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

10-09 20:42