/proc/net/dev 파일은 어떻게 채워지나요?

/proc/net/dev 파일은 어떻게 채워지나요?

그래서 로컬 네트워크 인터페이스에 대한 통계가 필요한 커널 모듈을 작성 중인데 다음과 같은 코드를 생각해 냈습니다. 무선 장치 통계를 읽으려고 하는 부분을 제외하고는 모든 것이 잘 작동합니다. 구조가 채워지지 않았습니다. 설정되지 않았기 wireless_handler때문인가요 ...제 문제인가요? 무선 통계는 CONFIG_WIRELESS_EXT어디서 얻을 수 있나요 ?ifconfig

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

답변1

를 사용하면 다음과 같은 작업을 수행하는 strace것을 볼 수 있습니다 .iwconfig

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

그 뒤를 12명 정도가 ioctl뒤따랐다. ioctl커널에서 이러한 항목을 추적하면 데이터가 어디에 있는지 찾을 수 있습니다.

답변2

전처리기 조건은 IF NOT DEFINED CONFIG_WIRELESS_EXT입니다.

이는 무선 카드가 지원되지 않는 경우에만 코드가 포함된다는 의미입니다. 거꾸로 아닌가요?

    #ifndef CONFIG_WIRELESS_EXT

다음과 같으면 안 됩니다.

    #ifdef CONFIG_WIRELESS_EXT

관련 정보