On Wed, Apr 22, 2009 at 12:55 PM, Vishal Thanki <[email protected]> wrote:
> There should not be "st_mtdtor" in line 102, it should be "xt_mtdtor" (i
> think). Apart from there, I suggest you use proper typecast when you
> dereferenct void *. For example, in line 80, you should assign
> "par->matchinfo" to "info" with proper typecasting (of type struct
> xt_ipaddr_mtinfo *). Hope that helps.
It should work just fine without explicit typecasting here.
Assignment will take care of it.
Rest as Vishal suggested you should change the st_mtdtor to xtmtdtor.
Also make sure that all the header files needed are included as
incomplete type messages sometimes
are a result of not including proper header files.
Thanks,
--Pradeep
>
> Vishal
> Bartek Dolewski wrote:
>>
>> 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 */
>>
>>
>>
>
>
> --
> To unsubscribe from this list: send an email with
> "unsubscribe kernelnewbies" to [email protected]
> Please read the FAQ at http://kernelnewbies.org/FAQ
>
>
--
Pradeep
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