c - 是否可以列出系统中当前 <LIVE> 的所有 sk_buff?

标签 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)buff 的。我只是简单地声明了一个 sk_buff 实例..就是这样.. 请帮助我在系统中实际捕获他们的实时 Sk_buff。

编辑

我已经尝试了所有顶级谷歌搜索结果。他们对 sk_buff 本身给出了很好的描述,但没有一个真正展示如何做我特别感兴趣的事情。

最佳答案

没有标准化的方法。默认情况下,新创建的 skb 不会放入任何您可以读取的列表中(也就是说,当它们刚从 skb_alloc 中出来时),因此,无法从随机的内核中的代码点,例如您的模块。不过,您至少有两个选择(都需要修改核心内核代码):

  1. 由于所有 skbuff 都是从 kmem_cache 池中分配的,您可以通过一些告诉您所有已分配对象的函数来增强 kmem_cache 的功能。
  2. 在 __alloc_skb 函数中,将所有新分配的 skb 添加到您喜欢的数据结构中(不要忘记在释放 skb 时再次删除它们)。这将成为主要瓶颈,但这是您必须付出的代价。

像往常一样,问题:为什么?

关于c - 是否可以列出系统中当前 <LIVE> 的所有 sk_buff?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883170/

相关文章:

c - 任何类型 vector 的中间

c - execvp() 不处理写入输出 >filename.log

linux - 每个命令都返回 'bash: <command>: command not found...'

virtio : how does it control the network speed/duplex? 中的 Linux ethtool

linux - EPOLLET 模式下的 Epoll 在从套接字读取之前返回 2 EPOLLIN

c - typedef 结构体用法

c - 试图清空链表

c - 编译内核模块源代码时如何包含标准头文件?

linux - Virtualenv:找不到工作命令

c# - 连接到 Redis 缓存服务器时出错