===== net/ipv4/netfilter/ipt_REJECT.c 1.32 vs edited ===== --- 1.32/net/ipv4/netfilter/ipt_REJECT.c 2004-11-14 00:41:07 +11:00 +++ edited/net/ipv4/netfilter/ipt_REJECT.c 2004-11-23 19:35:22 +11:00 @@ -38,7 +38,8 @@ #define DEBUGP(format, args...) #endif -static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) +static inline struct rtable *route_reverse(struct sk_buff *skb, + struct tcphdr *tcph, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; @@ -56,6 +57,9 @@ if (hook == NF_IP_LOCAL_IN) fl.nl_u.ip4_u.saddr = iph->daddr; fl.nl_u.ip4_u.tos = RT_TOS(iph->tos); + fl.proto = IPPROTO_TCP; + fl.fl_ip_sport = tcph->dest; + fl.fl_ip_dport = tcph->source; if (ip_route_output_key(&rt, &fl) != 0) return NULL; @@ -110,7 +114,7 @@ return; /* FIXME: Check checksum --RR */ - if ((rt = route_reverse(oldskb, hook)) == NULL) + if ((rt = route_reverse(oldskb, oth, hook)) == NULL) return; hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); @@ -282,10 +286,23 @@ tos = (iph->tos & IPTOS_TOS_MASK) | IPTOS_PREC_INTERNETCONTROL; { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = skb_in->nh.iph->saddr, - .saddr = saddr, - .tos = RT_TOS(tos) } } }; + struct flowi fl = { + .nl_u = { + .ip4_u = { + .daddr = skb_in->nh.iph->saddr, + .saddr = saddr, + .tos = RT_TOS(tos) + } + }, + .proto = IPPROTO_ICMP, + .uli_u = { + .icmpt = { + .type = ICMP_DEST_UNREACH, + .code = code + } + } + }; + if (ip_route_output_key(&rt, &fl)) return; }