当前位置: 技术问答>linux和unix
skb buffer与ring buffer区别等问题
来源: 互联网 发布时间:2016-04-06
本文导语: 大家好,我刚刚接触Linux网络驱动方面,对驱动的各部分有了总体认识,但是有些细节不是很了解。 目前有以下几个问题: 1.看到网卡驱动中有skb buffer和ring buffer两种缓冲区。请问两个有什么区别,分别存放什么, ...
大家好,我刚刚接触Linux网络驱动方面,对驱动的各部分有了总体认识,但是有些细节不是很了解。
目前有以下几个问题:
1.看到网卡驱动中有skb buffer和ring buffer两种缓冲区。请问两个有什么区别,分别存放什么,
这两个缓冲区分别是在哪里申请的阿,比如说skb是在内存的物理映射区,那ring buffer呢?
2.TX_ring_size和RX_ring_size以及MIN_MTU和MAX_MTU的值是怎么确定的?一个数据包的大小不是
46-1500字节吗?还有skb大小怎么定?缓冲区里可以容纳多少个数据包一次?
3.netif_rx将数据包传给上层协议,这个过程是怎么进行的阿?是需要传给一个系统接口然后再传给
应用程序吗?那能不能让netif_rx直接把数据包传给应用程序阿?我们有个应用想通过驱动直接获取
并处理数据包,而不经过系统接口。
4.在网卡驱动中,我想在数据发送前将目的MAC地址修改成想要的地址,这样的做法可行吗?即:
在hard_start_xmit函数的开始处添加代码: memcpy(eth->h_dest, change->daddr, dev->addr_len);
其中change_addr是我自己定义的。
5.在数据接收时我想提前修改目的MAC地址和源MAC地址,那么我在net_rx函数的开头添加代码:
memcpy(eth->h_source, change->saddr, dev->addr_len);
memcpy(eth->h_dest, change->daddr, dev->addr_len);
这样能实现吗,可行吗?
目前有以下几个问题:
1.看到网卡驱动中有skb buffer和ring buffer两种缓冲区。请问两个有什么区别,分别存放什么,
这两个缓冲区分别是在哪里申请的阿,比如说skb是在内存的物理映射区,那ring buffer呢?
2.TX_ring_size和RX_ring_size以及MIN_MTU和MAX_MTU的值是怎么确定的?一个数据包的大小不是
46-1500字节吗?还有skb大小怎么定?缓冲区里可以容纳多少个数据包一次?
3.netif_rx将数据包传给上层协议,这个过程是怎么进行的阿?是需要传给一个系统接口然后再传给
应用程序吗?那能不能让netif_rx直接把数据包传给应用程序阿?我们有个应用想通过驱动直接获取
并处理数据包,而不经过系统接口。
4.在网卡驱动中,我想在数据发送前将目的MAC地址修改成想要的地址,这样的做法可行吗?即:
在hard_start_xmit函数的开始处添加代码: memcpy(eth->h_dest, change->daddr, dev->addr_len);
其中change_addr是我自己定义的。
5.在数据接收时我想提前修改目的MAC地址和源MAC地址,那么我在net_rx函数的开头添加代码:
memcpy(eth->h_source, change->saddr, dev->addr_len);
memcpy(eth->h_dest, change->daddr, dev->addr_len);
这样能实现吗,可行吗?
|
3 , 这个是产生软中断,然后在软中断中处理的吧?
4,5 修改sk_buff 中的dade
4,5 修改sk_buff 中的dade