ipv6: Convert to use flowi6 where applicable.
[firefly-linux-kernel-4.4.55.git] / net / ipv6 / ip6_output.c
index 3d0f2ac868a75c78896db3dcd3dee0a4082ee674..18208876aa8a287c8fd176e47ff55a4629859f3c 100644 (file)
@@ -174,15 +174,15 @@ int ip6_output(struct sk_buff *skb)
  *     xmit an sk_buff (used by TCP, SCTP and DCCP)
  */
 
-int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
+int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
             struct ipv6_txoptions *opt)
 {
        struct net *net = sock_net(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct in6_addr *first_hop = &fl->fl6_dst;
+       struct in6_addr *first_hop = &fl6->daddr;
        struct dst_entry *dst = skb_dst(skb);
        struct ipv6hdr *hdr;
-       u8  proto = fl->flowi_proto;
+       u8  proto = fl6->flowi6_proto;
        int seg_len = skb->len;
        int hlimit = -1;
        int tclass = 0;
@@ -230,13 +230,13 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
        if (hlimit < 0)
                hlimit = ip6_dst_hoplimit(dst);
 
-       *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl->fl6_flowlabel;
+       *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl6->flowlabel;
 
        hdr->payload_len = htons(seg_len);
        hdr->nexthdr = proto;
        hdr->hop_limit = hlimit;
 
-       ipv6_addr_copy(&hdr->saddr, &fl->fl6_src);
+       ipv6_addr_copy(&hdr->saddr, &fl6->saddr);
        ipv6_addr_copy(&hdr->daddr, first_hop);
 
        skb->priority = sk->sk_priority;
@@ -879,7 +879,7 @@ static inline int ip6_rt_check(struct rt6key *rt_key,
 
 static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
                                          struct dst_entry *dst,
-                                         struct flowi *fl)
+                                         struct flowi6 *fl6)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct rt6_info *rt = (struct rt6_info *)dst;
@@ -904,11 +904,11 @@ static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
         *    sockets.
         * 2. oif also should be the same.
         */
-       if (ip6_rt_check(&rt->rt6i_dst, &fl->fl6_dst, np->daddr_cache) ||
+       if (ip6_rt_check(&rt->rt6i_dst, &fl6->daddr, np->daddr_cache) ||
 #ifdef CONFIG_IPV6_SUBTREES
-           ip6_rt_check(&rt->rt6i_src, &fl->fl6_src, np->saddr_cache) ||
+           ip6_rt_check(&rt->rt6i_src, &fl6->saddr, np->saddr_cache) ||
 #endif
-           (fl->flowi_oif && fl->flowi_oif != dst->dev->ifindex)) {
+           (fl6->flowi6_oif && fl6->flowi6_oif != dst->dev->ifindex)) {
                dst_release(dst);
                dst = NULL;
        }
@@ -918,22 +918,22 @@ out:
 }
 
 static int ip6_dst_lookup_tail(struct sock *sk,
-                              struct dst_entry **dst, struct flowi *fl)
+                              struct dst_entry **dst, struct flowi6 *fl6)
 {
        int err;
        struct net *net = sock_net(sk);
 
        if (*dst == NULL)
-               *dst = ip6_route_output(net, sk, fl);
+               *dst = ip6_route_output(net, sk, fl6);
 
        if ((err = (*dst)->error))
                goto out_err_release;
 
-       if (ipv6_addr_any(&fl->fl6_src)) {
+       if (ipv6_addr_any(&fl6->saddr)) {
                err = ipv6_dev_get_saddr(net, ip6_dst_idev(*dst)->dev,
-                                        &fl->fl6_dst,
+                                        &fl6->daddr,
                                         sk ? inet6_sk(sk)->srcprefs : 0,
-                                        &fl->fl6_src);
+                                        &fl6->saddr);
                if (err)
                        goto out_err_release;
        }
@@ -949,10 +949,10 @@ static int ip6_dst_lookup_tail(struct sock *sk,
         */
        if ((*dst)->neighbour && !((*dst)->neighbour->nud_state & NUD_VALID)) {
                struct inet6_ifaddr *ifp;
-               struct flowi fl_gw;
+               struct flowi6 fl_gw6;
                int redirect;
 
-               ifp = ipv6_get_ifaddr(net, &fl->fl6_src,
+               ifp = ipv6_get_ifaddr(net, &fl6->saddr,
                                      (*dst)->dev, 1);
 
                redirect = (ifp && ifp->flags & IFA_F_OPTIMISTIC);
@@ -965,9 +965,9 @@ static int ip6_dst_lookup_tail(struct sock *sk,
                         * default router instead
                         */
                        dst_release(*dst);
-                       memcpy(&fl_gw, fl, sizeof(struct flowi));
-                       memset(&fl_gw.fl6_dst, 0, sizeof(struct in6_addr));
-                       *dst = ip6_route_output(net, sk, &fl_gw);
+                       memcpy(&fl_gw6, fl6, sizeof(struct flowi6));
+                       memset(&fl_gw6.daddr, 0, sizeof(struct in6_addr));
+                       *dst = ip6_route_output(net, sk, &fl_gw6);
                        if ((err = (*dst)->error))
                                goto out_err_release;
                }
@@ -988,23 +988,23 @@ out_err_release:
  *     ip6_dst_lookup - perform route lookup on flow
  *     @sk: socket which provides route info
  *     @dst: pointer to dst_entry * for result
- *     @fl: flow to lookup
+ *     @fl6: flow to lookup
  *
  *     This function performs a route lookup on the given flow.
  *
  *     It returns zero on success, or a standard errno code on error.
  */
-int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
+int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6)
 {
        *dst = NULL;
-       return ip6_dst_lookup_tail(sk, dst, fl);
+       return ip6_dst_lookup_tail(sk, dst, fl6);
 }
 EXPORT_SYMBOL_GPL(ip6_dst_lookup);
 
 /**
  *     ip6_dst_lookup_flow - perform route lookup on flow with ipsec
  *     @sk: socket which provides route info
- *     @fl: flow to lookup
+ *     @fl6: flow to lookup
  *     @final_dst: final destination address for ipsec lookup
  *     @can_sleep: we are in a sleepable context
  *
@@ -1013,29 +1013,29 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup);
  *     It returns a valid dst pointer on success, or a pointer encoded
  *     error code.
  */
-struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi *fl,
+struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
                                      const struct in6_addr *final_dst,
                                      bool can_sleep)
 {
        struct dst_entry *dst = NULL;
        int err;
 
-       err = ip6_dst_lookup_tail(sk, &dst, fl);
+       err = ip6_dst_lookup_tail(sk, &dst, fl6);
        if (err)
                return ERR_PTR(err);
        if (final_dst)
-               ipv6_addr_copy(&fl->fl6_dst, final_dst);
+               ipv6_addr_copy(&fl6->daddr, final_dst);
        if (can_sleep)
-               fl->flowi_flags |= FLOWI_FLAG_CAN_SLEEP;
+               fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
 
-       return xfrm_lookup(sock_net(sk), dst, fl, sk, 0);
+       return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
 }
 EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
 
 /**
  *     ip6_sk_dst_lookup_flow - perform socket cached route lookup on flow
  *     @sk: socket which provides the dst cache and route info
- *     @fl: flow to lookup
+ *     @fl6: flow to lookup
  *     @final_dst: final destination address for ipsec lookup
  *     @can_sleep: we are in a sleepable context
  *
@@ -1047,24 +1047,24 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
  *     It returns a valid dst pointer on success, or a pointer encoded
  *     error code.
  */
-struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi *fl,
+struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
                                         const struct in6_addr *final_dst,
                                         bool can_sleep)
 {
        struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
        int err;
 
-       dst = ip6_sk_dst_check(sk, dst, fl);
+       dst = ip6_sk_dst_check(sk, dst, fl6);
 
-       err = ip6_dst_lookup_tail(sk, &dst, fl);
+       err = ip6_dst_lookup_tail(sk, &dst, fl6);
        if (err)
                return ERR_PTR(err);
        if (final_dst)
-               ipv6_addr_copy(&fl->fl6_dst, final_dst);
+               ipv6_addr_copy(&fl6->daddr, final_dst);
        if (can_sleep)
-               fl->flowi_flags |= FLOWI_FLAG_CAN_SLEEP;
+               fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
 
-       return xfrm_lookup(sock_net(sk), dst, fl, sk, 0);
+       return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
 }
 EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
 
@@ -1145,7 +1145,7 @@ static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
 int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
        int offset, int len, int odd, struct sk_buff *skb),
        void *from, int length, int transhdrlen,
