2012-04-05 4 views
3

Я пытаюсь изменить исходный IP-адрес всех пакетов, выходящих из машины, на то, что я указываю в этом модуле ядра, но каждый раз, когда я пытаюсь получить доступ nh.iph-> saddr Я получаю сообщение об ошибке compile время, которое говорит Struct sk_buff не имеет имени nh
Что я здесь делаю неправильно? Я пропустил какой-то заголовок или что-то?Как связаться с struct sk_buff?

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/init.h>   

#include <linux/netfilter.h> 
#include <linux/netfilter_ipv4.h> 

#include <linux/skbuff.h> 
#include <linux/ip.h>     /* For IP header */ 

#include <linux/inet.h> /* For in_aton(); htonl(); and other related Network utility functions */ 


static struct nf_hook_ops nfho; 


unsigned int hook_func(unsigned int hooknum, 
         struct sk_buff **skb, 
         const struct net_device *in, 
         const struct net_device *out, 
         int (*okfn)(struct sk_buff *)) 
{ 
    struct sk_buff *sb = *skb; 
    struct in_addr masterIP; 

    masterIP.s_addr = htonl (in_aton("192.168.1.10")); 
    sb->nh.iph->saddr = masterIP.s_addr; 
    return NF_ACCEPT; 
} 

Обратите внимание, что я бегу Ubuntu 10.04 LTS 64 бита
ядра 2.6.32-33

ответ

13

в ядре версии struct sk_buff изменилось. У этого больше нет этих членов. Чтобы получить доступ к IP-заголовок, вы должны попробовать:

#include <linux/ip.h> 

struct iphdr* iph = ip_hdr(skb); 

Тогда просто использовать переменную iph для изменения адреса, что-то вроде:

iph->saddr = .... 
iph->daddr = .... 

Кроме того, не забывайте, что вам, возможно, придется пересчитывать ip и возможные контрольные суммы транспортных пакетов.

+0

Спасибо большое = D разрешено ^^ EDIT: контрольная сумма IP, хорошо ... Но почему контрольные суммы транспортного пакета тоже? – Fingolfin

+2

Например, контрольная сумма UDP учитывает так называемый '' ip pseudo header'', что означает, что контрольная сумма UDP использует некоторые поля заголовка IP, такие как исходный и целевой адреса. Я не совсем помню, но я думаю, что TCP также это делает. – Fred

-1

Вы можете найти определение struck sk_buff в 'include/linux/skbuff.h'.

В нем нет поля nh, которое объясняет ошибки компиляции, которые вы видите. У этого есть поле 'network_header', которое, вероятно, является тем, что вы ищете.

Смежные вопросы