The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"skbuff"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"skbuff"
Сообщение от Cadaver Искать по авторуВ закладки(??) on 15-Сен-04, 18:51  (MSK)
Ребят, кто с этой штукой баловался, подскажите, как она должна работать?
Я пишу модуль (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 headers

  received_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");
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

  • skbuff, Cadaver, 12:59 , 16-Сен-04, (1)

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "skbuff"
Сообщение от Cadaver Искать по авторуВ закладки(??) on 16-Сен-04, 12:59  (MSK)
А может быть так, что printk засоряет оперативку?
Без него вроже ликов не видно, но хотелось бы знать наверняка
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру