CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): terzeron (microkid)
날 짜 (Date): 2003년 11월 14일 금요일 오전 10시 34분 49초
제 목(Title): Re: [Q] 커널안에서 자기 주소  알기?


리눅스에 대해서 잘 모르겠지만...

유저레벨에서는 ifconfig 등의 프로그램은 특정 인터페이스의
IP 주소를 얻어오기 위해서 ioctl을 호출하게 됩니다. ioctl
명령은 시스템마다 미묘하게 다르니 언급하지 않겠습니다.
(제가 정확하게 알지 못하니) 

ioctl을 통해서 해당 인터페이스의 ip address, netmask, broadcast
mask, hw address등을 읽어올 수 있는데, ioctl은 그저 명령에
따라 커널 내 특정 구조체의 값을 읽어서 복사할 뿐입니다.

그럼 어떤 구조체에 ip 주소를 저장하고 있을 것인가? 이게 문제의
핵심이라고 봅니다. 일단 net/ipv4에서 devinet.c에 ioctl을 처리하는 
코드가 있는 것 같습니다. 여기서 struct in_ifaddr을 참고하는데
이 구조체는 include/linux의 inetdevice.h에 정의되어 있습니다.
여기 보니 u32 ifa_local과 u32 ifa_address가 있는데 요 두 가지
중의 하나겠죠.(대충 이렇게 짐작한다는 거지, 확실한 건 아닙니다)

일단 하나의 노드(컴퓨터)는 여러 개의 인터페이스를 가질 수 
있으니 어떤 인터페이스의 주소를 얻어야 하는 건지 살펴보시고
해당 인터페이스에는 또 여러 개의 주소를 가질 수 있으니 
struct in_device에 있는 struct in_ifaddr *ifa_list(아마도
linked list?)을 따라가면서 인터넷 주소인가 비교해보고 
맞으면 여기 달려있는 여러 주소를 모두 읽어들이면 됩니다.
이건 devinet.c의 ioctl처리부분에서 해주니까 그걸 참고하시면 
될 겁니다.




---
어떤 성취가, 어떤 조롱이, 또는 어떤 고뇌가 나를 기다리고 있을지 나는 모른다. 
나는 아무 것도 모른다. 그러나 나는 아직 과거의 경이로운 기적의 시대가 영원히 
과거의 것이 되어 버리지는 않았다는 사실을 굳게 믿고 있다.  - Stanislaw Lem -
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.