inet: constify ip headers and in6_addr
[deliverable/linux.git] / net / ipv6 / xfrm6_policy.c
index da87428681cccc9d955fdc80ee6f8bd4998356dd..d879f7efbd10b676be5887ab6460cfb8bee881d9 100644 (file)
 static struct xfrm_policy_afinfo xfrm6_policy_afinfo;
 
 static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos,
-                                         xfrm_address_t *saddr,
-                                         xfrm_address_t *daddr)
+                                         const xfrm_address_t *saddr,
+                                         const xfrm_address_t *daddr)
 {
-       struct flowi fl = {};
+       struct flowi6 fl6;
        struct dst_entry *dst;
        int err;
 
-       memcpy(&fl.fl6_dst, daddr, sizeof(fl.fl6_dst));
+       memset(&fl6, 0, sizeof(fl6));
+       memcpy(&fl6.daddr, daddr, sizeof(fl6.daddr));
        if (saddr)
-               memcpy(&fl.fl6_src, saddr, sizeof(fl.fl6_src));
+               memcpy(&fl6.saddr, saddr, sizeof(fl6.saddr));
 
-       dst = ip6_route_output(net, NULL, &fl);
+       dst = ip6_route_output(net, NULL, &fl6);
 
        err = dst->error;
        if (dst->error) {
@@ -67,7 +68,7 @@ static int xfrm6_get_saddr(struct net *net,
        return 0;
 }
 
-static int xfrm6_get_tos(struct flowi *fl)
+static int xfrm6_get_tos(const struct flowi *fl)
 {
        return 0;
 }
@@ -87,7 +88,7 @@ static int xfrm6_init_path(struct xfrm_dst *path, struct dst_entry *dst,
 }
 
 static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
-                         struct flowi *fl)
+                         const struct flowi *fl)
 {
        struct rt6_info *rt = (struct rt6_info*)xdst->route;
 
@@ -120,18 +121,19 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
 static inline void
 _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
 {
+       struct flowi6 *fl6 = &fl->u.ip6;
        int onlyproto = 0;
        u16 offset = skb_network_header_len(skb);
-       struct ipv6hdr *hdr = ipv6_hdr(skb);
+       const struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct ipv6_opt_hdr *exthdr;
        const unsigned char *nh = skb_network_header(skb);
        u8 nexthdr = nh[IP6CB(skb)->nhoff];
 
-       memset(fl, 0, sizeof(struct flowi));
-       fl->mark = skb->mark;
+       memset(fl6, 0, sizeof(struct flowi6));
+       fl6->flowi6_mark = skb->mark;
 
-       ipv6_addr_copy(&fl->fl6_dst, reverse ? &hdr->saddr : &hdr->daddr);
-       ipv6_addr_copy(&fl->fl6_src, reverse ? &hdr->daddr : &hdr->saddr);
+       ipv6_addr_copy(&fl6->daddr, reverse ? &hdr->saddr : &hdr->daddr);
+       ipv6_addr_copy(&fl6->saddr, reverse ? &hdr->daddr : &hdr->saddr);
 
        while (nh + offset + 1 < skb->data ||
               pskb_may_pull(skb, nh + offset + 1 - skb->data)) {
@@ -158,20 +160,20 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
                             pskb_may_pull(skb, nh + offset + 4 - skb->data))) {
                                __be16 *ports = (__be16 *)exthdr;
 
-                               fl->fl_ip_sport = ports[!!reverse];
-                               fl->fl_ip_dport = ports[!reverse];
+                               fl6->fl6_sport = ports[!!reverse];
+                               fl6->fl6_dport = ports[!reverse];
                        }
-                       fl->proto = nexthdr;
+                       fl6->flowi6_proto = nexthdr;
                        return;
 
                case IPPROTO_ICMPV6:
                        if (!onlyproto && pskb_may_pull(skb, nh + offset + 2 - skb->data)) {
                                u8 *icmp = (u8 *)exthdr;
 
-                               fl->fl_icmp_type = icmp[0];
-                               fl->fl_icmp_code = icmp[1];
+                               fl6->fl6_icmp_type = icmp[0];
+                               fl6->fl6_icmp_code = icmp[1];
                        }
-                       fl->proto = nexthdr;
+                       fl6->flowi6_proto = nexthdr;
                        return;
 
 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
@@ -180,9 +182,9 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
                                struct ip6_mh *mh;
                                mh = (struct ip6_mh *)exthdr;
 
-                               fl->fl_mh_type = mh->ip6mh_type;
+                               fl6->fl6_mh_type = mh->ip6mh_type;
                        }
-                       fl->proto = nexthdr;
+                       fl6->flowi6_proto = nexthdr;
                        return;
 #endif
 
@@ -191,8 +193,8 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
                case IPPROTO_ESP:
                case IPPROTO_COMP:
                default:
-                       fl->fl_ipsec_spi = 0;
-                       fl->proto = nexthdr;
+                       fl6->fl6_ipsec_spi = 0;
+                       fl6->flowi6_proto = nexthdr;
                        return;
                }
        }
@@ -220,6 +222,7 @@ static void xfrm6_dst_destroy(struct dst_entry *dst)
 
        if (likely(xdst->u.rt6.rt6i_idev))
                in6_dev_put(xdst->u.rt6.rt6i_idev);
+       dst_destroy_metrics_generic(dst);
        if (likely(xdst->u.rt6.rt6i_peer))
                inet_putpeer(xdst->u.rt6.rt6i_peer);
        xfrm_dst_destroy(xdst);
@@ -257,6 +260,7 @@ static struct dst_ops xfrm6_dst_ops = {
        .protocol =             cpu_to_be16(ETH_P_IPV6),
        .gc =                   xfrm6_garbage_collect,
        .update_pmtu =          xfrm6_update_pmtu,
+       .cow_metrics =          dst_cow_metrics_generic,
        .destroy =              xfrm6_dst_destroy,
        .ifdown =               xfrm6_dst_ifdown,
        .local_out =            __ip6_local_out,
@@ -272,6 +276,7 @@ static struct xfrm_policy_afinfo xfrm6_policy_afinfo = {
        .get_tos =              xfrm6_get_tos,
        .init_path =            xfrm6_init_path,
        .fill_dst =             xfrm6_fill_dst,
+       .blackhole_route =      ip6_blackhole_route,
 };
 
 static int __init xfrm6_policy_init(void)
This page took 0.031757 seconds and 5 git commands to generate.