Chinaunix

标题: 如何获取linux内核中网卡发送队列的当前长度 [打印本页]

作者: l6590789    时间: 2013-07-12 20:22
标题: 如何获取linux内核中网卡发送队列的当前长度
本帖最后由 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系统有多个网卡的时候,那又怎么获得多个网卡队列的长度呢?我又该通过什么接口截取到这个值呢?
作者: 卖萌犯法    时间: 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。

作者: l6590789    时间: 2013-07-19 23:50
谢谢大神,那我要怎么把网卡的dev_get_by_name(网卡名称)和skb_queue_len(list) (网卡出口队列长度)的数值取出来呢 通过socket编程能实现吗
作者: l6590789    时间: 2013-07-19 23:56
回复 2# 卖萌犯法


    谢谢大神,那我要怎么把网卡的dev_get_by_name(网卡名称)和skb_queue_len(list) (网卡出口队列长度)的数值取出来呢 通过socket编程能实现吗
作者: 卖萌犯法    时间: 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 即为接口发送队列长度。

作者: l6590789    时间: 2013-07-21 20:27
回复 5# 卖萌犯法


    ifr->ifr_qlen 不是网卡发送队列的最大长度吗?也就是ifconfig命令中能查询的那个队列长度值吧,我是想获得网卡的当前输出队列长度来判断网卡的用塞长度,通过ioctl接口能获得吗?需要自己编写一个内核模块吗?
作者: 卖萌犯法    时间: 2013-07-22 02:38
回复 6# l6590789

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

作者: seu_wjw    时间: 2016-11-17 10:16
题主你好,我现在遇到了和你一样的问题,想问下你后来怎么解决的或者有相关的文献推荐吗?谢谢了
作者: nswcfd    时间: 2016-11-21 18:03
tc的统计信息里貌似有队列当前长度。
作者: seu_wjw    时间: 2016-11-21 19:29
回复 9# nswcfd

你好,可以稍微具体点吗,不太清楚tc是什么,多谢了!
作者: nswcfd    时间: 2016-11-21 20:11
就是tc命令,加-s参数。
作者: star_shining    时间: 2016-12-10 12:03
回复 8# seu_wjw
我现在也遇到这个问题,请问你现在解决了吗







欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2