当前位置: 技术问答>linux和unix
弱弱地问文件包含的小问题
来源: 互联网 发布时间:2016-07-27
本文导语: 我在实现一个包过滤防火墙功能,接收来自终端的命令并解析,如果ip地址已在ip列表中存在就丢弃包.现在firewall.c已经能够生成.ko文件并insmod了.但是在interface.c中我想调用addip函数,gcc后提示我找不到该函数,我应该怎样布...
我在实现一个包过滤防火墙功能,接收来自终端的命令并解析,如果ip地址已在ip列表中存在就丢弃包.现在firewall.c已经能够生成.ko文件并insmod了.但是在interface.c中我想调用addip函数,gcc后提示我找不到该函数,我应该怎样布置这几个文件?是建立一个头文件再把函数都放到头文件里并在c文件包含进来吗?这对加载模块是不是有影响,因为hook函数也调用了函数。那么makefile又应该怎样写呢?小弟初学,望指教。。
//makefile
obj-m +=firewall.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
rm Module.symvers
//firewall.c
#include
#include
#include
#include
#include
#include
#include
#include
static unsigned int deny_ip[1000]; /* 被拒绝的IP列表 */
static int add_ip(unsigned int ip); /* 增加一个IP到列表 */
static int check_ip(struct sk_buff* sb); /* 检查IP的函数 */
/* 钩子函数 */
static 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*));
/* 用于注册的数据结构 */
static struct nf_hook_ops nfho;
static int add_ip(unsigned int ip)
{
printk("----------------------n");
int i;
for (i=0;i>8,(ip&0x00FF0000)>>16,(ip&0xFF000000)>>24);
return 1;
}
static int check_ip(struct sk_buff* sb)
{
if(!sb) return NF_ACCEPT;
if(!(sb->nh.iph)) return NF_ACCEPT;
int i;
for (i=0;inh.iph->saddr==deny_ip[i])
{
printk("Firewall: Dropped packet from IP: %d.%d.%d.%dn",
deny_ip[i]&0x000000FF,(deny_ip[i]&0x0000FF00)>>8,
(deny_ip[i]&0x00FF0000)>>16,(deny_ip[i]&0xFF000000)>>24);
return NF_DROP;
}
}
return NF_ACCEPT;
}
/* 注册的hook函数的实现 */
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;
/* 检查 ip */
if (check_ip(sb)==NF_DROP)
{
return NF_DROP;
}
return NF_ACCEPT;
}
int init_module()
{
/* 填充hook数据结构 */
nfho.hook=hook_func;
nfho.hooknum=NF_IP_PRE_ROUTING;
nfho.pf=PF_INET;
nfho.priority=NF_IP_PRI_FIRST;
nf_register_hook(&nfho); /* 注册 */
return 0;
}
void cleanup_module()
{
nf_unregister_hook(&nfho); /* 注消 */
}
//interface.c
#include
int main(int argc, char* argv[])
{
argv++;
if (!strcmp(*argv,"addip")) /* 增加一个IP到屏蔽列表*/
{
add_ip((unsigned int)inet_addr(*++argv));
return 1;
}
return 0;
}
//makefile
obj-m +=firewall.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
rm Module.symvers
|
问题在
typedef struct in_addr in_addr_t;
in_addr_t kernel_info;
不知道你的内核如何包含struct in_addr
因为你要传的是这个结构体,我也遇到困难了
所以一定要在内核里让typedef struct in_addr in_addr_t;正确
因为cmd约定头文件里都用的是#define IOTEST_ADDIP _IOW(IOCTLTEST_MAGIC,0,in_addr_t)
typedef struct in_addr in_addr_t;
in_addr_t kernel_info;
不知道你的内核如何包含struct in_addr
因为你要传的是这个结构体,我也遇到困难了
所以一定要在内核里让typedef struct in_addr in_addr_t;正确
因为cmd约定头文件里都用的是#define IOTEST_ADDIP _IOW(IOCTLTEST_MAGIC,0,in_addr_t)