免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 如何获取linux内核中网卡发送队列的当前长度 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-12 20:22 |只看该作者 |倒序浏览
本帖最后由 l6590789 于 2013-07-12 20:22 编辑

大家好,我想在linux内核中找到网卡发送队列的长度,不知道找到的函数和变量是否正确

我找的函数是
341static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
342{
343        struct sk_buff_head *list = prio2list(skb, qdisc);
344
345        if (skb_queue_len(list) < qdisc->dev->tx_queue_len) {
346                qdisc->q.qlen++;
347                return __qdisc_enqueue_tail(skb, qdisc, list);
348        }
349
350        return qdisc_drop(skb, qdisc);
351}

我个人认为 skb_queue_len(list)是我要找的网卡当前发送队列长度而dev->tx_queue_len是网卡所能允许的最大发送队列长度值,不知道我的判断是否正确。如果linux系统有多个网卡的时候,那又怎么获得多个网卡队列的长度呢?我又该通过什么接口截取到这个值呢?

论坛徽章:
0
2 [报告]
发表于 2013-07-19 16:18 |只看该作者
我个人认为 skb_queue_len(list)是我要找的网卡当前发送队列长度而dev->tx_queue_len是网卡所能允许的最大发送队列长度值,不知道我的判断是否正确。


是的。

如果linux系统有多个网卡的时候,那又怎么获得多个网卡队列的长度呢?


先用dev_get_by_name按名称,或dev_get_by_index按ifindex获取net_device结构,也就是“dev->tx_queue_len”中的dev。

论坛徽章:
0
3 [报告]
发表于 2013-07-19 23:50 |只看该作者
谢谢大神,那我要怎么把网卡的dev_get_by_name(网卡名称)和skb_queue_len(list) (网卡出口队列长度)的数值取出来呢 通过socket编程能实现吗

论坛徽章:
0
4 [报告]
发表于 2013-07-19 23:56 |只看该作者
回复 2# 卖萌犯法


    谢谢大神,那我要怎么把网卡的dev_get_by_name(网卡名称)和skb_queue_len(list) (网卡出口队列长度)的数值取出来呢 通过socket编程能实现吗

论坛徽章:
0
5 [报告]
发表于 2013-07-20 18:52 |只看该作者
本帖最后由 卖萌犯法 于 2013-07-20 18:53 编辑

回复 4# l6590789

使用socket编程可以实现:

根据内核代码,使用ioctl 调用,SIOCGIFTXQLEN/SIOCSIFTXQLEN 命令,可以获取和设置网卡出口队列长度。
如果使用 ioctl ,就不需要 dev_get_by_name 了,因为 ioctl 的参数 struct ifreq 可以指定接口名,由内核去匹配。

内核代码如下:
                case SIOCGIFTXQLEN:
                        ifr->ifr_qlen = dev->tx_queue_len;
                        return 0;

                case SIOCSIFTXQLEN:
                        if (ifr->ifr_qlen<0)
                                return -EINVAL;
                        dev->tx_queue_len = ifr->ifr_qlen;
                        return 0;

调用 ioctl 方式时,ifr->ifr_qlen 即为接口发送队列长度。

论坛徽章:
0
6 [报告]
发表于 2013-07-21 20:27 |只看该作者
回复 5# 卖萌犯法


    ifr->ifr_qlen 不是网卡发送队列的最大长度吗?也就是ifconfig命令中能查询的那个队列长度值吧,我是想获得网卡的当前输出队列长度来判断网卡的用塞长度,通过ioctl接口能获得吗?需要自己编写一个内核模块吗?

论坛徽章:
0
7 [报告]
发表于 2013-07-22 02:38 |只看该作者
回复 6# l6590789

如果是当前长度的话,貌似 ioctl 是没招了,应该得内核编程实现了。

论坛徽章:
0
8 [报告]
发表于 2016-11-17 10:16 |只看该作者
题主你好,我现在遇到了和你一样的问题,想问下你后来怎么解决的或者有相关的文献推荐吗?谢谢了

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
9 [报告]
发表于 2016-11-21 18:03 |只看该作者
tc的统计信息里貌似有队列当前长度。

论坛徽章:
0
10 [报告]
发表于 2016-11-21 19:29 |只看该作者
回复 9# nswcfd

你好,可以稍微具体点吗,不太清楚tc是什么,多谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP