微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更新套接字映射失败

如何解决更新套接字映射失败

我正在做 BPF 编程,我想在套接字映射中添加一个套接字。代码如下

当它检测到监听/连接时,将套接添加套接字映射中

__section("sockops")
int bpf_sockmap(struct bpf_sock_ops *skops)
{
    switch (skops->op) {
        case BPF_SOCK_OPS_TCP_LISTEN_CB:
            if (skops->family == 2) {
                bpf_sock_ops_ipv4(skops);
            }
            break;
        case BPF_SOCK_OPS_TCP_CONNECT_CB:
            if (skops->family == 2) {
                bpf_sock_ops_ipv4(skops);
            }
            break;
        default:
            break;
    }
    return 0;
}

bpf_sock_ops_ipv4()

void bpf_sock_ops_ipv4(struct bpf_sock_ops *skops)
{
    struct sock_key key = {};
    int ret;

    extract_key4_from_ops(skops,&key); // extract some field from skops to form the key structure

    ret = sock_hash_update(skops,&sock_ops_map,&key,BPF_ANY);
    if (ret != 0) {
        printk("sock_hash_update() Failed,ret: %d\n",ret);
    }

    printk("sockmap: op %d,port %d --> %d\n",skops->op,skops->local_port,bpf_ntohl(skops->remote_port));
}

地图结构

struct bpf_map_def __section("maps") sock_ops_map = {
    .type           = BPF_MAP_TYPE_SOCKHASH,.key_size       = sizeof(struct sock_key),.value_size     = sizeof(int),.max_entries    = 65535,.map_flags      = 0,};

密钥结构

struct sock_key {
    __u32 ops;
    __u32 sip4;
    __u32 dip4;
    __u8  family;
    __u8  pad1;
    __u16 pad2;
    __u32 pad3;
    __u32 sport;
    __u32 dport;
} __attribute__((packed));

当我加载它并使用 sudo socat TCP4-LISTEN:1001,fork exec:cat 初始化服务器时,更新失败

sudo cat /sys/kernel/debug/tracing/trace_pipe 
           socat-1239  [002] ....  2020.217663: 0: sock_hash_update() Failed,ret: -95
           socat-1239  [002] ....  2020.217682: 0: sockmap: op 11,port 1001 --> 0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。