Commit 5fc17de8 authored by Harald Welte's avatar Harald Welte Committed by David S. Miller

[NETFILTER]: Fix compilation of ip_nat_snmp_basic.c

Please sumbit before 2.6.8-final, this just moves some code in order to
make gcc happy.

Thanks!
Signed-off-by: default avatarAdrian Bunk <bunk@fs.tum.de>
Signed-off-by: default avatarHarald Welte <laforge@netfilter.org>
Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent b63d6baf
......@@ -862,6 +862,77 @@ static unsigned char snmp_request_decode(struct asn1_ctx *ctx,
return 1;
}
/*
* Fast checksum update for possibly oddly-aligned UDP byte, from the
* code example in the draft.
*/
static void fast_csum(unsigned char *csum,
const unsigned char *optr,
const unsigned char *nptr,
int odd)
{
long x, old, new;
x = csum[0] * 256 + csum[1];
x =~ x & 0xFFFF;
if (odd) old = optr[0] * 256;
else old = optr[0];
x -= old & 0xFFFF;
if (x <= 0) {
x--;
x &= 0xFFFF;
}
if (odd) new = nptr[0] * 256;
else new = nptr[0];
x += new & 0xFFFF;
if (x & 0x10000) {
x++;
x &= 0xFFFF;
}
x =~ x & 0xFFFF;
csum[0] = x / 256;
csum[1] = x & 0xFF;
}
/*
* Mangle IP address.
* - begin points to the start of the snmp messgae
* - addr points to the start of the address
*/
static inline void mangle_address(unsigned char *begin,
unsigned char *addr,
const struct oct1_map *map,
u_int16_t *check)
{
if (map->from == NOCT1(*addr)) {
u_int32_t old;
if (debug)
memcpy(&old, (unsigned char *)addr, sizeof(old));
*addr = map->to;
/* Update UDP checksum if being used */
if (*check) {
unsigned char odd = !((addr - begin) % 2);
fast_csum((unsigned char *)check,
&map->from, &map->to, odd);
}
if (debug)
printk(KERN_DEBUG "bsalg: mapped %u.%u.%u.%u to "
"%u.%u.%u.%u\n", NIPQUAD(old), NIPQUAD(*addr));
}
}
static unsigned char snmp_trap_decode(struct asn1_ctx *ctx,
struct snmp_v1_trap *trap,
const struct oct1_map *map,
......@@ -952,77 +1023,6 @@ static void hex_dump(unsigned char *buf, size_t len)
printk("\n");
}
/*
* Fast checksum update for possibly oddly-aligned UDP byte, from the
* code example in the draft.
*/
static void fast_csum(unsigned char *csum,
const unsigned char *optr,
const unsigned char *nptr,
int odd)
{
long x, old, new;
x = csum[0] * 256 + csum[1];
x =~ x & 0xFFFF;
if (odd) old = optr[0] * 256;
else old = optr[0];
x -= old & 0xFFFF;
if (x <= 0) {
x--;
x &= 0xFFFF;
}
if (odd) new = nptr[0] * 256;
else new = nptr[0];
x += new & 0xFFFF;
if (x & 0x10000) {
x++;
x &= 0xFFFF;
}
x =~ x & 0xFFFF;
csum[0] = x / 256;
csum[1] = x & 0xFF;
}
/*
* Mangle IP address.
* - begin points to the start of the snmp messgae
* - addr points to the start of the address
*/
static inline void mangle_address(unsigned char *begin,
unsigned char *addr,
const struct oct1_map *map,
u_int16_t *check)
{
if (map->from == NOCT1(*addr)) {
u_int32_t old;
if (debug)
memcpy(&old, (unsigned char *)addr, sizeof(old));
*addr = map->to;
/* Update UDP checksum if being used */
if (*check) {
unsigned char odd = !((addr - begin) % 2);
fast_csum((unsigned char *)check,
&map->from, &map->to, odd);
}
if (debug)
printk(KERN_DEBUG "bsalg: mapped %u.%u.%u.%u to "
"%u.%u.%u.%u\n", NIPQUAD(old), NIPQUAD(*addr));
}
}
/*
* Parse and mangle SNMP message according to mapping.
* (And this is the fucking 'basic' method).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment