如何解决如何在设备驱动程序的轮询方法中从 skb 中提取整个数据包,包括以太网标头、ip 和 tcp 以及有效负载
在来自 realtek 的 r8169 驱动程序中可以
rx_buf = page_address(tp->Rx_databuff[entry]);
dma_sync_single_for_cpu(d,addr,pkt_size,DMA_FROM_DEVICE);
prefetch(rx_buf);
skb_copy_to_linear_data(skb,rx_buf,pkt_size);<----//Do I get packet at this????
skb->tail += pkt_size;
skb->len = pkt_size;
dma_sync_single_for_device(d,DMA_FROM_DEVICE);
//csum...
skb->protocol = eth_type_trans(skb,dev);
napi_gro_receive(&tp->napi,skb);
这是从驱动程序轮询调用的 rtl_rx 函数内部。我想知道在上面的代码中如何从 skb 之后的哪一行提取整个数据包。
我假设在这一行
skb_copy_to_linear_data(skb,pkt_size);
我应该有一个数据包,但想知道我可以创建一个 kmalloc 对象的正确方法
void *packet= kmalloc(....sizeof(struct ethhdr)+sizeof(struct iphdr)+sizeof(tcphdr))
并从 void *packet 读取以太网 ip 和 tcp 标头
如何实现
或者我应该简单地做 skb_netword_header、skb_tcp_header 等...在上面的行中填充后从 skb 中提取标头和有效负载,
或者我可以简单地投射为
rx_buf = page_address(tp->Rx_databuff[entry]);
struct ether_header ethhdr_of_packet=(struct eher_header *) rx_buf;
它应该有效吗?
解决方法
突出显示的行(带有 skb_copy_to_linear_data()
的那一行)确实将整个数据包数据从复制到驱动程序内部 Rx 环(rx_buf
)中的缓冲区到 skb 的数据缓冲区。
static inline void skb_copy_to_linear_data(struct sk_buff *skb,const void *from,const unsigned int len)
{
memcpy(skb->data,from,len);
}
将 rx_buf
指针投射到以太网标头也应该没问题。但是,在您的问题中,像这样访问数据包标头的目的相当模糊。您是只是尝试打印(“转储”)数据包,还是打算将数据包数据复制到完全不同的缓冲区以供其他地方使用?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。