Мне необходимо перехватить udp-трафик и немного его модифицировать. Я это делаю с помощью модуля ядра. Проблема в том, что необходимо это сделать без пересобирания ядра, а в том, что есть, похоже отключен netfilter (я так решил, т.к. при попытке подгрузить модуль, использующий nf_register_hook, пишет «Unknown symbol nf_register_hook»).
Вот так я подменяю стандартный обработчик:
#include "linux/module.h"
#include "net/udp.h"
int (*orginalRecv)(struct kiocb*, struct sock*, struct msghdr*, size_t, int, int, int*);
int moniter_recv_udp(struct kiocb* iocb, struct sock* sk, struct msghdr*msg, size_t len, int noblock, int flags, int* addr_len)
{
//тут надо что-то придумать
return orginalRecv( iocb, sk, msg, len, noblock, flags, addr_len );
}
int init_module()
{
orginalRecv = udp_prot.recvmsg;
udp_prot.recvmsg = moniter_recv_udp;
return 0;
}
void cleanup_module()
{
udp_prot.recvmsg = orginalRecv;
}
Но никак не пойму, где там живет принимаемый буфер и как с ним работать. Вроде бы в sk->sk_receive_queue, т.е. вот так делаю и весь трафик блокируется:
int moniter_recv_udp(struct kiocb* iocb, struct sock* sk, struct msghdr*msg, size_t len, int noblock, int flags, int* addr_len)
{
int ret = orginalRecv( iocb, sk, msg, len, noblock, flags, addr_len );
sk->sk_receive_queue.next = sk->sk_receive_queue.prev = (struct sk_buff*)(&sk->sk_receive_queue);
sk->sk_receive_queue.qlen = 0;
return ret;
}
Может, подскажет кто?