免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3624 | 回复: 6
打印 上一主题 下一主题

小弟最近在看e1000e网卡驱动,有几处不明,还请大虾指教一二~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-05 23:25 |只看该作者 |倒序浏览
1. 在驱动中没有找到给报文添加MAC头的地方,在内核代码了转了一圈也没有找到相应的地方,现在很是困惑,还请大虾指点指点。


2.在e1000_probe()中,有对descriptor的数目进行初始化:
adapter->rx_ring->count =256;
adapter->tx_ring->count =256;

netdev->tx_queue_len在ether_setup()中被初始化为1000

然后在e1000_configure_tx()中:
adapter->tx_queue_len = adapter->netdev->tx_queue_len;

总觉得netdev->tx_queue_len与adapter->tx_ring->count之间有着一定的关系,但是一直没有找到,也没有找到netdev->tx_queue_len具体起什么作用,感觉就是赋了个值,就再没有用上
还请兄弟们指点指点啊

论坛徽章:
0
2 [报告]
发表于 2010-09-06 11:45 |只看该作者
1.添加MAC头部是在协议栈中,而不是驱动中。
2.netdev->tx_queue_len是发送队列长度,adapter->tx_ring->count是发送环形缓冲区的数目。
两者没有直接的互动关系。

论坛徽章:
0
3 [报告]
发表于 2010-09-06 12:37 |只看该作者
多谢~~

1. 能说说是在协议栈中哪个函数中添加mac头的么?

2. netdev->tx_queue_len具体有什么左右呢?
adapter->tx_ring->count能感觉到他的左右,但是netdev->tx_queue_len一点都感觉不到,连他的存在也还是在无意中看到,这里很是不解
还请指教哈

论坛徽章:
0
4 [报告]
发表于 2010-09-06 12:38 |只看该作者
不好意思,上贴中把 作用 写成 左右 了

论坛徽章:
0
5 [报告]
发表于 2010-09-06 15:39 |只看该作者
多谢~~

1. 能说说是在协议栈中哪个函数中添加mac头的么?

2. netdev->tx_queue_len具体有什么左右呢 ...
lofeng410 发表于 2010-09-06 12:37


1.调用dev_queue_xmit之前。
2.限制发送队列长度。

建议你用vim+cscope+ctags察看内核代码。

论坛徽章:
0
6 [报告]
发表于 2010-09-06 23:24 |只看该作者
回复 5# ShadowStar


1. 能具体讲讲是在哪个函数中的么?
e1000_xmit_frame()是被dev_queue_xmit()调用的,能讲讲是在dev_queue_xmit()之前哪个函数中加上了MAC头么?

2. netdev->tx_queue_len是怎样实现限制发送队列长度的呢?
个人感觉adapter->tx_ring->count已经起到了这个作用了呀,而且还很直白
netdev->tx_queue_len在内核中只出现在个别地方,而且是查询、设置 netdev->tx_queue_len值,没找到它起作用的代码段呀

另,一直用source insight看内核代码,没有试过vim+cscope+ctags哎

论坛徽章:
0
7 [报告]
发表于 2010-09-07 09:48 |只看该作者
回复  ShadowStar


1. 能具体讲讲是在哪个函数中的么?
e1000_xmit_frame()是被dev_queue_xmit()调用 ...
lofeng410 发表于 2010-09-06 23:24


1.你看一下ip_finish_output2函数。

2.
  1. static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
  2. {
  3.         struct sk_buff_head *list = prio2list(skb, qdisc);

  4.         if (skb_queue_len(list) < qdisc->dev->tx_queue_len) {                                      
  5.                 qdisc->q.qlen++;
  6.                 return __qdisc_enqueue_tail(skb, qdisc, list);
  7.         }

  8.         return qdisc_drop(skb, qdisc);
  9. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP