概念
ioctl 是设备驱动程序中设备控制接口函数(操作设备函数),一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
参数
fd 文件描述符
cmd 交互协议,设备驱动将根据 cmd 执行对应操作
… 可变参数 arg,依赖 cmd 指定长度以及类型
SIOCGIFCONF 获取所有接口列表 Struct ifconf
SIOCSIFADDR 设置接口地址 Struct ifreq
SIOCGIFADDR 获取接口地址 Struct ifreq
SIOCSIFBRDADDR 设置广播地址 Struct ifreq
SIOCGIFBRDADDR 获取广播地址 Struct ifreq
SIOCSIFNETMASK 设置子网掩码 Struct ifreq
SIOCGIFNETMASK 获取子网掩码 Struct ifreq
SIOCGIFFLAGS 获取接口标志 Struct ifreq
//ifconf 通常是用来保存所有接口信息。
//if.h
struct ifconf
{
int ifc_len; /* size of buffer */
union {
char *ifcu_buf; /* input from user->kernel*/
struct ifreq *ifcu_req; /* return from kernel->user*/
} ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
//ifreq用来保存某个接口的信息
//if.h
struct ifreq {
char ifr_name[IFNAMSIZ];
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
} ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr
参考网站
https://www.man7.org/linux/man-pages/man7/netdevice.7.html