ioctl 이해, ioctl cmid, command id 종류
2022. 4. 26. 15:46
0. ioctl cmd id, IOCTL의 request code 종류
https://docs.huihoo.com/doxygen/linux/kernel/3.7/uapi_2linux_2if__tunnel_8h.html
ip link vs ip tunnel
ioctl -> ip tunnel
rtn_link -> ip link
https://serverfault.com/questions/983764/linux-gre-ip-tunnel-vs-ip-link
기본
1. "SIOCG" 의 의미
struct ifreq ifr;
memcpy(&ifr.ifr_addr, addr->get_sockaddr(addr),
*addr->get_sockaddr_len(addr));
if (ioctl(this->sock, SIOCSIFADDR, &ifr) < 0)
{
SIOCGIFADDR : Get -> (returns only AF_INET addresses)
SIOCSIFADDR : Set -> (accepts AF_INET and AF_INET6 addresses)
SIOCDIFADDR : Delete ->
SIOCGIFFLAGS - S - IOC : IOCtl 명령을 써서 - G (get) : 가져온다. IFFLAGS를 |
2. "ifr" 의 의미
interface request sturcutre used for socket ioctl's
(출처 : https://man7.org/linux/man-pages/man7/netdevice.7.html)
(출처(한국): https://blog.silnex.kr/network-basic-ioctl%ED%95%A8%EC%88%98%EC%99%80-ifreq%EA%B5%AC%EC%A1%B0%EC%B2%B4/) (Ethernet 카드의 MAC 주소를 가져오는 예제)
(출처 : https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/+/refs/heads/tools_r20/sysroot/usr/include/net/if.h <- 여기가 제일 정확하게 나옴.)
https://docs.huihoo.com/doxygen/linux/kernel/3.7/uapi_2linux_2if__tunnel_8h.html
참고해야할 소스 : https://github.com/strongswan/strongswan/blob/09df86c033d18f89d1b1e463593a4a69ceecd950/src/libstrongswan/networking/tun_device.c
netdevice - low-level access to Linux network devices
참고해야할 문서
https://man7.org/linux/man-pages/man7/netdevice.7.html
ioctl()
각 디바이스마다 고유하게 선언하여 사용하는 전용 함수라고 생각하면 된다.
ioct() 함수의 특징
read(), write() 함수와 같이 읽기와 쓰기 처리가 가능하다.
하드웨어를 제어하거나 상태 값을 읽어올 수 있다.
응용프로그램의 요구에 따라 디바이스 드라이버의 매개변수 해석이 달라진다.
ret = ioctl ( int fd, int request, char *argp);
// #include <sys/ioctl.h>
int dev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
… return ret;
}
보통은 아래와 같이 작성한다.
IOCTL 개요
(출처 : https://embetronicx.com/tutorials/linux/device-drivers/ioctl-tutorial-in-linux/)
* ioctl 이해
- IOCTL은 I/O Control의 줄임말, 즉, Input and Output Control이다.
- IOCTL은 디바이스 드라이들과 talk(통신)하기 위해서 사용됨.
- 이 시스템 콜(IOCTL)은 모든 드라이버 카테고리들에 사용 가능함.
- 이것의 주요 사용은 디바이스의 어떤 구체적인 동작을 핸들링 하는 경우에 사용함, 그것을 위해 커널은 디폴트에 의해 시스템콜을 가지지 않고 있는,
* IOCTL를 위해 involed되는 단계들
- IOCTL을 사용하기 위해 포함되어야할 몇가지 스텝들이다
1. driver 안에 IOCTL 명령어를 만들기
2. driver 안에 IOCTL function을 작성하기
3. Userspace app 안에 IOCTL 명령어를 만들기
4. Userspace 안에 IOCTL system call을 사용하기
* IOCTL command 만들기 (Driver 안에)
* driver 안에 IOCTL function을 작성하기
그 다음 단계는, ioctl call을 구현하는 것임, 상응하는 드라이버 안에, 우리가 정의한 ioctl call.
우리는 우리의 driver에 ioctl function을 추가하는게 필요함
int ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
int ioctl(
struct inode *inode, (is the inode number of the file being worked on.)
struct file *file, (is the file pointer to the file that was passed by the application.)
unsigned int cmd, (is the ioctl command that was called from the userspace.)
unsigned long arg (are the arguments passed from the userspace)
)
*4. Userspace 안에 IOCTL system call을 사용하기
우선 사용하기 전에, <sys/ioctl.h> 헤더파일을 include 해야합니다.
이제, 우리는 새로운 ioctl command를 (user application으로 부터) 부를 필요가 있습니다.
long ioctl( "file descriptor","ioctl command","Arguments");
long ioctl(
"file descriptor", (이 open file, (여기서 ioctl 명령어가 실행되는게 필요함), 그것은 일반적으로 디바이스 파일들 입니다.)
"ioctl command", (ioctl command 임. 그것은 원하는(desired) 기능들이 달성되기 위해 구현됨.)
"Arguments" (argument들임, ioctl 명령어에 전달되기 위해 필요한.)
);
예를 들어 아래과 같음.
ioctl(fd, WR_VALUE, (int32_t*) &number);
ioctl(fd, RD_VALUE, (int32_t*) &value);
-------------
phase 2
strongswan에서 아래와 같이 쓰고 있음.
if (ioctl(this->sock, SIOCAIFADDR, &ifra) < 0)
ioctl(
this->sock, (
SIOCAIFADDR, (
&ifra (
)
----
강의자료
http://contents.kocw.or.kr/KOCW/document/2014/handong/choyunseok/16.pdf
실전 예제
https://wogh8732.tistory.com/306
그리고 참고하면 좋을 자료
https://stackoverflow.com/questions/5308090/set-ip-address-using-siocsifaddr-ioctl
https://gist.github.com/gl/451198