-       int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi *fl,
+       int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,
        struct rt6_info *rt, unsigned int flags, int dontfrag)
 {
        struct inet_sock *inet = inet_sk(sk);
@@ -1203,7 +1203,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
                }
                dst_hold(&rt->dst);
                inet->cork.dst = &rt->dst;
-               inet->cork.fl = *fl;
+               inet->cork.fl.u.ip6 = *fl6;
                np->cork.hop_limit = hlimit;
                np->cork.tclass = tclass;
                mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
@@ -1224,7 +1224,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
                transhdrlen += exthdrlen;
        } else {
                rt = (struct rt6_info *)inet->cork.dst;
-               fl = &inet->cork.fl;
+               fl6 = &inet->cork.fl.u.ip6;
                opt = np->cork.opt;
                transhdrlen = 0;
                exthdrlen = 0;
@@ -1239,7 +1239,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
 
        if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
                if (inet->cork.length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {
-                       ipv6_local_error(sk, EMSGSIZE, fl, mtu-exthdrlen);
+                       ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);
                        return -EMSGSIZE;
                }
        }
@@ -1271,7 +1271,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
        if (length > mtu) {
                int proto = sk->sk_protocol;
                if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){
-                       ipv6_local_rxpmtu(sk, fl, mtu-exthdrlen);
+                       ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
                        return -EMSGSIZE;
                }
 
