Merge git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-sched
[pandora-kernel.git] / net / ipv6 / netfilter.c
index 580b1ab..38b1496 100644 (file)
 
 int ip6_route_me_harder(struct sk_buff *skb)
 {
-       struct ipv6hdr *iph = skb->nh.ipv6h;
+       struct ipv6hdr *iph = ipv6_hdr(skb);
        struct dst_entry *dst;
        struct flowi fl = {
                .oif = skb->sk ? skb->sk->sk_bound_dev_if : 0,
+               .mark = skb->mark,
                .nl_u =
                { .ip6_u =
                  { .daddr = iph->daddr,
@@ -31,7 +32,7 @@ int ip6_route_me_harder(struct sk_buff *skb)
 #endif
 
        if (dst->error) {
-               IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES);
+               IP6_INC_STATS(ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
                LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n");
                dst_release(dst);
                return -EINVAL;
@@ -60,7 +61,7 @@ static void nf_ip6_saveroute(const struct sk_buff *skb, struct nf_info *info)
        struct ip6_rt_info *rt_info = nf_info_reroute(info);
 
        if (info->hook == NF_IP6_LOCAL_OUT) {
-               struct ipv6hdr *iph = skb->nh.ipv6h;
+               struct ipv6hdr *iph = ipv6_hdr(skb);
 
                rt_info->daddr = iph->daddr;
                rt_info->saddr = iph->saddr;
@@ -72,7 +73,7 @@ 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;
+               struct ipv6hdr *iph = ipv6_hdr(*pskb);
                if (!ipv6_addr_equal(&iph->daddr, &rt_info->daddr) ||
                    !ipv6_addr_equal(&iph->saddr, &rt_info->saddr))
                        return ip6_route_me_harder(*pskb);
@@ -80,18 +81,18 @@ static int nf_ip6_reroute(struct sk_buff **pskb, const struct nf_info *info)
        return 0;
 }
 
-unsigned int nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
+__sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
                             unsigned int dataoff, u_int8_t protocol)
 {
-       struct ipv6hdr *ip6h = skb->nh.ipv6h;
-       unsigned int csum = 0;
+       struct ipv6hdr *ip6h = ipv6_hdr(skb);
+       __sum16 csum = 0;
 
        switch (skb->ip_summed) {
        case CHECKSUM_COMPLETE:
                if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN)
                        break;
                if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
-                                    skb->len - dataoff, protocol,
+                                    skb->len - dataoff, protocol,
                                     csum_sub(skb->csum,
                                              skb_checksum(skb, 0,
                                                           dataoff, 0)))) {
@@ -100,12 +101,13 @@ unsigned int nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
                }
                /* fall through */
        case CHECKSUM_NONE:
-               skb->csum = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
+               skb->csum = ~csum_unfold(
+                               csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
                                             skb->len - dataoff,
                                             protocol,
                                             csum_sub(0,
                                                      skb_checksum(skb, 0,
-                                                                  dataoff, 0)));
+                                                                  dataoff, 0))));
                csum = __skb_checksum_complete(skb);
        }
        return csum;