--- /dev/null
+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 <qboosh@pld.org.pl>
+
+--- 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;
+