제임스딘딘의
Tech & Life

개발자의 기록 노트/C

[네트워크/C] ifreq 구조체 (struct ifreq)

제임스-딘딘 2017. 6. 14. 01:19

관련 헤더

#include <sys/ioctl.h>
#include <net/if.h>


설명

linux에서 네트워크 장치의 설정과 관련된 대부분의 ioctl( ) 호출에 세번째 인자로 사용하는 구조체이다.

참고로, linux의 ioctl( ) 호출시 첫번째 인자는 file descriptor인데, family나 type과 관계없이 어떠한 소켓 file descriptor라도 사용할 수 있다.

구조체의 멤버변수는 아래와 같다.


struct ifreq {
	char ifr_name[IFNAMSIZ]; /* Interface name */
	union {
		struct sockaddr ifr_addr;
		struct sockaddr ifr_dstaddr;
		struct sockaddr ifr_broadaddr;
		struct sockaddr ifr_netmask;
		struct sockaddr ifr_hwaddr;
		short           ifr_flags;
		int             ifr_ifindex;
		int             ifr_metric;
		int             ifr_mtu;
		struct ifmap    ifr_map;
		char            ifr_slave[IFNAMSIZ];
		char            ifr_newname[IFNAMSIZ];
		char           *ifr_data;
	};
};


일반적으로 개발자는, ioctl( )의 대상으로 삼고자 하는 인터페이스의 이름을 ifr_name에 설정한다.

그 외의 다른 멤버 변수들은 union 이다. 

즉, 멤버 변수 ifr_name만 IFNAMSIZ 만큼의 메모리를 차지하고, 그 외는 메모리공간을 공유한다. (시작 번지가 같다)


알려진 버그

glibc 2.1를 사용하는 경우,  헤더 net/if.h 파일에 'ifr_newname' 매크로가 누락되어 있다.

따라서 컴파일 타임 에러가 발생할 수 있다.

임시로 아래 코드를 추가하여 컴파일 에러를 해결할 수 있다.


#ifndef ifr_newname
#define ifr_newname     ifr_ifru.ifru_slave
#endif