Вот есть у меня модуль для фильтра пакетов ядра, называется 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
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум skb_header_pointer() всегда возвращает в big-endian? (2018)
- Форум Переслать полученный пакет (2012)
- Форум Не вызывается rx_handler в модуле ядра (2022)
- Форум Почему sk_buff равен NULL? (2009)
- Форум Утекает память. (2013)
- Форум Трабл с модулем (2005)
- Форум C++ и исключение abi::__forced_unwind (2017)
- Форум PCI driver (2020)
- Форум формат DNS пакета (2004)
- Форум FUSE Development (2012)