Hi there, I guess this is more "c programming trouble" than kernel code but maybe I`m wrong. I`ve started with Netfilter/Xtables stuff so I write below code using some resources. When I type "make" I can see these error messages: LD /media/ubuntu/home/bartek/Moduły/iptables/built-in.o CC [M] /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.o In file included from /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:1: /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.h:32: warning: ‘struct xt_mtdtor’ declared inside parameter list /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.h:32: warning: its scope is only this definition or declaration, which is probably not what you want /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:13: warning: initialization from incompatible pointer type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c: In function ‘ipaddr_mt’: /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:59: warning: too many arguments for format /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:61: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:62: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:62: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:68: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:69: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:69: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c: In function ‘ipaddr_mt_check’: /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:87: error: expected ‘)’ before ‘{’ token /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:98: error: expected expression before ‘}’ token /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c: At top level: /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:100: warning: ‘struct st_mtdtor’ declared inside parameter list /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:100: error: conflicting types for ‘ipaddr_mt_destroy’ /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.h:32: error: previous declaration of ‘ipaddr_mt_destroy’ washere /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c: In function ‘ipaddr_mt_destroy’: /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:102: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c: In function ‘ipaddr_mt6’: /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:119: warning: too many arguments for format /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:121: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:122: error: implicit declaration of function ‘ipv6_addr_cmp’ /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:122: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:122: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:128: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:129: error: dereferencing pointer to incomplete type /media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.c:129: error: dereferencing pointer to incomplete type make[2]: *** [/media/ubuntu/home/bartek/Moduły/iptables/xt_ipaddr.o] Error 1 make[1]: *** [_module_/media/ubuntu/home/bartek/Moduły/iptables] Error 2 make[1]: Leaving directory `/usr/src/linux-2.6.28-gentoo-r4' make: *** [all] Error 2 In my opinion everything is ok with code, i just can`t find any bugs. There is my source code /********* xt_ipaddr.c **********/ #include "xt_ipaddr.h" /*MODULE_LICENSE("GPL"); */ static struct xt_match ipaddr_mt4_reg = { .name = "ipaddr", .revision = 0, .family = NFPROTO_IPV4, .match = ipaddr_mt, .checkentry = ipaddr_mt_check, .destroy = ipaddr_mt_destroy, .matchsize = XT_ALIGN(sizeof(struct xt_ipaddr_mtinfo)), .me = THIS_MODULE, }; static struct xt_match ipaddr_mt6_reg = { .name = "ipaddr", .revision = 0, .family = NFPROTO_IPV6, .match = ipaddr_mt6, .matchsize = XT_ALIGN(sizeof(struct xt_ipaddr_mtinfo)), .me = THIS_MODULE, }; static int __init ipaddr_mt_init(void) { int ret; ret = xt_register_match(&ipaddr_mt4_reg); if(ret < 0) return ret; ret = xt_register_match(&ipaddr_mt6_reg); if(ret < 0) { xt_unregister_match(&ipaddr_mt4_reg); return ret; } return 0; } static void __exit ipaddr_mt_exit(void) { xt_unregister_match(&ipaddr_mt4_reg); } static bool ipaddr_mt(const struct sk_buff* skb, const struct xt_match_param* par) { const struct xt_ipadr_mtinfo* info = par->matchinfo; const struct iphdr* iph = ip_hdr(skb); printk(KERN_INFO "xt_ipaddr: IN=%s OUT=%s" "SRC=" NIPQUAD_FMT " DST=" NIPQUAD_FMT "\n", (par->in != NULL) ? par->in->name : "", (par->out != NULL) ? par->out->name : "", NIPQUAD(iph->saddr), NIPQUAD(iph->daddr), NIPQUAD(info->src), NIPQUAD(info->dst)); if(info->flags & XT_IPADDR_SRC) if( (iph->saddr != info->src.ip) ^ !!(info->flags & XT_IPADDR_SRC_INV) ) { printk(KERN_NOTICE "src IP - no match\n"); return false; } if(info->flags & XT_IPADDR_DST) if( (iph->daddr != info->dst.ip) ^ !!(info->flags & XT_IPADDR_DST_INV) ) { printk(KERN_NOTICE "dst IP - no match\n"); return false; } return true; } static bool ipaddr_mt_check(const struct xt_mtchk_param* par) { const struct xt_ipaddr_mtinfo* info = par->matchinfo; printk(KERN_INFO "xt_ipaddr: Added a rule with -m ipaddr in" "the %s table; this rule is reachable through" "hooks 0x%x\n", par->table, par->hook_mask); if( !(info->flags & (XT_IPADDR_SRC | XT_IPADDR_DST) ) { printk(KERN_INFO "xt_ipaddr: testing for nothing\n"); return false; } if(ntohl(info->src.ip) == 0xDEADBEEF) { printk(KERN_INFO "xt_ipaddr: I just thought I do not" "wanto to let you match on 222.173.190.239\n"); return false; } } static void ipaddr_mt_destroy(const struct st_mtdtor *par) { const struct xt_ipaddr_mtinfo *info = par->matchinfo; printk(KERN_INFO "Test for address %081X removed\n", info->src.ip); } /* here are routines for IPv6 */ static bool ipaddr_mt6(const struct sk_buff* skb, const struct xt_match_param* par) { const struct xt_ipadr_mtinfo *info = par->matchinfo; const struct ipv6hdr* iph = ipv6_hdr(skb); printk(KERN_INFO "xt_ipaddr: IN=%s OUT=%s" "SRC=" NIPQUAD_FMT " DST=" NIPQUAD_FMT "\n", (par->in != NULL) ? par->in->name : "", (par->out != NULL) ? par->out->name : "", NIPQUAD(iph->saddr), NIPQUAD(iph->daddr), NIPQUAD(info->src), NIPQUAD(info->dst)); if(info->flags & XT_IPADDR_SRC) if((ipv6_addr_cmp(&iph->saddr, &info->src.in6) != 0) ^ !!(info->flags & XT_IPADDR_SRC_INV) ) { printk(KERN_NOTICE "src IP - no match\n"); return false; } if(info->flags & XT_IPADDR_DST) if((ipv6_addr_cmp(&iph->daddr, &info->dst.in6) != 0) ^ !!(info->flags & XT_IPADDR_DST_INV) ) { printk(KERN_NOTICE "drc IP - no match\n"); return false; } return true; } module_init(ipaddr_mt_init); module_exit(ipaddr_mt_exit); /********** xt_ipaddr.h *************/ #ifndef _LINUX_NETFILTER_XT_IPADDR_H #define _LINUX_NETFILTER_XT_IPADDR_H #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/inet.h> #include <linux/ip.h> #include <linux/ipv6.h> #include <linux/netfilter/x_tables.h> #include <net/dsfield.h> #include <linux/skbuff.h> enum { XT_IPADDR_SRC = 1 << 0, XT_IPADDR_DST = 1 << 1, XT_IPADDR_SRC_INV = 1 << 2, XT_IPADDR_DST_INV = 1 << 3, }; struct xt_ipaddr_mtinfo { union nf_inet_addr src, dst; __u8 flags; }; /*declarations of functions */ static bool ipaddr_mt(const struct sk_buff* skb, const struct xt_match_param* par); static bool ipaddr_mt_check(const struct xt_mtchk_param* par); static void ipaddr_mt_destroy(const struct xt_mtdtor* par); /* IPv6 */ static bool ipaddr_mt6(const struct sk_buff* skb, const struct xt_match_param* par); #endif /* _LINUX_NETFILTER_XT_IPADDR_H */ -- -----BEGIN GEEK CODE BLOCK----- GCS d- s:- a--- C+++ P L+++>+++++ E---- W+ N+ o? K- w--- O- M- V? PS++ PE++ Y PGP++ t--- 5? X R tv-- b+ DI+ D- G++ e- h! !r(--) !z+ ------END GEEK CODE BLOCK------ -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