Вот есть у меня модуль для фильтра пакетов ядра, называется ipt_quota.c. В нём вот есть такое содержимое, (оно немного отличается от оригинала, я там немного подправлял):
/*
 * netfilter module to enforce network quotas
 *
 * Sam Johnston <samj@samj.net>
 */
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_quota.h>
MODULE_LICENSE("GPL");
static spinlock_t quota_lock = SPIN_LOCK_UNLOCKED;
static int
match(const struct sk_buff *skb,
      const struct net_device *in,
      const struct net_device *out,
      const void *matchinfo,
      int offset, const void *hdr, u_int16_t datalen, int *hotdrop)
{
        int totlen;
        int ret;
        struct ipt_quota_info *q = (struct ipt_quota_info *) matchinfo;
        spin_lock_bh("a_lock);
        totlen = ntohs(skb->nh.iph->tot_len);
        if (q->quota > totlen) {
                /* we can afford this one */
                q->quota -= totlen;
                spin_unlock_bh("a_lock);
#ifdef DEBUG_IPT_QUOTA
                printk("IPT Quota OK: %llu datlen %d \n", q->quota, datalen);
#endif
                return 1;
        }
//////////////////////////////////////////////////////////////////////
/////   if (q->quota > 0) {                                      /////
/////      Вот тут мне нужно добавить запуск внешней программы   /////    
/////   }                                                        /////
//////////////////////////////////////////////////////////////////////
        /* so we do not allow even small packets from now on */
        q->quota = 0;
#ifdef DEBUG_IPT_QUOTA
        printk("IPT Quota Failed: %llu datlen %d \n", q->quota, datalen);
#endif
        spin_unlock_bh("a_lock);
        return 0;
}
static int
checkentry(const char *tablename,
           const struct ipt_ip *ip,
           void *matchinfo, unsigned int matchsize, unsigned int hook_mask)
{
        /* TODO: spinlocks? sanity checks? */
        if (matchsize != IPT_ALIGN(sizeof (struct ipt_quota_info)))
                return 0;
        return 1;
}
static struct ipt_match quota_match
    = { {NULL, NULL}, "quota", &match, &checkentry, NULL, THIS_MODULE };
static int __init
init(void)
{
        return ipt_register_match("a_match);
}
static void __exit
fini(void)
{
        ipt_unregister_match("a_match);
}
module_init(init);
module_exit(fini);
Вот в выделенном мной месте (выделял я слэшами) нужно как-то добавить запуск другой программы, прям здесь можно путь к ней задать и имя её. Я уже две недели промучился, никак не получается, из за того что это модуль, ни fork, ни exec не работает. Помогите, не поленитесь плиз.



    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум Переслать полученный пакет (2012)
 - Форум Перехват системных вызовов в модуле ядра [Ubuntu] (2018)
 - Форум Почему sk_buff равен NULL? (2009)
 - Форум skb_header_pointer() всегда возвращает в big-endian? (2018)
 - Форум sk_buff Данные из пакета (2013)
 
- Форум Код ядра (сетевая подсистема) (2005)
 - Форум Не вызывается rx_handler в модуле ядра (2022)
 - Форум Не работает модуль ядра для обработки прерывания (2011)
 - Форум PCI driver (2020)
 - Форум Не могу собрать старый модуль ядра. (2010)