como o arquivo / proc / net / dev é preenchido?

5

Então, estou escrevendo um módulo do kernel que precisa de estatísticas sobre interfaces de redes locais e criei o seguinte código ... tudo funciona bem, exceto pela parte em que tento ler as estatísticas do dispositivo sem fio ... aparentemente o wireless_handler struct não está preenchido porque o CONFIG_WIRELESS_EXT não está definido ... minha pergunta? De onde é que ifconfig obtém as suas estatísticas sem fios?

struct net_device *dev;
struct net_device_stats *stats;             
struct iw_statistics *wi_stats;
dev = first_net_device(&init_net);
while (dev)
{
    if (strncmp(dev->name , "wlan",4)==0 && (dev->flags & IFF_UP) == 1)
            {

        #ifndef CONFIG_WIRELESS_EXT
        wi_stats = dev -> wireless_handlers -> get_wireless_stats(dev);
        #endif      
        }
        else if (strncmp(dev->name , "eth",3)==0 || strncmp(dev->name , "lo",2)==0) 
            {
        stats = dev->netdev_ops->ndo_get_stats(dev);
        printk(KERN_INFO "recive packets: [%li]\ntransmitted packets: [%li]\nrecive errors: [%li]\ntransmission errors: [%li]\nnumber of collisions: [%li]", 
                stats->rx_packets , stats->tx_packets ,stats->rx_errors , stats->tx_errors, stats->collisions);
            }

    dev = next_net_device(dev);
}//end while
    
por Varda Elentári 18.06.2012 / 21:34

2 respostas

2

Usando strace , você pode ver iwconfig fazendo algo assim:

socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
ioctl(3, SIOCGIWNAME, 0xbfb02c7c)       = 0
ioctl(3, SIOCGIWNWID, 0xbfb02c7c)       = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIWFREQ, 0xbfb02c7c)       = -1 EINVAL (Invalid argument)
ioctl(3, SIOCGIWENCODE, 0xbfb02c7c)     = 0

E mais ou menos uma dúzia de outros ioctl s seguem. Persiga os ioctl s no kernel e você encontrará onde os dados estão.

    
por 19.06.2012 / 16:28
0

A condição do pré-processador diz SE NÃO DEFINIDO CONFIG_WIRELESS_EXT

O que significa que seu código é APENAS incluído quando NÃO há suporte para cartão sem fio ... isso não acontece?

    #ifndef CONFIG_WIRELESS_EXT

Não deveria ser:

    #ifdef CONFIG_WIRELESS_EXT
    
por 19.06.2012 / 10:07