【发布时间】:2020-01-14 19:31:56
【问题描述】:
我正在 MacOS 上编写一个网络内核扩展,它由一个套接字过滤器和一个 IP 过滤器组成。我的 IP 过滤器作为一种防火墙工作,我只想允许之前被套接字过滤器标记为允许的数据包通过。
在套接字过滤器sf_data_out_func 函数中,我成功标记了所有mbuf。但是在我的ipf_output_func 中,我似乎无法找到这些带有mbuf_tag_find() 的标记数据包。
我在套接字过滤器中标记数据包如下:
static errno_t socket_data_out(void *cookie, socket_t so, const struct sockaddr *to, mbuf_t *data, mbuf_t *control, sflt_data_flag_t flags)
{
if(!cookie)
return 0;
struct my_entry *entry = cookie;
errno_t ret;
int *tag_ref = NULL;
// Not used
int value = 1;
if((ret = mbuf_tag_allocate(*data, my_tag_id, ALLOWED_PACKET, sizeof(value), MBUF_WAITOK, (void**)&tag_ref)))
{
log("mbuf_tag_allocate failed");
}
return 0;
}
在IP过滤器中如下:
static errno_t ipfilter_output(void *cookie, mbuf_t *data, ipf_pktopts_t options)
{
errno_t status;
int *tag_ref;
size_t len;
int value = 1;
status = mbuf_tag_find(*data, my_tag_id, ALLOWED_PACKET, &len, (void**)&tag_ref);
if(status == 0)
log("Found an allowed packet!");
return 0;
}
但 IP 过滤器永远不会打印出“找到允许的数据包!”。
IP 过滤器能否找到先前在套接字过滤器中标记的数据包?
【问题讨论】:
标签: macos network-programming kernel kernel-extension darwin