dado un struct net *net
identificar el espacio de nombres de red que le interesa, usted debe agarrar el dev_base_lock
y utilizar for_each_netdev()
:
read_lock(&dev_base_lock);
for_each_netdev(net, dev) {
/* Inspect dev */
}
read_unlock(&dev_base_lock);
(En reciente núcleos, puede usar RCU en su lugar, pero eso es probablemente una complicación en este caso).
Para obtener el espacio de nombres net
de usar, usted debe estar registrando su archivo proc
con 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)
En su función foostats_seq_open()
, se toma una referencia en el net
espacio de nombres, y ponerlo en la función de liberación:
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);
}
La función foostats_seq_show()
puede n obtener el net
, caminar por los dispositivos, se reúnen las estadísticas y producir la salida:
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;
}
¿Puede usted dirigir mi esta consulta si tiene respuesta: http://stackoverflow.com/questions/36917950/unable- a-fetch-mac-address-de-red-dispositivo-en-kernel-módulo es necesario –