我正在学习 8139too.c 驱动程序。对于传输,驱动程序调用 skb_copy_and_csum_dev() 将整个套接字缓冲区复制到一个描述符环中,其缓冲区对于整个套接字缓冲区来说是足够大的。如果描述符环形缓冲区小于 skb->data,打破 skb->data 并将 skb->data 复制到多个描述符中的正确方法是什么?(假设没有使用分散/聚集)
非常感谢您。
我正在学习 8139too.c 驱动程序。对于传输,驱动程序调用 skb_copy_and_csum_dev() 将整个套接字缓冲区复制到一个描述符环中,其缓冲区对于整个套接字缓冲区来说是足够大的。如果描述符环形缓冲区小于 skb->data,打破 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,则协议栈的 IP 层会将数据包分片,就像您说的“break XXX up”。但是当数据包下到驱动程序时,它就不会再被分解了。
更多信息:
维基百科上的 IP 碎片