将skb->数据复制到多个描述符

时间:2013-07-19 22:07:05

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

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

非常感谢你。

1 个答案:

答案 0 :(得分: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层将对数据包进行分段,就像您说“中断XXX”一样。但是当数据包发送给驱动程序时,它不会再被打破。



更多信息:
IP fragmentation on wikipedia