[NETFILTER] ctnetlink: Fix NAT info setting. ip_nat_initialized() takes enum ip_nat_manip_type as it's second argument, not a hook number. The current code was not only ugly, but also broken as IP_NAT_MANIP_SRC != NF_IP_POST_ROUTING. Signed-off-by: Marcus Sundberg --- linux-2.6.15-rc4/net/ipv4/netfilter/ip_conntrack_netlink.c 2005/12/01 12:25:50 1.1 +++ linux/net/ipv4/netfilter/ip_conntrack_netlink.c 2005/12/01 12:25:54 @@ -855,6 +855,7 @@ ctnetlink_change_status(struct ip_conntr return -EINVAL; #else unsigned int hooknum; + enum ip_nat_manip_type manip; struct ip_nat_range range; if (ctnetlink_parse_nat(cda, ct, &range) < 0) @@ -867,17 +868,19 @@ ctnetlink_change_status(struct ip_conntr /* This is tricky but it works. ip_nat_setup_info needs the * hook number as parameter, so let's do the correct * conversion and run away */ - if (status & IPS_SRC_NAT_DONE) - hooknum = NF_IP_POST_ROUTING; /* IP_NAT_MANIP_SRC */ - else if (status & IPS_DST_NAT_DONE) - hooknum = NF_IP_PRE_ROUTING; /* IP_NAT_MANIP_DST */ - else + if (status & IPS_SRC_NAT_DONE) { + hooknum = NF_IP_POST_ROUTING; + manip = IP_NAT_MANIP_SRC; + } else if (status & IPS_DST_NAT_DONE) { + hooknum = NF_IP_PRE_ROUTING; + manip = IP_NAT_MANIP_DST; + } else return -EINVAL; /* Missing NAT flags */ DEBUGP("NAT status: %lu\n", status & (IPS_NAT_MASK | IPS_NAT_DONE_MASK)); - if (ip_nat_initialized(ct, hooknum)) + if (ip_nat_initialized(ct, manip)) return -EEXIST; ip_nat_setup_info(ct, &range, hooknum);