2012-04-12 6 views
2

간단한 'ifconfig'명령으로 재조정 된 것처럼 로컬 시스템의 인터페이스에 대한 정보가 필요한 커널 모듈을 작성 중이지만 많이 검색했지만 찾을 수 없습니다.단순한 'ifconfig'가하는 일을 정확히 되 돌리는 커널 모듈이 있습니까?

+0

ifconfig의 소스 코드를 확인하고 그 기능 (또는 strace로 확인)을 확인한 다음 Linux 커널 소스에서이 syscall이 실행될 때 네트워크 드라이버가 수행하는 작업을 확인하십시오. 예를 들어 ioctl SIOCGIFHWADDR, SIOCGIFADDR 등이 있습니다. –

+0

예를 들어, net/core/dev.c를 확인하십시오. __dev_get_by_name() 함수가 흥미 롭습니다. 아마 그것을 사용하여 반환 된 구조체에서 인터페이스에 대한 정보를 얻을 수 있습니다. –

답변

5

그 정보를 모두 struct net_device을 통해 얻을 수 있습니다. Albert Veli가 말했듯이 __dev_get_by_name()을 사용하여 struct net_device 포인터를 얻을 수 있습니다.

귀하가 구체적으로 필요한 정보를 알려 주시면 올바른 분야로 귀하를 안내 할 수도 있습니다. IP 주소를 찾기

struct net_device *dev = __dev_get_by_name("eth0"); 
dev->dev_addr; // is the MAC address 
dev->stats.rx_dropped; // RX dropped packets. (stats has more statistics) 

오히려 더 열심히,하지만 불가능하지 : 오타가 가능

struct in_device *in_dev = rcu_dereference(dev->ip_ptr); 
// in_dev has a list of IP addresses (because an interface can have multiple) 
struct in_ifaddr *ifap; 
for (ifap = in_dev->ifa_list; ifap != NULL; 
     ifap = ifa1->ifa_next) { 
    ifap->ifa_address; // is the IPv4 address 
} 

(이 중에 컴파일 시험되지 않았다, 그래서

MAC 주소를 찾기

은 매우 간단하다)

+0

글쎄, 인터페이스의 IP 주소를 얻고 싶습니다. MAC입니다. 상태, 오류 패킷 수 및 손실 패킷입니다.이 인터페이스에서 링크의 속도 나 대역폭을 확보 할 수있는 방법이 있습니까? –

0

net/ipv6/addrconf.c에서 주소를 얻는 방법에 대한 예를 들어 in6_dump_addrs 함수를 참조하십시오. 링크 계층 주소와 같은 링크 속성의 경우 core/rtnetlink.c을 참조하십시오. ifconfig와 그 ioctls는 (Linux에서) 더 이상 사용되지 않으므로, 지금 버그가없는 프로그램에 관해서는 더 잘 생각하지 않아야합니다.