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 ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to