ioctl函数 linux,获取MAC函数(linux下ioctl/vxworks下muxIoctl)

1.介绍

Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现.

2.相关结构体与相关函数

#include

int ioctl(int d,int request,....);

参数:

d-文件描述符,这里是对网络套接字操作,显然是套接字描述符

request-请求码

省略的部分对应不同的内存缓冲区,而具体的内存缓冲区是由请求码request来决定的,下面看一下具体都有哪些相关缓冲区。

(1)网络接口请求结构ifreq

struct ifreq{

#define IFHWADDRLEN 6 //6个字节的硬件地址,即MAC

union{

char ifrn_name[IFNAMESIZ];//网络接口名称

}ifr_ifrn;

union{

struct sockaddr ifru_addr;//本地IP地址

struct sockaddr ifru_dstaddr;//目标IP地址

struct sockaddr ifru_broadaddr;//广播IP地址

struct sockaddr ifru_netmask;//本地子网掩码地址

struct sockaddr ifru_hwaddr;//本地MAC地址

short ifru_flags;//网络接口标记

int ifru_ivalue;//不同的请求含义不同

struct ifmap ifru_map;//网卡地址映射

int ifru_mtu;//最大传输单元

char ifru_slave[IFNAMSIZ];//占位符

char ifru_newname[IFNAMSIZE];//新名称

void __user* ifru_data;//用户数据

struct if_settings ifru_settings;//设备协议设置

}ifr_ifru;

}

#define ifr_name ifr_ifrn.ifrn_name;//接口名称

#define ifr_hwaddr ifr_ifru.ifru_hwaddr;//MAC

#define ifr_addr ifr_ifru.ifru_addr;//本地IP

#define ifr_dstaddr ifr_ifru.dstaddr;//目标IP

#define ifr_broadaddr ifr_ifru.broadaddr;//广播IP

#define ifr_netmask ifr_ifru.ifru_netmask;//子网掩码

#define ifr_flags ifr_ifru.ifru_flags;//标志

#define ifr_metric ifr_ifru.ifru_ivalue;//接口侧度

#define ifr_mtu ifr_ifru.ifru_mtu;//最大传输单元

#define ifr_map ifr_ifru.ifru_map;//设备地址映射

#define ifr_slave ifr_ifru.ifru_slave;//副设备

#define ifr_data ifr_ifru.ifru_data;//接口使用

#define ifr_ifrindex ifr_ifru.ifru_ivalue;//网络接口序号

#define ifr_bandwidth ifr_ifru.ifru_ivalue;//连接带宽

#define ifr_qlen ifr_ifru.ifru_ivalue;//传输单元长度

#define ifr_newname ifr_ifru.ifru_newname;//新名称

#define ifr_seeting ifr_ifru.ifru_settings;//设备协议设置

如果想获得网络接口的相关信息,就传入ifreq结构体.

(2)网卡设备属性ifmap

struct ifmap{//网卡设备的映射属性

unsigned long mem_start;//开始地址

unsigned long mem_end;//结束地址

unsigned short base_addr;//基地址

unsigned char irq;//中断号

unsigned char dma;//DMA

unsigned char port;//端口

}

(3)网络配置接口ifconf

struct ifconf{//网络配置结构体是一种缓冲区

int ifc_len;//缓冲区ifr_buf的大小

union{

char__user *ifcu_buf;//绘冲区指针

struct ifreq__user* ifcu_req;//指向ifreq指针

}ifc_ifcu;

};

#define ifc_buf ifc_ifcu.ifcu_buf;//缓冲区地址

#define ifc_req ifc_ifcu.ifcu_req;//ifc_req地址

(4)ARP高速缓存操作arpreq

/**</

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值