- 论坛徽章:
- 0
|
Hi,all.我使用的是内核版本3.4,我想跟踪内核中 netfilter 里面对于return NF_QUEUE的包的处理。查看了资料后,发现内核是将 NF_QUEUE的包通过 netlink 与用户态通信将数据包发送到用户空间。我理解的是,这中间总会存在一个 queue用来存储数据包,然后我想定位到这个queue 怎么被操作使用的。
在跟踪内核实现后,大概的流程是:NF_HOOK -> nf_hook_slow(在这里面判断 verdict变量,如果是 NF_QUEUE,就调用nf_queue) -> nf_queue(里面会回调到 nfqnl_enqueue_packet) -> nfqnl_enqueue_packet -> __nfqnl_enqueue_packet -> nfnetlink_unicast(这个时候是要把包发送到用户态,我继续跟踪进去) -> netlink_unicast -> netlink_sendskb -> __netlink_sendskb.
代码到了 __netlink_sendskb 后,里面的代码是:
- static int __netlink_sendskb(struct sock *sk, struct sk_buff *skb)
- {
- int len = skb->len;
- skb_queue_tail(&sk->sk_receive_queue, skb);
- sk->sk_data_ready(sk, len);
- return len;
- }
复制代码 在这里是有将 skb 插入 sk的receive_queue 里面的。但后面调用了 sk_data_ready 来处理这个 queue,但是我跟到这里的时候断掉了。找不到 sk_data_ready的实现。我查找跟 netlink 有关的 code,在 netlink_kernel_create里面有:
- sk->sk_data_ready = netlink_data_ready;
- if (input)
- nlk_sk(sk)->netlink_rcv = input;
复制代码 但是呢,netlink_data_ready 实现是空的:- static void netlink_data_ready(struct sock *sk, int len)
- {
- BUG();
- }
复制代码 所以我就不知道如何继续往下分析了,另外一条思路是 netlink_kernel_create 的input的参数 是否会跟这个有关系呢? 就是:- if (input)
- nlk_sk(sk)->netlink_rcv = input;
复制代码 有哪位了解这块的,可以给点思路吗? |
|