This patch fixes bugs related to machine endianess (harmless on little-endians, but causing that some of conntrack modules don't work on big-endian machines). Bugs fixed: * (debugging, not endianess related) compilation failure in destroy_expect() in ip_conntrack_core.c when debugging was enabled * (minor problem for now) fixed warning about format string used for conntrack->mark (which is unsigned long) - would be harmful on 64-bit big-endians * the real problem: the way that ip_conntrack_tuple structures were initialized was wrong - in compound literals port number was catched by the first dst.u union element, which is int64_t (so port was stored in 2 least significant bytes, i.e. 6 bytes after beginning of dst.u.tcp or dst.u.udp element). This fix uses C99 field specifiers. Aternative way to fix can be zeroing whole structure and then setting wanted fields in separate statements (like in ip_conntrack_pptp for example). Jakub Bogusz --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_standalone.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_standalone.c Mon May 19 15:58:25 2003 @@ -105,7 +105,7 @@ len += sprintf(buffer + len, "use=%u ", atomic_read(&conntrack->ct_general.use)); #if defined(CONFIG_IP_NF_CONNTRACK_MARK) - len += sprintf(buffer + len, "mark=%d ", conntrack->mark); + len += sprintf(buffer + len, "mark=%ld ", conntrack->mark); #endif len += sprintf(buffer + len, "\n"); --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_core.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_core.c Mon May 19 15:49:36 2003 @@ -211,8 +211,8 @@ static void destroy_expect(struct ip_conntrack_expect *exp) { - DEBUGP("destroy_expect(%p) use=%d\n", exp, atomic_read(exp->use)); - IP_NF_ASSERT(atomic_read(exp->use)); + DEBUGP("destroy_expect(%p) use=%d\n", exp, atomic_read(&exp->use)); + IP_NF_ASSERT(atomic_read(&exp->use)); IP_NF_ASSERT(!timer_pending(&exp->timeout)); kfree(exp); @@ -1446,8 +1446,8 @@ getorigdst(struct sock *sk, int optval, void *user, int *len) { struct ip_conntrack_tuple_hash *h; - struct ip_conntrack_tuple tuple = { { sk->rcv_saddr, { sk->sport } }, - { sk->daddr, { sk->dport }, + struct ip_conntrack_tuple tuple = { { sk->rcv_saddr, { .tcp = { sk->sport } } }, + { sk->daddr, { .tcp = { sk->dport } }, IPPROTO_TCP } }; /* We only do TCP at the moment: is there a better way? */ --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_ftp.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_ftp.c Mon May 19 15:50:54 2003 @@ -366,11 +366,11 @@ { 0 } }, { htonl((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3]), - { htons(array[4] << 8 | array[5]) }, + { .tcp = { htons(array[4] << 8 | array[5]) } }, IPPROTO_TCP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = NULL; --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_h323.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_h323.c Mon May 19 15:52:03 2003 @@ -108,11 +108,11 @@ { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, { data_ip, - { data_port }, + { .tcp = { data_port } }, IPPROTO_UDP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = NULL; @@ -237,11 +237,11 @@ { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, { data_ip, - { data_port }, + { .tcp = { data_port } }, IPPROTO_TCP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = h225_expect; --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_irc.c.orig Fri Nov 29 00:53:15 2002 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_irc.c Mon May 19 15:54:24 2003 @@ -209,11 +209,11 @@ exp->tuple = ((struct ip_conntrack_tuple) { { 0, { 0 } }, - { htonl(dcc_ip), { htons(dcc_port) }, + { htonl(dcc_ip), { .tcp = { htons(dcc_port) } }, IPPROTO_TCP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = NULL; --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_mms.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_mms.c Mon May 19 15:55:06 2003 @@ -238,12 +238,12 @@ exp->tuple = ((struct ip_conntrack_tuple) { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, { mms_ip, - { (__u16) ntohs(mms_port) }, + { .tcp = { (__u16) ntohs(mms_port) } }, mms_proto } } ); exp->mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = NULL; ip_conntrack_expect_related(ct, &expect); UNLOCK_BH(&ip_mms_lock); --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_quake3.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_quake3.c Mon May 19 15:57:27 2003 @@ -82,12 +82,12 @@ exp.tuple = ((struct ip_conntrack_tuple) { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, { (u_int32_t) *((u_int32_t *)((int)udph + i)), - { (__u16) *((__u16 *)((int)udph+i+4)) }, + { .udp = { (__u16) *((__u16 *)((int)udph+i+4)) } }, IPPROTO_UDP } } ); exp.mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .udp = { 0xFFFF } }, 0xFFFF }}); exp.expectfn = NULL; ip_conntrack_expect_related(ct, &exp); --- linux-2.4.20/net/ipv4/netfilter/ip_conntrack_talk.c.orig Fri May 16 10:17:39 2003 +++ linux-2.4.20/net/ipv4/netfilter/ip_conntrack_talk.c Mon May 19 16:00:41 2003 @@ -119,11 +119,11 @@ { { ct->tuplehash[dir].tuple.src.ip, { 0 } }, { ct->tuplehash[dir].tuple.dst.ip, - { htons(talk_port) }, + { .udp = { htons(talk_port) } }, IPPROTO_UDP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .udp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = talk_expectfn[talk_port - TALK_PORT]; @@ -148,11 +148,11 @@ { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, { addr->ta_addr, - { addr->ta_port }, + { .tcp = { addr->ta_port } }, IPPROTO_TCP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0xFFFFFFFF, { 0 } }, - { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); + { 0xFFFFFFFF, { .tcp = { 0xFFFF } }, 0xFFFF }}); exp->expectfn = NULL;