ioctl BPF 控制操作
用途
执行与包捕获相关的控制操作。
语法
#include <sys/ioctl.h> int ioctl ( int fd, int cmd[, arg ])
描述
Berkeley 包过滤器 (BPF) ioctl 命令执行各种与包捕获相关的控制。 联邦 参数是一个 BPF 设备描述符。 对于非包捕获描述符,未指定此调用所执行的函数。
命令 参数和可选的第三个参数 (具有不同类型) 由 BPF ioctl 函数传递和解释,以执行用户指定的适当控制操作。
参数
| 项 | 描述 |
|---|---|
| fd | 指定一个开放式文件描述符,它引用使用开放式调用创建的 BPF 设备。 |
| cmd | 选择要执行的控制功能。 |
| arg | 表示执行请求的功能所需要的其他信息。 阿尔格 参数的类型是整数或指向特定于 BPF 的数据结构的指针,这取决于特定控制请求。 |
BPF 控制操作
除了 FIONREAD ioctl 命令外,以下命令还可以应用于任何打开的 BPF 设备。 阿尔格 参数是指向所指示类型的指针。
| ioctl 命令 | 阿尔格 参数的类型 | 描述 |
|---|---|---|
| BIOCGBLEN | u_int | 返回 BPF 设备上的读操作的缓冲区长度。 |
| 生物科学与生命科学 | u_int | 设置 BPF 设备上的读操作的缓冲区长度。 必须先设置 缓冲 参数,然后才能使用 比奥克塞蒂夫 命令将设备连接到接口。 如果无法容纳所请求的缓冲区大小,那么将在 阿尔格 参数中设置并返回最接近的允许大小。 |
| 生物化学与分子遗传学遗传性失神综合征 | u_int | 返回连接的接口下的数据链接层的类型。 |
| Biocpromisc | 不适用 | 将接口强制转换为混合方式。 将处理所有信息包,而不仅仅是那些以本地主机为目标的信息包。 由于多个设备可以在给定接口上进行侦听,因此以非承诺方式打开其接口的侦听器可以以承诺方式接收信息包。 可以使用相应的过滤器来解决此问题。 |
| BICOFLUSH | 不适用 | 清空入局包的缓冲区,并重置 BIOCGSTATS 命令所返回的统计信息。 |
| 比奥克蒂夫 | 斯特鲁特-伊弗赖克 | 返回设备正在进行侦听的硬件接口的名称。 该名称将在 伊弗赖克 结构的 ifr_name 字段中返回。 所有其他字段都未定义。 |
| 比奥克塞蒂夫 | 斯特鲁特-伊弗赖克 | 设置与设备关联的硬件接口。 必须先执行此命令,然后才能读取任何包包。 该设备由使用 伊弗赖克 结构的 ifr_name 字段的名称指示。 此外,该命令还执行 BICOFLUSH 命令的操作。 |
| BIOCOGRTIMEOUT | 结构时间 | 获取读取超时值。 阿尔格 参数指定在读请求超时之前要等待的时间长度。 此参数由打开操作初始化为零,表示没有超时。 |
| 生物识别超时 | 结构时间 | 设置 BIOCOGRTIMEOUT 命令中描述的读超时值。 |
| 生物统计学 | 结构体 bpf_stat | 返回包统计信息的结构。 此结构在 net/bpf.h 文件中定义。 |
| 生物即时 | u_int | 启用或禁用 立即 方式 (基于 阿尔格 参数的真值)。 当启用 立即 方式时,在接收包时立即读取返回。 否则,将阻塞读操作,直到内核缓冲区变满或发生超时为止。 |
| 生物安全 | 结构体 bpf_program | 设置内核使用的过滤器程序以废弃不感兴趣的包。 bpf_program 结构在 net/bpf.h 文件中定义。 |
| 生物转化 | 结构体 bpf_version | 返回当前由内核识别的过滤器语言的主要版本号和次要版本号。 在安装过滤器之前,应用程序必须检查当前版本是否与正在运行的内核兼容。 当前版本号由 net/bpf.h 文件中的 BPF_MAJOR_VERSION 和 BPF_MINOR_VERSION 变量提供。 不兼容的过滤器可能会导致未定义的行为。 |
返回值
成功完成后, ioctl 将返回值 0。 否则,它将返回值 -1 并设置 errno 以指示错误。
错误代码
在以下一般条件下, ioctl 命令失败:
| 项 | 描述 |
|---|---|
| EINVAL | 已指定无效的命令或参数。 |
| ENETDOWN | 底层接口或网络已关闭。 |
| ENXIO | 找不到底层的接口。 |
| ENOBUFS | 没有足够的内存可用于处理请求。 |
| EEXIST | BPF 设备已存在。 |
| ENODEV | 无法设置该 BPF 设备。 |
| EINTR | 在 ioctl 操作期间捕获到信号。 |
| EACCES | 对指定操作的许可权被拒绝。 |
| 电子邮件地址不可用 | 指定的地址对于接口不可用。 |
| ENOMEM | 可用的内存量不足。 |
| ESRCH | 这一过程并不存在。 |