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

Subversion Repositories or1k

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
#include <linux/types.h>
2
#include <linux/init.h>
3
#include <linux/netfilter.h>
4
#include <linux/ip.h>
5
#include <linux/icmp.h>
6
#include <linux/if.h>
7
 
8
#include <linux/netfilter_ipv4/ip_nat.h>
9
#include <linux/netfilter_ipv4/ip_nat_rule.h>
10
#include <linux/netfilter_ipv4/ip_nat_protocol.h>
11
 
12
static int
13
icmp_in_range(const struct ip_conntrack_tuple *tuple,
14
              enum ip_nat_manip_type maniptype,
15
              const union ip_conntrack_manip_proto *min,
16
              const union ip_conntrack_manip_proto *max)
17
{
18
        return (tuple->src.u.icmp.id >= min->icmp.id
19
                && tuple->src.u.icmp.id <= max->icmp.id);
20
}
21
 
22
static int
23
icmp_unique_tuple(struct ip_conntrack_tuple *tuple,
24
                  const struct ip_nat_range *range,
25
                  enum ip_nat_manip_type maniptype,
26
                  const struct ip_conntrack *conntrack)
27
{
28
        static u_int16_t id = 0;
29
        unsigned int range_size
30
                = (unsigned int)range->max.icmp.id - range->min.icmp.id + 1;
31
        unsigned int i;
32
 
33
        /* If no range specified... */
34
        if (!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED))
35
                range_size = 0xFFFF;
36
 
37
        for (i = 0; i < range_size; i++, id++) {
38
                tuple->src.u.icmp.id = range->min.icmp.id + (id % range_size);
39
                if (!ip_nat_used_tuple(tuple, conntrack))
40
                        return 1;
41
        }
42
        return 0;
43
}
44
 
45
static void
46
icmp_manip_pkt(struct iphdr *iph, size_t len,
47
               const struct ip_conntrack_manip *manip,
48
               enum ip_nat_manip_type maniptype)
49
{
50
        struct icmphdr *hdr = (struct icmphdr *)((u_int32_t *)iph + iph->ihl);
51
 
52
        hdr->checksum = ip_nat_cheat_check(hdr->un.echo.id ^ 0xFFFF,
53
                                           manip->u.icmp.id,
54
                                           hdr->checksum);
55
        hdr->un.echo.id = manip->u.icmp.id;
56
}
57
 
58
static unsigned int
59
icmp_print(char *buffer,
60
           const struct ip_conntrack_tuple *match,
61
           const struct ip_conntrack_tuple *mask)
62
{
63
        unsigned int len = 0;
64
 
65
        if (mask->src.u.icmp.id)
66
                len += sprintf(buffer + len, "id=%u ",
67
                               ntohs(match->src.u.icmp.id));
68
 
69
        if (mask->dst.u.icmp.type)
70
                len += sprintf(buffer + len, "type=%u ",
71
                               ntohs(match->dst.u.icmp.type));
72
 
73
        if (mask->dst.u.icmp.code)
74
                len += sprintf(buffer + len, "code=%u ",
75
                               ntohs(match->dst.u.icmp.code));
76
 
77
        return len;
78
}
79
 
80
static unsigned int
81
icmp_print_range(char *buffer, const struct ip_nat_range *range)
82
{
83
        if (range->min.icmp.id != 0 || range->max.icmp.id != 0xFFFF)
84
                return sprintf(buffer, "id %u-%u ",
85
                               ntohs(range->min.icmp.id),
86
                               ntohs(range->max.icmp.id));
87
        else return 0;
88
}
89
 
90
struct ip_nat_protocol ip_nat_protocol_icmp
91
= { { NULL, NULL }, "ICMP", IPPROTO_ICMP,
92
    icmp_manip_pkt,
93
    icmp_in_range,
94
    icmp_unique_tuple,
95
    icmp_print,
96
    icmp_print_range
97
};

powered by: WebSVN 2.1.0

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