Можно ли составить список всех sk_buff, которые в настоящее время <LIVE>в системе? - PullRequest
0 голосов
/ 16 января 2012

Я намерен разработать приложение, которое отслеживает трафик на определенных портах.Для этого мне нужно перечислить все данные sk_buff всех LIVE 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 в системе.

EDIT

Я перепробовал все лучшие результаты поиска Google.Они дают очень хорошее описание самого sk_buff, но ни один из них не показывает, как делать то, что мне особенно интересно.

1 Ответ

1 голос
/ 16 января 2012

Нет стандартизированного способа. Вновь созданные skbs по умолчанию не помещаются ни в один список, который вы могли бы прочитать (то есть, когда они только что вышли из skb_alloc), поэтому нет никакого способа узнать, что все skbs активны из случайной кодовой точки в ядре , например, ваш модуль. У вас есть как минимум два варианта (оба влекут за собой изменение кода ядра ядра):

  1. Поскольку все skbuffs выделяются из пула kmem_cache, вы можете расширить функциональность kmem_cache с помощью некоторой функции, которая сообщает вам обо всех выделенных объектах.
  2. В функции __alloc_skb добавьте все вновь выделенные skbs в структуру данных по своему вкусу (и не забудьте удалить их снова, когда skb освобождается). Это будет серьезным узким местом, но это то, что вы должны заплатить.

Как обычно, вопрос: почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...