From 280a827acc9c4cacc40d9cfe3828b6c89ac5e62b Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 2 Oct 2003 09:39:47 -0700 Subject: [PATCH] [NETFILTER]: Fix SO_ORIGINAL_DST, broken by earlier endianness fixes. --- include/linux/netfilter_ipv4/ip_conntrack_tuple.h | 8 ++++++++ net/ipv4/netfilter/ip_conntrack_core.c | 13 ++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/linux/netfilter_ipv4/ip_conntrack_tuple.h b/include/linux/netfilter_ipv4/ip_conntrack_tuple.h index 9f6ec0a6bccc1..1e7691189c67c 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_tuple.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_tuple.h @@ -62,6 +62,14 @@ struct ip_conntrack_tuple } dst; }; +/* This is optimized opposed to a memset of the whole structure. Everything we + * really care about is the source/destination unions */ +#define IP_CT_TUPLE_U_BLANK(tuple) \ + do { \ + (tuple)->src.u.all = 0; \ + (tuple)->dst.u.all = 0; \ + } while (0) + enum ip_conntrack_dir { IP_CT_DIR_ORIGINAL, diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c index 02630aedef4e7..1b187101db4d7 100644 --- a/net/ipv4/netfilter/ip_conntrack_core.c +++ b/net/ipv4/netfilter/ip_conntrack_core.c @@ -1279,11 +1279,14 @@ getorigdst(struct sock *sk, int optval, void *user, int *len) { struct inet_opt *inet = inet_sk(sk); struct ip_conntrack_tuple_hash *h; - struct ip_conntrack_tuple tuple = { { inet->rcv_saddr, - { .tcp = { inet->sport } } }, - { inet->daddr, - { .tcp = { inet->dport } }, - IPPROTO_TCP } }; + struct ip_conntrack_tuple tuple; + + IP_CT_TUPLE_U_BLANK(&tuple); + tuple.src.ip = inet->rcv_saddr; + tuple.src.u.tcp.port = inet->sport; + tuple.dst.ip = inet->daddr; + tuple.dst.u.tcp.port = inet->dport; + tuple.dst.protonum = IPPROTO_TCP; /* We only do TCP at the moment: is there a better way? */ if (strcmp(sk->sk_prot->name, "TCP")) { -- 2.53.0