@@ -1516,8 +1516,8 @@ int ip6_push_pending_frames(struct sock *sk)
        struct ipv6hdr *hdr;
        struct ipv6_txoptions *opt = np->cork.opt;
        struct rt6_info *rt = (struct rt6_info *)inet->cork.dst;
-       struct flowi *fl = &inet->cork.fl;
-       unsigned char proto = fl->flowi_proto;
+       struct flowi6 *fl6 = &inet->cork.fl.u.ip6;
+       unsigned char proto = fl6->flowi6_proto;
        int err = 0;
 
        if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL)
@@ -1542,7 +1542,7 @@ int ip6_push_pending_frames(struct sock *sk)
        if (np->pmtudisc < IPV6_PMTUDISC_DO)
                skb->local_df = 1;
 
-       ipv6_addr_copy(final_dst, &fl->fl6_dst);
+       ipv6_addr_copy(final_dst, &fl6->daddr);
        __skb_pull(skb, skb_network_header_len(skb));
        if (opt && opt->opt_flen)
                ipv6_push_frag_opts(skb, opt, &proto);
@@ -1553,12 +1553,12 @@ int ip6_push_pending_frames(struct sock *sk)
        skb_reset_network_header(skb);
        hdr = ipv6_hdr(skb);
 
-       *(__be32*)hdr = fl->fl6_flowlabel |
+       *(__be32*)hdr = fl6->flowlabel |
                     htonl(0x60000000 | ((int)np->cork.tclass << 20));
 
        hdr->hop_limit = np->cork.hop_limit;
        hdr->nexthdr = proto;
-       ipv6_addr_copy(&hdr->saddr, &fl->fl6_src);
+       ipv6_addr_copy(&hdr->saddr, &fl6->saddr);
        ipv6_addr_copy(&hdr->daddr, final_dst);
 
        skb->priority = sk->sk_priority;