在驱动开发中,ioctl是很常用的应用层与内核通信的接口,今天调试过程中遇到一个ioctl调用不执行的问题,有点意思,写篇博客记录一下。
对于网络设备,内核通过宏SIOCDEVPRIVATE给各个设备预留了一组私有ioctl命令,驱动可以自行定义响应函数来执行相应的操作。今天接到一个需求,要在驱动里添加一个清空用户统计信息的功能,于是相应的就需要增加一个ioctl命令供应用层调用。看了驱动代码,已定义的私有ioctl命令从(SIOCDEVPRIVATE+0)一直到(SIOCDEVPRIVATE+16),于是理所当然的,我顺着添加了一条ioctl命令:
应用层的调用代码如下:
对于网络设备,内核通过宏SIOCDEVPRIVATE给各个设备预留了一组私有ioctl命令,驱动可以自行定义响应函数来执行相应的操作。今天接到一个需求,要在驱动里添加一个清空用户统计信息的功能,于是相应的就需要增加一个ioctl命令供应用层调用。看了驱动代码,已定义的私有ioctl命令从(SIOCDEVPRIVATE+0)一直到(SIOCDEVPRIVATE+16),于是理所当然的,我顺着添加了一条ioctl命令:
#define IEEE80211_IOCTL_CLEAR_STA_STATS (SIOCDEVPRIVATE+17)
应用层的调用代码如下:
int sockfd = 0;
struct iwreq iwr;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
ERROR("socket(SOCK_DRAGM)");
return ERROR;
}
memset(&iwr, 0, sizeof(iwr));
strncpy(iwr.ifr_ifrn.ifrn_name, vapName /* 网卡设备名 */, sizeof(iwr.ifr_ifrn.ifrn_name));
iwr.ifr_ifrn.ifrn_name[sizeof(iwr.ifr_ifrn.ifrn_name)-1] = '\0';
iwr.u.data.pointer = (void *)buf; /* station的MAC地址 */
iwr.