linux内核 设备列表,获取Linux内核中的网络设备列表

caf..

17

鉴于您要struct net *net识别您感兴趣的网络命名空间,您应该抓住dev_base_lock并使用for_each_netdev():

read_lock(&dev_base_lock);

for_each_netdev(net, dev) {

/* Inspect dev */

}

read_unlock(&dev_base_lock);

(在较新的内核中,您可以使用RCU,但在这种情况下,这可能是一个过度复杂的问题).

要获取net要使用的命名空间,您应该使用以下命令注册proc文件register_pernet_subsys():

static const struct file_operations foostats_seq_fops = {

.owner = THIS_MODULE,

.open = foostats_seq_open,

.read = seq_read,

.llseek = seq_lseek,

.release = foostats_seq_release,

};

static int foo_proc_init_net(struct net *net)

{

if (!proc_net_fops_create(net, "foostats", S_IRUGO,

&foostats_seq_fops))

return -ENOMEM;

return 0;

}

static void foo_proc_exit_net(struct net *net)

{

proc_net_remove(net, "foostats");

}

static struct pernet_operations foo_proc_ops = {

.init = foo_proc_init_net,

.exit = foo_proc_exit_net,

};

register_pernet_subsys(&foo_proc_ops)

在您的foostats_seq_open()函数中,您对net命名空间进行引用,并将其放在release函数中:

static int foostats_seq_open(struct inode *inode, struct file *file)

{

int err;

struct net *net;

err = -ENXIO;

net = get_proc_net(inode);

if (net == NULL)

goto err_net;

err = single_open(file, foostats_seq_show, net);

if (err < 0)

goto err_open;

return 0;

err_open:

put_net(net);

err_net:

return err;

}

static int foostats_seq_release(struct inode *inode, struct file *file)

{

struct net *net = ((struct seq_file *)file->private_data)->private;

put_net(net);

return single_release(inode, file);

}

foostats_seq_show()然后该函数可以获取net,遍历设备,收集统计信息并生成输出:

static int sockstat6_seq_show(struct seq_file *seq, void *v)

{

struct net *net = seq->private;

struct net_device *dev;

int foostat, barstat;

read_lock(&dev_base_lock);

for_each_netdev(net, dev) {

/* Inspect dev */

}

read_unlock(&dev_base_lock);

seq_printf(seq, "Foo: %d\n", foostat);

seq_printf(seq, "Bar: %d\n", barstat);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值