是否可以列出系统中当前<live>的所有sk_buff?</live>

时间:2012-01-16 16:37:53

标签: c linux networking

我打算开发一个监控特定端口流量的应用程序。为此,我需要列出系统中所有LIVE sk_buff的所有sk_buff数据。怎么做?

我编写了以下代码(基本上是一个内核模块。)

include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */
#include </usr/src/linux-headers-2.6.38-8-generic/include/linux/skbuff.h>

int init_module(void)
{
    struct sk_buff *skb;


    printk(KERN_INFO "SKB 1.\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Done 1.\n");
}

但我不知道我是如何抓住 sk)的。我只是声明了一个sk_buff实例..这就是全部.. 请帮我实际抓住他们在系统中的实时Sk_buff。

修改

我已经尝试了所有顶级谷歌搜索结果。他们给出了sk_buff本身的非常好的描述,但它们都没有显示出如何做我特别感兴趣的事情。

1 个答案:

答案 0 :(得分:1)

没有标准化的方法。默认情况下,新创建的skbs不会被放入任何列表中(即,当它们从skb_alloc中重新出现时),因此,无法通过随机代码点知道所有skb是否处于活动状态。内核,比如你的模块。您至少有两个选项(都需要修改核心内核代码):

  1. 由于所有skbuff都是从kmem_cache池中分配的,因此您可以通过一些告诉您所有已分配对象的函数来扩充kmem_cache功能。
  2. 在__alloc_skb函数中,将所有新分配的skb添加到您喜欢的数据结构中(并且在释放skb时不要忘记再次删除它们)。这将是一个主要的瓶颈,但这就是你必须付出的代价。
  3. 像往常一样,问题是:为什么?