ipv6: Convert to use flowi6 where applicable.
[firefly-linux-kernel-4.4.55.git] / net / ipv6 / udp.c
index dad035fb0afd524cb7379b5c6eed670be71bd359..ce4b16fbf81c01f002bcb54b4e04c0ce95c09feb 100644 (file)
@@ -886,7 +886,7 @@ static int udp_v6_push_pending_frames(struct sock *sk)
        struct udphdr *uh;
        struct udp_sock  *up = udp_sk(sk);
        struct inet_sock *inet = inet_sk(sk);
-       struct flowi *fl = &inet->cork.fl;
+       struct flowi6 *fl6 = &inet->cork.fl.u.ip6;
        int err = 0;
        int is_udplite = IS_UDPLITE(sk);
        __wsum csum = 0;
@@ -899,23 +899,23 @@ static int udp_v6_push_pending_frames(struct sock *sk)
         * Create a UDP header
         */
        uh = udp_hdr(skb);
-       uh->source = fl->fl6_sport;
-       uh->dest = fl->fl6_dport;
+       uh->source = fl6->uli.ports.sport;
+       uh->dest = fl6->uli.ports.dport;
        uh->len = htons(up->len);
        uh->check = 0;
 
        if (is_udplite)
                csum = udplite_csum_outgoing(sk, skb);
        else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */
-               udp6_hwcsum_outgoing(sk, skb, &fl->fl6_src, &fl->fl6_dst,
+               udp6_hwcsum_outgoing(sk, skb, &fl6->saddr, &fl6->daddr,
                                     up->len);
                goto send;
        } else
                csum = udp_csum_outgoing(sk, skb);
 
        /* add protocol-dependent pseudo-header */
-       uh->check = csum_ipv6_magic(&fl->fl6_src, &fl->fl6_dst,
-                                   up->len, fl->flowi_proto, csum);
+       uh->check = csum_ipv6_magic(&fl6->saddr, &fl6->daddr,
+                                   up->len, fl6->flowi6_proto, csum);
        if (uh->check == 0)
                uh->check = CSUM_MANGLED_0;
 
@@ -947,7 +947,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
        struct in6_addr *daddr, *final_p, final;
        struct ipv6_txoptions *opt = NULL;
        struct ip6_flowlabel *flowlabel = NULL;
-       struct flowi fl;
+       struct flowi6 fl6;
        struct dst_entry *dst;
        int addr_len = msg->msg_namelen;
        int ulen = len;
@@ -1030,19 +1030,19 @@ do_udp_sendmsg:
        }
        ulen += sizeof(struct udphdr);
 
