我正在尝试将从机器输出的所有数据包的源IP修改为我在此内核模块中指定的内容,但每次我尝试访问 nh.iph-> saddr 时,我得到一个编译时间错误,表示 Struct sk_buff没有名为nh的成员
我在这做错了什么?
我错过了一些标题还是什么?
#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
答案 0 :(得分:13)
在您的内核版本中,struct sk_buff
已更改。它不再拥有这些成员。要访问ip标头,您应该尝试:
#include <linux/ip.h>
struct iphdr* iph = ip_hdr(skb);
然后只需使用iph
变量来更改地址,例如:
iph->saddr = ....
iph->daddr = ....
此外,请不要忘记您可能需要重新计算ip
和可能的传输数据包校验和。
答案 1 :(得分:-1)
你可以在'include / linux / skbuff.h'中找到struck sk_buff的定义。
它没有nh字段,这解释了您看到的编译错误。它有一个'network_header'字段,这可能就是你要找的东西。