Skip to content

AF_PACKET 套接字 ​

AF_PACKET 套接字的组件名称为 af_packet, 相关内核选项为

ini
# Networking support
# -> Networking options
# -> Packet socket
CONFIG_PACKET=y

# Networking support
# -> Networking options
# -> Packet: sockets monitoring interface
CONFIG_PACKET_DIAG=y

检查工具为

bash
#!/opt/sum/bin/bash

source ./kernel_config_utils.sh

af_packet_check() {
    is_error=false
    if ! kernel_config_check CONFIG_PACKET af_packet; then
        is_error=true
    fi
    if ! kernel_config_check CONFIG_PACKET_DIAG; then
        is_error=true
    fi
    if [ "$is_error" == "true" ]; then
        return 1
    fi

    return 0
}

AF_PACKET 类型套接字的 sockopt 在内核源码的 include/uapi/linux/if_packet.h 文件中定义. sockopt 相关函数为 packet_setsockopt 和 packet_getsockopt, 在 net/packet/af_packet.c 文件中实现. 引入的 Linux 版本和提交如下表所示:

sockopt版本提交号
PACKET_FANOUTv3.1dc99f600698dcac69b8f56dda9a8a00d645c5ffc
PACKET_FANOUT_DATAv4.347dceb8ecdc1c3ad1818dfea3d659a05b74c3fc2

对于 PACKET_FANOUT 选项, 不同的 fanout_type 引入的 Linux 版本和提交如下表所示:

fanout_type版本提交号
PACKET_FANOUT_HASHv3.1dc99f600698dcac69b8f56dda9a8a00d645c5ffc
PACKET_FANOUT_EBPFv4.3f2e520956a1ab636698f8160194c9b8ac0989aab

fanout_type 为 PACKET_FANOUT_EBPF 时挂载的是 BPF socket 程序.