-       memset(&fl, 0, sizeof(fl));
+       memset(&fl6, 0, sizeof(fl6));
 
        if (sin6) {
                if (sin6->sin6_port == 0)
                        return -EINVAL;
 
-               fl.fl6_dport = sin6->sin6_port;
+               fl6.uli.ports.dport = sin6->sin6_port;
                daddr = &sin6->sin6_addr;
 
                if (np->sndflow) {
-                       fl.fl6_flowlabel = sin6->sin6_flowinfo&IPV6_FLOWINFO_MASK;
-                       if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) {
-                               flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
+                       fl6.flowlabel = sin6->sin6_flowinfo&IPV6_FLOWINFO_MASK;
+                       if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
+                               flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
                                if (flowlabel == NULL)
                                        return -EINVAL;
                                daddr = &flowlabel->dst;
@@ -1060,38 +1060,38 @@ do_udp_sendmsg:
                if (addr_len >= sizeof(struct sockaddr_in6) &&
                    sin6->sin6_scope_id &&
                    ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL)
-                       fl.flowi_oif = sin6->sin6_scope_id;
+                       fl6.flowi6_oif = sin6->sin6_scope_id;
        } else {
                if (sk->sk_state != TCP_ESTABLISHED)
                        return -EDESTADDRREQ;
 
-               fl.fl6_dport = inet->inet_dport;
+               fl6.uli.ports.dport = inet->inet_dport;
                daddr = &np->daddr;
-               fl.fl6_flowlabel = np->flow_label;
+               fl6.flowlabel = np->flow_label;
                connected = 1;
        }
 
-       if (!fl.flowi_oif)
-               fl.flowi_oif = sk->sk_bound_dev_if;
+       if (!fl6.flowi6_oif)
+               fl6.flowi6_oif = sk->sk_bound_dev_if;
 
-       if (!fl.flowi_oif)
-               fl.flowi_oif = np->sticky_pktinfo.ipi6_ifindex;
+       if (!fl6.flowi6_oif)
+               fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;
 
-       fl.flowi_mark = sk->sk_mark;
+       fl6.flowi6_mark = sk->sk_mark;
 
        if (msg->msg_controllen) {
                opt = &opt_space;
                memset(opt, 0, sizeof(struct ipv6_txoptions));
                opt->tot_len = sizeof(*opt);
 
-               err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit,
+               err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit,
                                        &tclass, &dontfrag);
                if (err < 0) {
                        fl6_sock_release(flowlabel);
                        return err;
                }
-               if ((fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) {
-                       flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
+               if ((fl6.flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) {
+                       flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
                        if (flowlabel == NULL)
                                return -EINVAL;
                }
@@ -1105,27 +1105,27 @@ do_udp_sendmsg:
                opt = fl6_merge_options(&opt_space, flowlabel, opt);
        opt = ipv6_fixup_options(&opt_space, opt);
 
-       fl.flowi_proto = sk->sk_protocol;
+       fl6.flowi6_proto = sk->sk_protocol;
        if (!ipv6_addr_any(daddr))
-               ipv6_addr_copy(&fl.fl6_dst, daddr);
+               ipv6_addr_copy(&fl6.daddr, daddr);
        else
-               fl.fl6_dst.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
-       if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
-               ipv6_addr_copy(&fl.fl6_src, &np->saddr);
-       fl.fl6_sport = inet->inet_sport;
+               fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
+       if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr))
+               ipv6_addr_copy(&fl6.saddr, &np->saddr);
+       fl6.uli.ports.sport = inet->inet_sport;
 
-       final_p = fl6_update_dst(&fl, opt, &final);
+       final_p = fl6_update_dst(&fl6, opt, &final);
        if (final_p)
                connected = 0;
 
-       if (!fl.flowi_oif && ipv6_addr_is_multicast(&fl.fl6_dst)) {
-               fl.flowi_oif = np->mcast_oif;
+       if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) {
+               fl6.flowi6_oif = np->mcast_oif;
                connected = 0;
        }
 
-       security_sk_classify_flow(sk, &fl);
+       security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
 
-       dst = ip6_sk_dst_lookup_flow(sk, &fl, final_p, true);
+       dst = ip6_sk_dst_lookup_flow(sk, &fl6, final_p, true);
        if (IS_ERR(dst)) {
                err = PTR_ERR(dst);
                dst = NULL;
@@ -1133,7 +1133,7 @@ do_udp_sendmsg:
        }
 
        if (hlimit < 0) {
-               if (ipv6_addr_is_multicast(&fl.fl6_dst))
+               if (ipv6_addr_is_multicast(&fl6.daddr))
                        hlimit = np->mcast_hops;
                else
                        hlimit = np->hop_limit;
@@ -1168,7 +1168,7 @@ do_append_data:
        up->len += ulen;
        getfrag  =  is_udplite ?  udplite_getfrag : ip_generic_getfrag;
        err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen,
-               sizeof(struct udphdr), hlimit, tclass, opt, &fl,
+               sizeof(struct udphdr), hlimit, tclass, opt, &fl6,
                (struct rt6_info*)dst,
                corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags, dontfrag);
        if (err)
@@ -1181,10 +1181,10 @@ do_append_data:
        if (dst) {
                if (connected) {
                        ip6_dst_store(sk, dst,
-                                     ipv6_addr_equal(&fl.fl6_dst, &np->daddr) ?
+                                     ipv6_addr_equal(&fl6.daddr, &np->daddr) ?
                                      &np->daddr : NULL,
 #ifdef CONFIG_IPV6_SUBTREES
-                                     ipv6_addr_equal(&fl.fl6_src, &np->saddr) ?
+                                     ipv6_addr_equal(&fl6.saddr, &np->saddr) ?
                                      &np->saddr :
 #endif
                                      NULL);