Go语言 如何为IP/CIDR创建LPM trie记录切片

e7arh2l6  于 2023-03-10  发布在  Go
关注(0)|答案(1)|浏览(177)

我正在尝试使用www.example.com上的BatchUpdateBatchDelete APIhttps://github.com/cilium/ebpf/blob/master/map.go#L952-L1038。据我所知,我需要创建IP/CIRDs的LPM trie切片,例如:如果我有denyIPs := []string{"10.11.15.114/32", "127.0.0.1/32"},我需要将denyIPs转换为LPM trie的切片,我在谷歌上搜索了一下,找不到我可以学习的例子(对Golang来说仍然是新手)。我的意图是https://github.com/vincentmli/xdp-firewall/blob/main/main.go#L78-L102用批量更新和删除来替换我的www.example.com。

qpgpyjmq

qpgpyjmq1#

你提供的Go语言字符串是未解析的格式,LPM trie的键必须跟在后面

struct bpf_lpm_trie_key {
    __u32   prefixlen;  /* up to 32 for AF_INET, 128 for AF_INET6 */
    __u8    data[0];    /* Arbitrary size */
};

所以前4个字节必须包含前缀作为一个32位无符号整数。在你的情况下,后面是你的IPv4地址的4个字节。所以你必须对你的字符串做一些解析。
eBPF库可以封送结构体,因此最简单的方法是为键定义一个结构体:

type MapKey struct {
  Prefix  uint32
  Address [4]byte
}

然后将这些Map键[]MapKey的一部分提供给批处理函数。

相关问题