OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [ipv4/] [netfilter/] [arpt_mangle.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* module that allows mangling of the arp payload */
2
#include <linux/module.h>
3
#include <linux/netfilter_arp/arpt_mangle.h>
4
#include <net/sock.h>
5
 
6
static unsigned int
7
target(struct sk_buff **pskb, unsigned int hooknum, const struct net_device *in,
8
   const struct net_device *out, const void *targinfo, void *userinfo)
9
{
10
        const struct arpt_mangle *mangle = targinfo;
11
        struct arphdr *arp;
12
        unsigned char *arpptr;
13
        int pln, hln;
14
 
15
        if (skb_shared(*pskb) || skb_cloned(*pskb)) {
16
                struct sk_buff *nskb;
17
 
18
                nskb = skb_copy(*pskb, GFP_ATOMIC);
19
                if (!nskb)
20
                        return NF_DROP;
21
                if ((*pskb)->sk)
22
                        skb_set_owner_w(nskb, (*pskb)->sk);
23
                kfree_skb(*pskb);
24
                *pskb = nskb;
25
        }
26
 
27
        arp = (*pskb)->nh.arph;
28
        arpptr = (*pskb)->nh.raw + sizeof(*arp);
29
        pln = arp->ar_pln;
30
        hln = arp->ar_hln;
31
        /* We assume that hln was checked in the match */
32
        if (mangle->flags & ARPT_MANGLE_SDEV) {
33
                if (ARPT_DEV_ADDR_LEN_MAX < hln ||
34
                   (arpptr + hln > (**pskb).tail))
35
                        return NF_DROP;
36
                memcpy(arpptr, mangle->src_devaddr, hln);
37
        }
38
        arpptr += hln;
39
        if (mangle->flags & ARPT_MANGLE_SIP) {
40
                if (ARPT_MANGLE_ADDR_LEN_MAX < pln ||
41
                   (arpptr + pln > (**pskb).tail))
42
                        return NF_DROP;
43
                memcpy(arpptr, &mangle->u_s.src_ip, pln);
44
        }
45
        arpptr += pln;
46
        if (mangle->flags & ARPT_MANGLE_TDEV) {
47
                if (ARPT_DEV_ADDR_LEN_MAX < hln ||
48
                   (arpptr + hln > (**pskb).tail))
49
                        return NF_DROP;
50
                memcpy(arpptr, mangle->tgt_devaddr, hln);
51
        }
52
        arpptr += hln;
53
        if (mangle->flags & ARPT_MANGLE_TIP) {
54
                if (ARPT_MANGLE_ADDR_LEN_MAX < pln ||
55
                   (arpptr + pln > (**pskb).tail))
56
                        return NF_DROP;
57
                memcpy(arpptr, &mangle->u_t.tgt_ip, pln);
58
        }
59
        return mangle->target;
60
}
61
 
62
static int
63
checkentry(const char *tablename, const struct arpt_entry *e, void *targinfo,
64
   unsigned int targinfosize, unsigned int hook_mask)
65
{
66
        const struct arpt_mangle *mangle = targinfo;
67
 
68
        if (mangle->flags & ~ARPT_MANGLE_MASK ||
69
            !(mangle->flags & ARPT_MANGLE_MASK))
70
                return 0;
71
 
72
        if (mangle->target != NF_DROP && mangle->target != NF_ACCEPT &&
73
           mangle->target != ARPT_CONTINUE)
74
                return 0;
75
        return 1;
76
}
77
 
78
static struct arpt_target arpt_mangle_reg
79
= {
80
        .name           = "mangle",
81
        .target         = target,
82
        .checkentry     = checkentry,
83
        .me             = THIS_MODULE,
84
};
85
 
86
static int __init init(void)
87
{
88
        if (arpt_register_target(&arpt_mangle_reg))
89
                return -EINVAL;
90
 
91
        return 0;
92
}
93
 
94
static void __exit fini(void)
95
{
96
        arpt_unregister_target(&arpt_mangle_reg);
97
}
98
 
99
module_init(init);
100
module_exit(fini);
101
MODULE_LICENSE("GPL");

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.