我在linux内核中为传入的包编写了netfilter钩子函数。有没有办法从hook函数获取接收套接字信息。代码是

register() {
        hk.hook = hookfunction;
        hk.hooknum = NF_INET_PRE_ROUTING;
        hk.pf = PF_INET;
        hk.priority = NF_IP_PRI_LAST;
}

static unsigned int hookfunction (void *priv,struct sk_buff,const struct nf_hook_state *state) {
        if (skb->sk) {
                printk("%d", skb->sk->sk_mark);
        }
}

假设我在端口15000有一个打开的udp套接字,一个udp包到达端口15000。在上面编写的钩子函数中,我如何访问在15000端口打开的udp套接字的struct sock。使用上述代码,控件不会像skb->sk为空一样传递if(skb->sk)条件。你能给我推荐一种方法来得到插座的结构插座吗?或者我应该把挂钩放在其他位置,比如NF_INET_LOCAL_in,。我还对NF_INET_XX_XX和NF_IP_XX_XX之间的区别感到困惑。

最佳答案

内核在内部使用__inet_lookup_skb()从skb获取sk,skb首先调用skb_steal_sock()检查skb->sk是否为空,如果是这样,则调用__inet_lookup()查找sk。
但是,您可能需要稍微调整内核,因为__inet_lookup_skb符号没有导出,不能直接调用。
一些来自内核源的引用:
123
关于NF_INET_XX如果你说的是NF_IP_PRE_ROUTINGNF_INET_PRE_ROUTING我相信NF_IP_PRE_ROUTING在最近的内核中已经过时了,据我所知4.4已经用NF_INET_PRE_ROUTING取代了它。
希望能有所帮助。

关于android - 从Linux内核中的netfilter NF_INET_PRE_ROUTING Hook 函数接收套接字信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44146312/

10-10 20:06