간단한 'ifconfig'명령으로 재조정 된 것처럼 로컬 시스템의 인터페이스에 대한 정보가 필요한 커널 모듈을 작성 중이지만 많이 검색했지만 찾을 수 없습니다.단순한 'ifconfig'가하는 일을 정확히 되 돌리는 커널 모듈이 있습니까?
2
A
답변
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에서) 더 이상 사용되지 않으므로, 지금 버그가없는 프로그램에 관해서는 더 잘 생각하지 않아야합니다.
ifconfig의 소스 코드를 확인하고 그 기능 (또는 strace로 확인)을 확인한 다음 Linux 커널 소스에서이 syscall이 실행될 때 네트워크 드라이버가 수행하는 작업을 확인하십시오. 예를 들어 ioctl SIOCGIFHWADDR, SIOCGIFADDR 등이 있습니다. –
예를 들어, net/core/dev.c를 확인하십시오. __dev_get_by_name() 함수가 흥미 롭습니다. 아마 그것을 사용하여 반환 된 구조체에서 인터페이스에 대한 정보를 얻을 수 있습니다. –