본문 바로가기
TCP/IP

ioctl : 장치 제어 함수

by 상레알 2011. 4. 29.
참조 : http://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/device-understanding.html
참조 : http://blog.naver.com/hajiheon/19411640
참조 : http://ieplab.snu.ac.kr/~alphard/work/dynamic_kernel_1.html

ioctl(unsigned int fd,unsigned intrequest, long argument) 

ioctl은 input/output contrl을 의미하며 파일 디스크립터 (filedescriptor)를 가지고 캐릭터 디바이스
(character device)를 조종하는데 사용된다.  
(캐릭터 디바이스는  파일로 볼 수 있는, 읽어 들이거나 써넣을 수 있는 것들 콘솔(모니터와 키보드 등)
그리고 직렬/병렬 포트들은 캐릭터 디바이스들이다. /dev/tty0, dev/cua0 파일 등을 통해 캐릭터 디바이스에
접근할 수 있다. 캐릭터 디바이스는 순차적으로만 접근할 수 있는 것이 보통이다.)

ioctl의 형태는 ioctl(unsigned int fd,unsigned int request, long argument) 이다.

에러시 -1 반환 , 다른 시스템 호출과 같이 요청이 성공하면 0보다 크거나 같은값 리턴

커널은 특수 파일 (special file)이나 일반 파일들(regular files)과 구분된다. 특수 파일 (special file)은
주로 /dev나 /proc 디렉토리에서 찾을 수 있다. 이 파일들은 드라이버아 의 인터페이스를 숨기고 있고
텍스트나 이진 데이타를 포함하는 실제(일반) 파일이 아니라는 점에서 일반 파일 (regualar file)과 다르다.
이러한 점은 유닉스의 철학이고 모든 파일에 대해서 정상적으로 읽기/쓰기 동작의 사용을 허락한다.
그러나 특수 파일이나 일반 파일을 가지고 그 이상의 일을 하고자 한다면 ioctl를 가지고 할 수 있다.
일반 파일 보다는 특수 파일에 대해 ioctl이 종종 더 많이 필요할테지만 일반 파일에 대해서도
ioctl의 사용이 가능하다.

에러 :
* EBADF           d 는 유효한 기술자가 아니다.
* EFAULT         argp는 접근할 수 없는 메모리 영역을 참조한다.
* ENOTTY        d는 문자 특수 파일과 연관 되어 있지 않다.
* ENOTTY        명시한 request는 파일 기술자 d에 해당하는 객체에 적용되지 않는다.
* EINVAL          request 또는 argp가 유효하지 않다.


request 매크로와 상수  (fedora 14 기준)

/* Routing table calls.  */
#define SIOCADDRT       0x890B          /* add routing table entry      */
#define SIOCDELRT       0x890C          /* delete routing table entry   */
#define SIOCRTMSG       0x890D          /* call to routing system       */
/* Socket configuration controls. */
#define SIOCGIFNAME     0x8910          /* get iface name               */
#define SIOCSIFLINK     0x8911          /* set iface channel            */
#define SIOCGIFCONF     0x8912          /* get iface list               */
#define SIOCGIFFLAGS    0x8913          /* get flags                    */
#define SIOCSIFFLAGS    0x8914          /* set flags                    */
#define SIOCGIFADDR     0x8915          /* get PA address               */
#define SIOCSIFADDR     0x8916          /* set PA address               */
#define SIOCGIFDSTADDR  0x8917          /* get remote PA address        */
#define SIOCSIFDSTADDR  0x8918          /* set remote PA address        */
#define SIOCGIFBRDADDR  0x8919          /* get broadcast PA address     */
#define SIOCSIFBRDADDR  0x891a          /* set broadcast PA address     */
#define SIOCGIFNETMASK  0x891b          /* get network PA mask          */
#define SIOCSIFNETMASK  0x891c          /* set network PA mask          */
#define SIOCGIFMETRIC   0x891d          /* get metric                   */
#define SIOCSIFMETRIC   0x891e          /* set metric                   */
#define SIOCGIFMEM      0x891f          /* get memory address (BSD)     */
#define SIOCSIFMEM      0x8920          /* set memory address (BSD)     */
#define SIOCGIFMTU      0x8921          /* get MTU size                 */
#define SIOCSIFMTU      0x8922          /* set MTU size                 */
#define SIOCSIFNAME     0x8923          /* set interface name           */
#define SIOCSIFHWADDR   0x8924          /* set hardware address         */
#define SIOCGIFENCAP    0x8925          /* get/set encapsulations       */
#define SIOCSIFENCAP    0x8926
#define SIOCGIFHWADDR   0x8927          /* Get hardware address         */
#define SIOCGIFSLAVE    0x8929          /* Driver slaving support       */
#define SIOCSIFSLAVE    0x8930
#define SIOCADDMULTI    0x8931          /* Multicast address lists      */
#define SIOCDELMULTI    0x8932
#define SIOCGIFINDEX    0x8933          /* name -> if_index mapping     */
#define SIOGIFINDEX     SIOCGIFINDEX    /* misprint compatibility :-)   */
#define SIOCSIFPFLAGS   0x8934          /* set/get extended flags set   */
#define SIOCGIFPFLAGS   0x8935
#define SIOCDIFADDR     0x8936          /* delete PA address            */
#define SIOCSIFHWBROADCAST      0x8937  /* set hardware broadcast addr  */
#define SIOCGIFCOUNT    0x8938          /* get number of devices */
#define SIOCGIFBR       0x8940          /* Bridging support             */
#define SIOCSIFBR       0x8941          /* Set bridging options         */
#define SIOCGIFTXQLEN   0x8942          /* Get the tx queue length      */
#define SIOCSIFTXQLEN   0x8943          /* Set the tx queue length      */
/* ARP cache control calls. */
                    /*  0x8950 - 0x8952  * obsolete calls, don't re-use */
#define SIOCDARP        0x8953          /* delete ARP table entry       */
#define SIOCGARP        0x8954          /* get ARP table entry          */
#define SIOCSARP        0x8955          /* set ARP table entry          */
/* RARP cache control calls. */
#define SIOCDRARP       0x8960          /* delete RARP table entry      */
#define SIOCGRARP       0x8961          /* get RARP table entry         */
#define SIOCSRARP       0x8962          /* set RARP table entry         */
/* Driver configuration calls */
#define SIOCGIFMAP      0x8970          /* Get device parameters        */
#define SIOCSIFMAP      0x8971          /* Set device parameters        */
/* DLCI configuration calls */
#define SIOCADDDLCI     0x8980          /* Create new DLCI device       */
#define SIOCDELDLCI     0x8981          /* Delete DLCI device           */
/* Device private ioctl calls.  */
#define SIOCDEVPRIVATE          0x89F0  /* to 89FF */
#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */



 
 

'TCP/IP' 카테고리의 다른 글

Nagle 알고리즘  (0) 2011.05.02
getsockopt() , setopt () 함수  (0) 2011.05.02
소켓 함수 및 헤더들  (0) 2011.02.07
sendto()  (0) 2010.03.28
SOCKADDR_IN 구조체  (0) 2010.03.28
SOCKET() 함수  (0) 2010.03.25
Linux: SOCK_PARCKET  (0) 2009.12.03
ICMP 프로토콜  (0) 2009.11.16
인터넷 소켓 활용  (0) 2009.08.31
TCP/IP 열혈 강의  (0) 2009.08.12