static void nf_ip_saveroute(const struct sk_buff *skb, struct nf_info *info)
{
	struct ip_rt_info *rt_info = nf_info_reroute(info);

	if (info->hook == NF_IP_LOCAL_OUT) {
		const struct iphdr *iph = skb->nh.iph;

		rt_info->tos = iph->tos;
		rt_info->daddr = iph->daddr;
		rt_info->saddr = iph->saddr;
	}
}
Example #2
0
static int nf_ip6_reroute(struct sk_buff **pskb, const struct nf_info *info)
{
	struct ip6_rt_info *rt_info = nf_info_reroute(info);

	if (info->hook == NF_IP6_LOCAL_OUT) {
		struct ipv6hdr *iph = (*pskb)->nh.ipv6h;
		if (!ipv6_addr_equal(&iph->daddr, &rt_info->daddr) ||
		    !ipv6_addr_equal(&iph->saddr, &rt_info->saddr))
			return ip6_route_me_harder(*pskb);
	}
	return 0;
}
Example #3
0
static int nf_ip_reroute(struct sk_buff *skb, const struct nf_info *info)
{
    const struct ip_rt_info *rt_info = nf_info_reroute(info);

    if (info->hook == NF_IP_LOCAL_OUT) {
        const struct iphdr *iph = ip_hdr(skb);

        if (!(iph->tos == rt_info->tos
                && iph->daddr == rt_info->daddr
                && iph->saddr == rt_info->saddr))
            return ip_route_me_harder(skb, RTN_UNSPEC);
    }
    return 0;
}