Ребят, кто с этой штукой баловался, подскажите, как она должна работать?
Я пишу модуль (rh9), функция-обработчик пакетов регистрируется на все пакеты вообще, проходящие через интерфейс: static int func (skb, dev, pt), кстати, а если не как static описать ее в модуле, то что это будет означать? Так вот, она получает skb, потом я тут же говорю - dev_kfree_skb_irq(skb) (пробовал и kfree_skb и dev_kfree_skb_any, но они skb->users не уменьшают, значит не очищают). Потом ретурн. Вопросы - должна ли эта кфри ставить skb в NULL? У меня почему-то не ставит, но skb->users после нее становится нулем (был единицей). После insmod оперативная память начинает убывать и убывает пока я его не rmmod'ну.
Где тут мемори лик может быть? Я уже достался его искать. Кстати, есть ли какие нибудь утилиты для того чтоб искать мемори лики на уровне ядра(в модулях)?
Причем лик нехилый, как будто я пакеты вообще не освобождаю. Да, он (модуль) садится сразу на 2 интерфейса, вобщем смотрите сами:#define MODULE
#define __KERNEL__#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>#include <linux/byteorder/generic.h>
#include <linux/netdevice.h>
#include <net/protocol.h>
#include <net/pkt_sched.h>
#include <net/tcp.h>
#include <net/ip.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/skbuff.h>
#include <linux/icmp.h>#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/file.h>
#include <asm/uaccess.h>char *extdev, *intdev;
MODULE_PARM(extdev, "s");
MODULE_PARM(intdev, "s");
struct net_device *ext_dev, *int_dev;struct packet_type int_proto, ext_proto;
static int ext_listen_func(struct sk_buff *skb, struct net_device *dv, struct packet_type *pt)
{
int received_pkt_len; // Total length of the received packet including Eth and Ip headersreceived_pkt_len = (skb->tail - skb->mac.raw);
printk ("elf: freeing skb (users = %i) (addr = %i)\n", skb->users, skb);
dev_kfree_skb_irq(skb);
if (skb->data == NULL) printk("elf: skb cleared!\n");
else {printk ("elf: skb not NULL! (users = %i) (addr = %i)\n", skb->users, skb->data);}return 0;
}int int_listen_func(struct sk_buff *skb, struct net_device *dv, struct packet_type *pt)
{
int received_pkt_len;
received_pkt_len = (skb->tail - skb->mac.raw);dev_kfree_skb_irq(skb);
if (skb == NULL) printk("ilf: skb cleared!\n");
else printk ("ilf: skb not NULL!\n");
return 0;
}int init_module()
{
ext_dev = dev_get_by_name(extdev);
if (!ext_dev) {
printk("Could not find device %s!\n", extdev);
printk("Using all known devices...");
}
else {
printk("External device %s, ifindex: %i\n", extdev, ext_dev->ifindex);
ext_proto.dev = ext_dev;
}
ext_proto.type = htons(ETH_P_ALL);
ext_proto.func = ext_listen_func;int_dev = dev_get_by_name(intdev);
if (!int_dev) {
printk("Could not find device %s!\n", intdev);
printk("Using all known devices...");
}
else {
printk("Internal device %s, ifindex: %i\n", intdev, int_dev->ifindex);
int_proto.dev = int_dev;
}
int_proto.type = htons(ETH_P_ALL);
int_proto.func = int_listen_func;
dev_add_pack(&int_proto);
dev_add_pack(&ext_proto);return(0);
}void cleanup_module()
{
dev_remove_pack(&int_proto);
dev_remove_pack(&ext_proto);printk("Module unloaded\n");
}
А может быть так, что printk засоряет оперативку?
Без него вроже ликов не видно, но хотелось бы знать наверняка