~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ipv6/ip6_output.c

Version: ~ [ linux-5.18 ] ~ [ linux-5.17.9 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.41 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.117 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.195 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.244 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.280 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.315 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.302 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*
  3  *      IPv6 output functions
  4  *      Linux INET6 implementation
  5  *
  6  *      Authors:
  7  *      Pedro Roque             <roque@di.fc.ul.pt>
  8  *
  9  *      Based on linux/net/ipv4/ip_output.c
 10  *
 11  *      Changes:
 12  *      A.N.Kuznetsov   :       airthmetics in fragmentation.
 13  *                              extension headers are implemented.
 14  *                              route changes now work.
 15  *                              ip6_forward does not confuse sniffers.
 16  *                              etc.
 17  *
 18  *      H. von Brand    :       Added missing #include <linux/string.h>
 19  *      Imran Patel     :       frag id should be in NBO
 20  *      Kazunori MIYAZAWA @USAGI
 21  *                      :       add ip6_append_data and related functions
 22  *                              for datagram xmit
 23  */
 24 
 25 #include <linux/errno.h>
 26 #include <linux/kernel.h>
 27 #include <linux/string.h>
 28 #include <linux/socket.h>
 29 #include <linux/net.h>
 30 #include <linux/netdevice.h>
 31 #include <linux/if_arp.h>
 32 #include <linux/in6.h>
 33 #include <linux/tcp.h>
 34 #include <linux/route.h>
 35 #include <linux/module.h>
 36 #include <linux/slab.h>
 37 
 38 #include <linux/bpf-cgroup.h>
 39 #include <linux/netfilter.h>
 40 #include <linux/netfilter_ipv6.h>
 41 
 42 #include <net/sock.h>
 43 #include <net/snmp.h>
 44 
 45 #include <net/ipv6.h>
 46 #include <net/ndisc.h>
 47 #include <net/protocol.h>
 48 #include <net/ip6_route.h>
 49 #include <net/addrconf.h>
 50 #include <net/rawv6.h>
 51 #include <net/icmp.h>
 52 #include <net/xfrm.h>
 53 #include <net/checksum.h>
 54 #include <linux/mroute6.h>
 55 #include <net/l3mdev.h>
 56 #include <net/lwtunnel.h>
 57 #include <net/ip_tunnels.h>
 58 
 59 static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *skb)
 60 {
 61         struct dst_entry *dst = skb_dst(skb);
 62         struct net_device *dev = dst->dev;
 63         const struct in6_addr *nexthop;
 64         struct neighbour *neigh;
 65         int ret;
 66 
 67         if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
 68                 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
 69 
 70                 if (!(dev->flags & IFF_LOOPBACK) && sk_mc_loop(sk) &&
 71                     ((mroute6_is_socket(net, skb) &&
 72                      !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) ||
 73                      ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr,
 74                                          &ipv6_hdr(skb)->saddr))) {
 75                         struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
 76 
 77                         /* Do not check for IFF_ALLMULTI; multicast routing
 78                            is not supported in any case.
 79                          */
 80                         if (newskb)
 81                                 NF_HOOK(NFPROTO_IPV6, NF_INET_POST_ROUTING,
 82                                         net, sk, newskb, NULL, newskb->dev,
 83                                         dev_loopback_xmit);
 84 
 85                         if (ipv6_hdr(skb)->hop_limit == 0) {
 86                                 IP6_INC_STATS(net, idev,
 87                                               IPSTATS_MIB_OUTDISCARDS);
 88                                 kfree_skb(skb);
 89                                 return 0;
 90                         }
 91                 }
 92 
 93                 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, skb->len);
 94 
 95                 if (IPV6_ADDR_MC_SCOPE(&ipv6_hdr(skb)->daddr) <=
 96                     IPV6_ADDR_SCOPE_NODELOCAL &&
 97                     !(dev->flags & IFF_LOOPBACK)) {
 98                         kfree_skb(skb);
 99                         return 0;
100                 }
101         }
102 
103         if (lwtunnel_xmit_redirect(dst->lwtstate)) {
104                 int res = lwtunnel_xmit(skb);
105 
106                 if (res < 0 || res == LWTUNNEL_XMIT_DONE)
107                         return res;
108         }
109 
110         rcu_read_lock_bh();
111         nexthop = rt6_nexthop((struct rt6_info *)dst, &ipv6_hdr(skb)->daddr);
112         neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop);
113         if (unlikely(!neigh))
114                 neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false);
115         if (!IS_ERR(neigh)) {
116                 sock_confirm_neigh(skb, neigh);
117                 ret = neigh_output(neigh, skb, false);
118                 rcu_read_unlock_bh();
119                 return ret;
120         }
121         rcu_read_unlock_bh();
122 
123         IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
124         kfree_skb(skb);
125         return -EINVAL;
126 }
127 
128 static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb)
129 {
130 #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM)
131         /* Policy lookup after SNAT yielded a new policy */
132         if (skb_dst(skb)->xfrm) {
133                 IPCB(skb)->flags |= IPSKB_REROUTED;
134                 return dst_output(net, sk, skb);
135         }
136 #endif
137 
138         if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) ||
139             dst_allfrag(skb_dst(skb)) ||
140             (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size))
141                 return ip6_fragment(net, sk, skb, ip6_finish_output2);
142         else
143                 return ip6_finish_output2(net, sk, skb);
144 }
145 
146 static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb)
147 {
148         int ret;
149 
150         ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb);
151         switch (ret) {
152         case NET_XMIT_SUCCESS:
153                 return __ip6_finish_output(net, sk, skb);
154         case NET_XMIT_CN:
155                 return __ip6_finish_output(net, sk, skb) ? : ret;
156         default:
157                 kfree_skb(skb);
158                 return ret;
159         }
160 }
161 
162 int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
163 {
164         struct net_device *dev = skb_dst(skb)->dev, *indev = skb->dev;
165         struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
166 
167         skb->protocol = htons(ETH_P_IPV6);
168         skb->dev = dev;
169 
170         if (unlikely(idev->cnf.disable_ipv6)) {
171                 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
172                 kfree_skb(skb);
173                 return 0;
174         }
175 
176         return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING,
177                             net, sk, skb, indev, dev,
178                             ip6_finish_output,
179                             !(IP6CB(skb)->flags & IP6SKB_REROUTED));
180 }
181 
182 bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np)
183 {
184         if (!np->autoflowlabel_set)
185                 return ip6_default_np_autolabel(net);
186         else
187                 return np->autoflowlabel;
188 }
189 
190 /*
191  * xmit an sk_buff (used by TCP, SCTP and DCCP)
192  * Note : socket lock is not held for SYNACK packets, but might be modified
193  * by calls to skb_set_owner_w() and ipv6_local_error(),
194  * which are using proper atomic operations or spinlocks.
195  */
196 int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
197              __u32 mark, struct ipv6_txoptions *opt, int tclass, u32 priority)
198 {
199         struct net *net = sock_net(sk);
200         const struct ipv6_pinfo *np = inet6_sk(sk);
201         struct in6_addr *first_hop = &fl6->daddr;
202         struct dst_entry *dst = skb_dst(skb);
203         unsigned int head_room;
204         struct ipv6hdr *hdr;
205         u8  proto = fl6->flowi6_proto;
206         int seg_len = skb->len;
207         int hlimit = -1;
208         u32 mtu;
209 
210         head_room = sizeof(struct ipv6hdr) + LL_RESERVED_SPACE(dst->dev);
211         if (opt)
212                 head_room += opt->opt_nflen + opt->opt_flen;
213 
214         if (unlikely(skb_headroom(skb) < head_room)) {
215                 struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room);
216                 if (!skb2) {
217                         IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
218                                       IPSTATS_MIB_OUTDISCARDS);
219                         kfree_skb(skb);
220                         return -ENOBUFS;
221                 }
222                 if (skb->sk)
223                         skb_set_owner_w(skb2, skb->sk);
224                 consume_skb(skb);
225                 skb = skb2;
226         }
227 
228         if (opt) {
229                 seg_len += opt->opt_nflen + opt->opt_flen;
230 
231                 if (opt->opt_flen)
232                         ipv6_push_frag_opts(skb, opt, &proto);
233 
234                 if (opt->opt_nflen)
235                         ipv6_push_nfrag_opts(skb, opt, &proto, &first_hop,
236                                              &fl6->saddr);
237         }
238 
239         skb_push(skb, sizeof(struct ipv6hdr));
240         skb_reset_network_header(skb);
241         hdr = ipv6_hdr(skb);
242 
243         /*
244          *      Fill in the IPv6 header
245          */
246         if (np)
247                 hlimit = np->hop_limit;
248         if (hlimit < 0)
249                 hlimit = ip6_dst_hoplimit(dst);
250 
251         ip6_flow_hdr(hdr, tclass, ip6_make_flowlabel(net, skb, fl6->flowlabel,
252                                 ip6_autoflowlabel(net, np), fl6));
253 
254         hdr->payload_len = htons(seg_len);
255         hdr->nexthdr = proto;
256         hdr->hop_limit = hlimit;
257 
258         hdr->saddr = fl6->saddr;
259         hdr->daddr = *first_hop;
260 
261         skb->protocol = htons(ETH_P_IPV6);
262         skb->priority = priority;
263         skb->mark = mark;
264 
265         mtu = dst_mtu(dst);
266         if ((skb->len <= mtu) || skb->ignore_df || skb_is_gso(skb)) {
267                 IP6_UPD_PO_STATS(net, ip6_dst_idev(skb_dst(skb)),
268                               IPSTATS_MIB_OUT, skb->len);
269 
270                 /* if egress device is enslaved to an L3 master device pass the
271                  * skb to its handler for processing
272                  */
273                 skb = l3mdev_ip6_out((struct sock *)sk, skb);
274                 if (unlikely(!skb))
275                         return 0;
276 
277                 /* hooks should never assume socket lock is held.
278                  * we promote our socket to non const
279                  */
280                 return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
281                                net, (struct sock *)sk, skb, NULL, dst->dev,
282                                dst_output);
283         }
284 
285         skb->dev = dst->dev;
286         /* ipv6_local_error() does not require socket lock,
287          * we promote our socket to non const
288          */
289         ipv6_local_error((struct sock *)sk, EMSGSIZE, fl6, mtu);
290 
291         IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_FRAGFAILS);
292         kfree_skb(skb);
293         return -EMSGSIZE;
294 }
295 EXPORT_SYMBOL(ip6_xmit);
296 
297 static int ip6_call_ra_chain(struct sk_buff *skb, int sel)
298 {
299         struct ip6_ra_chain *ra;
300         struct sock *last = NULL;
301 
302         read_lock(&ip6_ra_lock);
303         for (ra = ip6_ra_chain; ra; ra = ra->next) {
304                 struct sock *sk = ra->sk;
305                 if (sk && ra->sel == sel &&
306                     (!sk->sk_bound_dev_if ||
307                      sk->sk_bound_dev_if == skb->dev->ifindex)) {
308                         struct ipv6_pinfo *np = inet6_sk(sk);
309 
310                         if (np && np->rtalert_isolate &&
311                             !net_eq(sock_net(sk), dev_net(skb->dev))) {
312                                 continue;
313                         }
314                         if (last) {
315                                 struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
316                                 if (skb2)
317                                         rawv6_rcv(last, skb2);
318                         }
319                         last = sk;
320                 }
321         }
322 
323         if (last) {
324                 rawv6_rcv(last, skb);
325                 read_unlock(&ip6_ra_lock);
326                 return 1;
327         }
328         read_unlock(&ip6_ra_lock);
329         return 0;
330 }
331 
332 static int ip6_forward_proxy_check(struct sk_buff *skb)
333 {
334         struct ipv6hdr *hdr = ipv6_hdr(skb);
335         u8 nexthdr = hdr->nexthdr;
336         __be16 frag_off;
337         int offset;
338 
339         if (ipv6_ext_hdr(nexthdr)) {
340                 offset = ipv6_skip_exthdr(skb, sizeof(*hdr), &nexthdr, &frag_off);
341                 if (offset < 0)
342                         return 0;
343         } else
344                 offset = sizeof(struct ipv6hdr);
345 
346         if (nexthdr == IPPROTO_ICMPV6) {
347                 struct icmp6hdr *icmp6;
348 
349                 if (!pskb_may_pull(skb, (skb_network_header(skb) +
350                                          offset + 1 - skb->data)))
351                         return 0;
352 
353                 icmp6 = (struct icmp6hdr *)(skb_network_header(skb) + offset);
354 
355                 switch (icmp6->icmp6_type) {
356                 case NDISC_ROUTER_SOLICITATION:
357                 case NDISC_ROUTER_ADVERTISEMENT:
358                 case NDISC_NEIGHBOUR_SOLICITATION:
359                 case NDISC_NEIGHBOUR_ADVERTISEMENT:
360                 case NDISC_REDIRECT:
361                         /* For reaction involving unicast neighbor discovery
362                          * message destined to the proxied address, pass it to
363                          * input function.
364                          */
365                         return 1;
366                 default:
367                         break;
368                 }
369         }
370 
371         /*
372          * The proxying router can't forward traffic sent to a link-local
373          * address, so signal the sender and discard the packet. This
374          * behavior is clarified by the MIPv6 specification.
375          */
376         if (ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) {
377                 dst_link_failure(skb);
378                 return -1;
379         }
380 
381         return 0;
382 }
383 
384 static inline int ip6_forward_finish(struct net *net, struct sock *sk,
385                                      struct sk_buff *skb)
386 {
387         struct dst_entry *dst = skb_dst(skb);
388 
389         __IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS);
390         __IP6_ADD_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTOCTETS, skb->len);
391 
392 #ifdef CONFIG_NET_SWITCHDEV
393         if (skb->offload_l3_fwd_mark) {
394                 consume_skb(skb);
395                 return 0;
396         }
397 #endif
398 
399         skb->tstamp = 0;
400         return dst_output(net, sk, skb);
401 }
402 
403 static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu)
404 {
405         if (skb->len <= mtu)
406                 return false;
407 
408         /* ipv6 conntrack defrag sets max_frag_size + ignore_df */
409         if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu)
410                 return true;
411 
412         if (skb->ignore_df)
413                 return false;
414 
415         if (skb_is_gso(skb) && skb_gso_validate_network_len(skb, mtu))
416                 return false;
417 
418         return true;
419 }
420 
421 int ip6_forward(struct sk_buff *skb)
422 {
423         struct inet6_dev *idev = __in6_dev_get_safely(skb->dev);
424         struct dst_entry *dst = skb_dst(skb);
425         struct ipv6hdr *hdr = ipv6_hdr(skb);
426         struct inet6_skb_parm *opt = IP6CB(skb);
427         struct net *net = dev_net(dst->dev);
428         u32 mtu;
429 
430         if (net->ipv6.devconf_all->forwarding == 0)
431                 goto error;
432 
433         if (skb->pkt_type != PACKET_HOST)
434                 goto drop;
435 
436         if (unlikely(skb->sk))
437                 goto drop;
438 
439         if (skb_warn_if_lro(skb))
440                 goto drop;
441 
442         if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
443                 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
444                 goto drop;
445         }
446 
447         skb_forward_csum(skb);
448 
449         /*
450          *      We DO NOT make any processing on
451          *      RA packets, pushing them to user level AS IS
452          *      without ane WARRANTY that application will be able
453          *      to interpret them. The reason is that we
454          *      cannot make anything clever here.
455          *
456          *      We are not end-node, so that if packet contains
457          *      AH/ESP, we cannot make anything.
458          *      Defragmentation also would be mistake, RA packets
459          *      cannot be fragmented, because there is no warranty
460          *      that different fragments will go along one path. --ANK
461          */
462         if (unlikely(opt->flags & IP6SKB_ROUTERALERT)) {
463                 if (ip6_call_ra_chain(skb, ntohs(opt->ra)))
464                         return 0;
465         }
466 
467         /*
468          *      check and decrement ttl
469          */
470         if (hdr->hop_limit <= 1) {
471                 /* Force OUTPUT device used as source address */
472                 skb->dev = dst->dev;
473                 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0);
474                 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS);
475 
476                 kfree_skb(skb);
477                 return -ETIMEDOUT;
478         }
479 
480         /* XXX: idev->cnf.proxy_ndp? */
481         if (net->ipv6.devconf_all->proxy_ndp &&
482             pneigh_lookup(&nd_tbl, net, &hdr->daddr, skb->dev, 0)) {
483                 int proxied = ip6_forward_proxy_check(skb);
484                 if (proxied > 0)
485                         return ip6_input(skb);
486                 else if (proxied < 0) {
487                         __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
488                         goto drop;
489                 }
490         }
491 
492         if (!xfrm6_route_forward(skb)) {
493                 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
494                 goto drop;
495         }
496         dst = skb_dst(skb);
497 
498         /* IPv6 specs say nothing about it, but it is clear that we cannot
499            send redirects to source routed frames.
500            We don't send redirects to frames decapsulated from IPsec.
501          */
502         if (IP6CB(skb)->iif == dst->dev->ifindex &&
503             opt->srcrt == 0 && !skb_sec_path(skb)) {
504                 struct in6_addr *target = NULL;
505                 struct inet_peer *peer;
506                 struct rt6_info *rt;
507 
508                 /*
509                  *      incoming and outgoing devices are the same
510                  *      send a redirect.
511                  */
512 
513                 rt = (struct rt6_info *) dst;
514                 if (rt->rt6i_flags & RTF_GATEWAY)
515                         target = &rt->rt6i_gateway;
516                 else
517                         target = &hdr->daddr;
518 
519                 peer = inet_getpeer_v6(net->ipv6.peers, &hdr->daddr, 1);
520 
521                 /* Limit redirects both by destination (here)
522                    and by source (inside ndisc_send_redirect)
523                  */
524                 if (inet_peer_xrlim_allow(peer, 1*HZ))
525                         ndisc_send_redirect(skb, target);
526                 if (peer)
527                         inet_putpeer(peer);
528         } else {
529                 int addrtype = ipv6_addr_type(&hdr->saddr);
530 
531                 /* This check is security critical. */
532                 if (addrtype == IPV6_ADDR_ANY ||
533                     addrtype & (IPV6_ADDR_MULTICAST | IPV6_ADDR_LOOPBACK))
534                         goto error;
535                 if (addrtype & IPV6_ADDR_LINKLOCAL) {
536                         icmpv6_send(skb, ICMPV6_DEST_UNREACH,
537                                     ICMPV6_NOT_NEIGHBOUR, 0);
538                         goto error;
539                 }
540         }
541 
542         mtu = ip6_dst_mtu_forward(dst);
543         if (mtu < IPV6_MIN_MTU)
544                 mtu = IPV6_MIN_MTU;
545 
546         if (ip6_pkt_too_big(skb, mtu)) {
547                 /* Again, force OUTPUT device used as source address */
548                 skb->dev = dst->dev;
549                 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
550                 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INTOOBIGERRORS);
551                 __IP6_INC_STATS(net, ip6_dst_idev(dst),
552                                 IPSTATS_MIB_FRAGFAILS);
553                 kfree_skb(skb);
554                 return -EMSGSIZE;
555         }
556 
557         if (skb_cow(skb, dst->dev->hard_header_len)) {
558                 __IP6_INC_STATS(net, ip6_dst_idev(dst),
559                                 IPSTATS_MIB_OUTDISCARDS);
560                 goto drop;
561         }
562 
563         hdr = ipv6_hdr(skb);
564 
565         /* Mangling hops number delayed to point after skb COW */
566 
567         hdr->hop_limit--;
568 
569         return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD,
570                        net, NULL, skb, skb->dev, dst->dev,
571                        ip6_forward_finish);
572 
573 error:
574         __IP6_INC_STATS(net, idev, IPSTATS_MIB_INADDRERRORS);
575 drop:
576         kfree_skb(skb);
577         return -EINVAL;
578 }
579 
580 static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
581 {
582         to->pkt_type = from->pkt_type;
583         to->priority = from->priority;
584         to->protocol = from->protocol;
585         skb_dst_drop(to);
586         skb_dst_set(to, dst_clone(skb_dst(from)));
587         to->dev = from->dev;
588         to->mark = from->mark;
589 
590         skb_copy_hash(to, from);
591 
592 #ifdef CONFIG_NET_SCHED
593         to->tc_index = from->tc_index;
594 #endif
595         nf_copy(to, from);
596         skb_ext_copy(to, from);
597         skb_copy_secmark(to, from);
598 }
599 
600 int ip6_fraglist_init(struct sk_buff *skb, unsigned int hlen, u8 *prevhdr,
601                       u8 nexthdr, __be32 frag_id,
602                       struct ip6_fraglist_iter *iter)
603 {
604         unsigned int first_len;
605         struct frag_hdr *fh;
606 
607         /* BUILD HEADER */
608         *prevhdr = NEXTHDR_FRAGMENT;
609         iter->tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC);
610         if (!iter->tmp_hdr)
611                 return -ENOMEM;
612 
613         iter->frag = skb_shinfo(skb)->frag_list;
614         skb_frag_list_init(skb);
615 
616         iter->offset = 0;
617         iter->hlen = hlen;
618         iter->frag_id = frag_id;
619         iter->nexthdr = nexthdr;
620 
621         __skb_pull(skb, hlen);
622         fh = __skb_push(skb, sizeof(struct frag_hdr));
623         __skb_push(skb, hlen);
624         skb_reset_network_header(skb);
625         memcpy(skb_network_header(skb), iter->tmp_hdr, hlen);
626 
627         fh->nexthdr = nexthdr;
628         fh->reserved = 0;
629         fh->frag_off = htons(IP6_MF);
630         fh->identification = frag_id;
631 
632         first_len = skb_pagelen(skb);
633         skb->data_len = first_len - skb_headlen(skb);
634         skb->len = first_len;
635         ipv6_hdr(skb)->payload_len = htons(first_len - sizeof(struct ipv6hdr));
636 
637         return 0;
638 }
639 EXPORT_SYMBOL(ip6_fraglist_init);
640 
641 void ip6_fraglist_prepare(struct sk_buff *skb,
642                           struct ip6_fraglist_iter *iter)
643 {
644         struct sk_buff *frag = iter->frag;
645         unsigned int hlen = iter->hlen;
646         struct frag_hdr *fh;
647 
648         frag->ip_summed = CHECKSUM_NONE;
649         skb_reset_transport_header(frag);
650         fh = __skb_push(frag, sizeof(struct frag_hdr));
651         __skb_push(frag, hlen);
652         skb_reset_network_header(frag);
653         memcpy(skb_network_header(frag), iter->tmp_hdr, hlen);
654         iter->offset += skb->len - hlen - sizeof(struct frag_hdr);
655         fh->nexthdr = iter->nexthdr;
656         fh->reserved = 0;
657         fh->frag_off = htons(iter->offset);
658         if (frag->next)
659                 fh->frag_off |= htons(IP6_MF);
660         fh->identification = iter->frag_id;
661         ipv6_hdr(frag)->payload_len = htons(frag->len - sizeof(struct ipv6hdr));
662         ip6_copy_metadata(frag, skb);
663 }
664 EXPORT_SYMBOL(ip6_fraglist_prepare);
665 
666 void ip6_frag_init(struct sk_buff *skb, unsigned int hlen, unsigned int mtu,
667                    unsigned short needed_tailroom, int hdr_room, u8 *prevhdr,
668                    u8 nexthdr, __be32 frag_id, struct ip6_frag_state *state)
669 {
670         state->prevhdr = prevhdr;
671         state->nexthdr = nexthdr;
672         state->frag_id = frag_id;
673 
674         state->hlen = hlen;
675         state->mtu = mtu;
676 
677         state->left = skb->len - hlen;  /* Space per frame */
678         state->ptr = hlen;              /* Where to start from */
679 
680         state->hroom = hdr_room;
681         state->troom = needed_tailroom;
682 
683         state->offset = 0;
684 }
685 EXPORT_SYMBOL(ip6_frag_init);
686 
687 struct sk_buff *ip6_frag_next(struct sk_buff *skb, struct ip6_frag_state *state)
688 {
689         u8 *prevhdr = state->prevhdr, *fragnexthdr_offset;
690         struct sk_buff *frag;
691         struct frag_hdr *fh;
692         unsigned int len;
693 
694         len = state->left;
695         /* IF: it doesn't fit, use 'mtu' - the data space left */
696         if (len > state->mtu)
697                 len = state->mtu;
698         /* IF: we are not sending up to and including the packet end
699            then align the next start on an eight byte boundary */
700         if (len < state->left)
701                 len &= ~7;
702 
703         /* Allocate buffer */
704         frag = alloc_skb(len + state->hlen + sizeof(struct frag_hdr) +
705                          state->hroom + state->troom, GFP_ATOMIC);
706         if (!frag)
707                 return ERR_PTR(-ENOMEM);
708 
709         /*
710          *      Set up data on packet
711          */
712 
713         ip6_copy_metadata(frag, skb);
714         skb_reserve(frag, state->hroom);
715         skb_put(frag, len + state->hlen + sizeof(struct frag_hdr));
716         skb_reset_network_header(frag);
717         fh = (struct frag_hdr *)(skb_network_header(frag) + state->hlen);
718         frag->transport_header = (frag->network_header + state->hlen +
719                                   sizeof(struct frag_hdr));
720 
721         /*
722          *      Charge the memory for the fragment to any owner
723          *      it might possess
724          */
725         if (skb->sk)
726                 skb_set_owner_w(frag, skb->sk);
727 
728         /*
729          *      Copy the packet header into the new buffer.
730          */
731         skb_copy_from_linear_data(skb, skb_network_header(frag), state->hlen);
732 
733         fragnexthdr_offset = skb_network_header(frag);
734         fragnexthdr_offset += prevhdr - skb_network_header(skb);
735         *fragnexthdr_offset = NEXTHDR_FRAGMENT;
736 
737         /*
738          *      Build fragment header.
739          */
740         fh->nexthdr = state->nexthdr;
741         fh->reserved = 0;
742         fh->identification = state->frag_id;
743 
744         /*
745          *      Copy a block of the IP datagram.
746          */
747         BUG_ON(skb_copy_bits(skb, state->ptr, skb_transport_header(frag),
748                              len));
749         state->left -= len;
750 
751         fh->frag_off = htons(state->offset);
752         if (state->left > 0)
753                 fh->frag_off |= htons(IP6_MF);
754         ipv6_hdr(frag)->payload_len = htons(frag->len - sizeof(struct ipv6hdr));
755 
756         state->ptr += len;
757         state->offset += len;
758 
759         return frag;
760 }
761 EXPORT_SYMBOL(ip6_frag_next);
762 
763 int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
764                  int (*output)(struct net *, struct sock *, struct sk_buff *))
765 {
766         struct sk_buff *frag;
767         struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
768         struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
769                                 inet6_sk(skb->sk) : NULL;
770         struct ip6_frag_state state;
771         unsigned int mtu, hlen, nexthdr_offset;
772         ktime_t tstamp = skb->tstamp;
773         int hroom, err = 0;
774         __be32 frag_id;
775         u8 *prevhdr, nexthdr = 0;
776 
777         err = ip6_find_1stfragopt(skb, &prevhdr);
778         if (err < 0)
779                 goto fail;
780         hlen = err;
781         nexthdr = *prevhdr;
782         nexthdr_offset = prevhdr - skb_network_header(skb);
783 
784         mtu = ip6_skb_dst_mtu(skb);
785 
786         /* We must not fragment if the socket is set to force MTU discovery
787          * or if the skb it not generated by a local socket.
788          */
789         if (unlikely(!skb->ignore_df && skb->len > mtu))
790                 goto fail_toobig;
791 
792         if (IP6CB(skb)->frag_max_size) {
793                 if (IP6CB(skb)->frag_max_size > mtu)
794                         goto fail_toobig;
795 
796                 /* don't send fragments larger than what we received */
797                 mtu = IP6CB(skb)->frag_max_size;
798                 if (mtu < IPV6_MIN_MTU)
799                         mtu = IPV6_MIN_MTU;
800         }
801 
802         if (np && np->frag_size < mtu) {
803                 if (np->frag_size)
804                         mtu = np->frag_size;
805         }
806         if (mtu < hlen + sizeof(struct frag_hdr) + 8)
807                 goto fail_toobig;
808         mtu -= hlen + sizeof(struct frag_hdr);
809 
810         frag_id = ipv6_select_ident(net, &ipv6_hdr(skb)->daddr,
811                                     &ipv6_hdr(skb)->saddr);
812 
813         if (skb->ip_summed == CHECKSUM_PARTIAL &&
814             (err = skb_checksum_help(skb)))
815                 goto fail;
816 
817         prevhdr = skb_network_header(skb) + nexthdr_offset;
818         hroom = LL_RESERVED_SPACE(rt->dst.dev);
819         if (skb_has_frag_list(skb)) {
820                 unsigned int first_len = skb_pagelen(skb);
821                 struct ip6_fraglist_iter iter;
822                 struct sk_buff *frag2;
823 
824                 if (first_len - hlen > mtu ||
825                     ((first_len - hlen) & 7) ||
826                     skb_cloned(skb) ||
827                     skb_headroom(skb) < (hroom + sizeof(struct frag_hdr)))
828                         goto slow_path;
829 
830                 skb_walk_frags(skb, frag) {
831                         /* Correct geometry. */
832                         if (frag->len > mtu ||
833                             ((frag->len & 7) && frag->next) ||
834                             skb_headroom(frag) < (hlen + hroom + sizeof(struct frag_hdr)))
835                                 goto slow_path_clean;
836 
837                         /* Partially cloned skb? */
838                         if (skb_shared(frag))
839                                 goto slow_path_clean;
840 
841                         BUG_ON(frag->sk);
842                         if (skb->sk) {
843                                 frag->sk = skb->sk;
844                                 frag->destructor = sock_wfree;
845                         }
846                         skb->truesize -= frag->truesize;
847                 }
848 
849                 err = ip6_fraglist_init(skb, hlen, prevhdr, nexthdr, frag_id,
850                                         &iter);
851                 if (err < 0)
852                         goto fail;
853 
854                 for (;;) {
855                         /* Prepare header of the next frame,
856                          * before previous one went down. */
857                         if (iter.frag)
858                                 ip6_fraglist_prepare(skb, &iter);
859 
860                         skb->tstamp = tstamp;
861                         err = output(net, sk, skb);
862                         if (!err)
863                                 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
864                                               IPSTATS_MIB_FRAGCREATES);
865 
866                         if (err || !iter.frag)
867                                 break;
868 
869                         skb = ip6_fraglist_next(&iter);
870                 }
871 
872                 kfree(iter.tmp_hdr);
873 
874                 if (err == 0) {
875                         IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
876                                       IPSTATS_MIB_FRAGOKS);
877                         return 0;
878                 }
879 
880                 kfree_skb_list(iter.frag);
881 
882                 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
883                               IPSTATS_MIB_FRAGFAILS);
884                 return err;
885 
886 slow_path_clean:
887                 skb_walk_frags(skb, frag2) {
888                         if (frag2 == frag)
889                                 break;
890                         frag2->sk = NULL;
891                         frag2->destructor = NULL;
892                         skb->truesize += frag2->truesize;
893                 }
894         }
895 
896 slow_path:
897         /*
898          *      Fragment the datagram.
899          */
900 
901         ip6_frag_init(skb, hlen, mtu, rt->dst.dev->needed_tailroom,
902                       LL_RESERVED_SPACE(rt->dst.dev), prevhdr, nexthdr, frag_id,
903                       &state);
904 
905         /*
906          *      Keep copying data until we run out.
907          */
908 
909         while (state.left > 0) {
910                 frag = ip6_frag_next(skb, &state);
911                 if (IS_ERR(frag)) {
912                         err = PTR_ERR(frag);
913                         goto fail;
914                 }
915 
916                 /*
917                  *      Put this fragment into the sending queue.
918                  */
919                 frag->tstamp = tstamp;
920                 err = output(net, sk, frag);
921                 if (err)
922                         goto fail;
923 
924                 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
925                               IPSTATS_MIB_FRAGCREATES);
926         }
927         IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
928                       IPSTATS_MIB_FRAGOKS);
929         consume_skb(skb);
930         return err;
931 
932 fail_toobig:
933         if (skb->sk && dst_allfrag(skb_dst(skb)))
934                 sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK);
935 
936         icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
937         err = -EMSGSIZE;
938 
939 fail:
940         IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
941                       IPSTATS_MIB_FRAGFAILS);
942         kfree_skb(skb);
943         return err;
944 }
945 
946 static inline int ip6_rt_check(const struct rt6key *rt_key,
947                                const struct in6_addr *fl_addr,
948                                const struct in6_addr *addr_cache)
949 {
950         return (rt_key->plen != 128 || !ipv6_addr_equal(fl_addr, &rt_key->addr)) &&
951                 (!addr_cache || !ipv6_addr_equal(fl_addr, addr_cache));
952 }
953 
954 static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
955                                           struct dst_entry *dst,
956                                           const struct flowi6 *fl6)
957 {
958         struct ipv6_pinfo *np = inet6_sk(sk);
959         struct rt6_info *rt;
960 
961         if (!dst)
962                 goto out;
963 
964         if (dst->ops->family != AF_INET6) {
965                 dst_release(dst);
966                 return NULL;
967         }
968 
969         rt = (struct rt6_info *)dst;
970         /* Yes, checking route validity in not connected
971          * case is not very simple. Take into account,
972          * that we do not support routing by source, TOS,
973          * and MSG_DONTROUTE            --ANK (980726)
974          *
975          * 1. ip6_rt_check(): If route was host route,
976          *    check that cached destination is current.
977          *    If it is network route, we still may
978          *    check its validity using saved pointer
979          *    to the last used address: daddr_cache.
980          *    We do not want to save whole address now,
981          *    (because main consumer of this service
982          *    is tcp, which has not this problem),
983          *    so that the last trick works only on connected
984          *    sockets.
985          * 2. oif also should be the same.
986          */
987         if (ip6_rt_check(&rt->rt6i_dst, &fl6->daddr, np->daddr_cache) ||
988 #ifdef CONFIG_IPV6_SUBTREES
989             ip6_rt_check(&rt->rt6i_src, &fl6->saddr, np->saddr_cache) ||
990 #endif
991            (!(fl6->flowi6_flags & FLOWI_FLAG_SKIP_NH_OIF) &&
992               (fl6->flowi6_oif && fl6->flowi6_oif != dst->dev->ifindex))) {
993                 dst_release(dst);
994                 dst = NULL;
995         }
996 
997 out:
998         return dst;
999 }
1000 
1001 static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk,
1002                                struct dst_entry **dst, struct flowi6 *fl6)
1003 {
1004 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1005         struct neighbour *n;
1006         struct rt6_info *rt;
1007 #endif
1008         int err;
1009         int flags = 0;
1010 
1011         /* The correct way to handle this would be to do
1012          * ip6_route_get_saddr, and then ip6_route_output; however,
1013          * the route-specific preferred source forces the
1014          * ip6_route_output call _before_ ip6_route_get_saddr.
1015          *
1016          * In source specific routing (no src=any default route),
1017          * ip6_route_output will fail given src=any saddr, though, so
1018          * that's why we try it again later.
1019          */
1020         if (ipv6_addr_any(&fl6->saddr) && (!*dst || !(*dst)->error)) {
1021                 struct fib6_info *from;
1022                 struct rt6_info *rt;
1023                 bool had_dst = *dst != NULL;
1024 
1025                 if (!had_dst)
1026                         *dst = ip6_route_output(net, sk, fl6);
1027                 rt = (*dst)->error ? NULL : (struct rt6_info *)*dst;
1028 
1029                 rcu_read_lock();
1030                 from = rt ? rcu_dereference(rt->from) : NULL;
1031                 err = ip6_route_get_saddr(net, from, &fl6->daddr,
1032                                           sk ? inet6_sk(sk)->srcprefs : 0,
1033                                           &fl6->saddr);
1034                 rcu_read_unlock();
1035 
1036                 if (err)
1037                         goto out_err_release;
1038 
1039                 /* If we had an erroneous initial result, pretend it
1040                  * never existed and let the SA-enabled version take
1041                  * over.
1042                  */
1043                 if (!had_dst && (*dst)->error) {
1044                         dst_release(*dst);
1045                         *dst = NULL;
1046                 }
1047 
1048                 if (fl6->flowi6_oif)
1049                         flags |= RT6_LOOKUP_F_IFACE;
1050         }
1051 
1052         if (!*dst)
1053                 *dst = ip6_route_output_flags(net, sk, fl6, flags);
1054 
1055         err = (*dst)->error;
1056         if (err)
1057                 goto out_err_release;
1058 
1059 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1060         /*
1061          * Here if the dst entry we've looked up
1062          * has a neighbour entry that is in the INCOMPLETE
1063          * state and the src address from the flow is
1064          * marked as OPTIMISTIC, we release the found
1065          * dst entry and replace it instead with the
1066          * dst entry of the nexthop router
1067          */
1068         rt = (struct rt6_info *) *dst;
1069         rcu_read_lock_bh();
1070         n = __ipv6_neigh_lookup_noref(rt->dst.dev,
1071                                       rt6_nexthop(rt, &fl6->daddr));
1072         err = n && !(n->nud_state & NUD_VALID) ? -EINVAL : 0;
1073         rcu_read_unlock_bh();
1074 
1075         if (err) {
1076                 struct inet6_ifaddr *ifp;
1077                 struct flowi6 fl_gw6;
1078                 int redirect;
1079 
1080                 ifp = ipv6_get_ifaddr(net, &fl6->saddr,
1081                                       (*dst)->dev, 1);
1082 
1083                 redirect = (ifp && ifp->flags & IFA_F_OPTIMISTIC);
1084                 if (ifp)
1085                         in6_ifa_put(ifp);
1086 
1087                 if (redirect) {
1088                         /*
1089                          * We need to get the dst entry for the
1090                          * default router instead
1091                          */
1092                         dst_release(*dst);
1093                         memcpy(&fl_gw6, fl6, sizeof(struct flowi6));
1094                         memset(&fl_gw6.daddr, 0, sizeof(struct in6_addr));
1095                         *dst = ip6_route_output(net, sk, &fl_gw6);
1096                         err = (*dst)->error;
1097                         if (err)
1098                                 goto out_err_release;
1099                 }
1100         }
1101 #endif
1102         if (ipv6_addr_v4mapped(&fl6->saddr) &&
1103             !(ipv6_addr_v4mapped(&fl6->daddr) || ipv6_addr_any(&fl6->daddr))) {
1104                 err = -EAFNOSUPPORT;
1105                 goto out_err_release;
1106         }
1107 
1108         return 0;
1109 
1110 out_err_release:
1111         dst_release(*dst);
1112         *dst = NULL;
1113 
1114         if (err == -ENETUNREACH)
1115                 IP6_INC_STATS(net, NULL, IPSTATS_MIB_OUTNOROUTES);
1116         return err;
1117 }
1118 
1119 /**
1120  *      ip6_dst_lookup - perform route lookup on flow
1121  *      @net: Network namespace to perform lookup in
1122  *      @sk: socket which provides route info
1123  *      @dst: pointer to dst_entry * for result
1124  *      @fl6: flow to lookup
1125  *
1126  *      This function performs a route lookup on the given flow.
1127  *
1128  *      It returns zero on success, or a standard errno code on error.
1129  */
1130 int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
1131                    struct flowi6 *fl6)
1132 {
1133         *dst = NULL;
1134         return ip6_dst_lookup_tail(net, sk, dst, fl6);
1135 }
1136 EXPORT_SYMBOL_GPL(ip6_dst_lookup);
1137 
1138 /**
1139  *      ip6_dst_lookup_flow - perform route lookup on flow with ipsec
1140  *      @net: Network namespace to perform lookup in
1141  *      @sk: socket which provides route info
1142  *      @fl6: flow to lookup
1143  *      @final_dst: final destination address for ipsec lookup
1144  *
1145  *      This function performs a route lookup on the given flow.
1146  *
1147  *      It returns a valid dst pointer on success, or a pointer encoded
1148  *      error code.
1149  */
1150 struct dst_entry *ip6_dst_lookup_flow(struct net *net, const struct sock *sk, struct flowi6 *fl6,
1151                                       const struct in6_addr *final_dst)
1152 {
1153         struct dst_entry *dst = NULL;
1154         int err;
1155 
1156         err = ip6_dst_lookup_tail(net, sk, &dst, fl6);
1157         if (err)
1158                 return ERR_PTR(err);
1159         if (final_dst)
1160                 fl6->daddr = *final_dst;
1161 
1162         return xfrm_lookup_route(net, dst, flowi6_to_flowi(fl6), sk, 0);
1163 }
1164 EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
1165 
1166 /**
1167  *      ip6_sk_dst_lookup_flow - perform socket cached route lookup on flow
1168  *      @sk: socket which provides the dst cache and route info
1169  *      @fl6: flow to lookup
1170  *      @final_dst: final destination address for ipsec lookup
1171  *      @connected: whether @sk is connected or not
1172  *
1173  *      This function performs a route lookup on the given flow with the
1174  *      possibility of using the cached route in the socket if it is valid.
1175  *      It will take the socket dst lock when operating on the dst cache.
1176  *      As a result, this function can only be used in process context.
1177  *
1178  *      In addition, for a connected socket, cache the dst in the socket
1179  *      if the current cache is not valid.
1180  *
1181  *      It returns a valid dst pointer on success, or a pointer encoded
1182  *      error code.
1183  */
1184 struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
1185                                          const struct in6_addr *final_dst,
1186                                          bool connected)
1187 {
1188         struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
1189 
1190         dst = ip6_sk_dst_check(sk, dst, fl6);
1191         if (dst)
1192                 return dst;
1193 
1194         dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_dst);
1195         if (connected && !IS_ERR(dst))
1196                 ip6_sk_dst_store_flow(sk, dst_clone(dst), fl6);
1197 
1198         return dst;
1199 }
1200 EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
1201 
1202 /**
1203  *      ip6_dst_lookup_tunnel - perform route lookup on tunnel
1204  *      @skb: Packet for which lookup is done
1205  *      @dev: Tunnel device
1206  *      @net: Network namespace of tunnel device
1207  *      @sock: Socket which provides route info
1208  *      @saddr: Memory to store the src ip address
1209  *      @info: Tunnel information
1210  *      @protocol: IP protocol
1211  *      @use_cache: Flag to enable cache usage
1212  *      This function performs a route lookup on a tunnel
1213  *
1214  *      It returns a valid dst pointer and stores src address to be used in
1215  *      tunnel in param saddr on success, else a pointer encoded error code.
1216  */
1217 
1218 struct dst_entry *ip6_dst_lookup_tunnel(struct sk_buff *skb,
1219                                         struct net_device *dev,
1220                                         struct net *net,
1221                                         struct socket *sock,
1222                                         struct in6_addr *saddr,
1223                                         const struct ip_tunnel_info *info,
1224                                         u8 protocol,
1225                                         bool use_cache)
1226 {
1227         struct dst_entry *dst = NULL;
1228 #ifdef CONFIG_DST_CACHE
1229         struct dst_cache *dst_cache;
1230 #endif
1231         struct flowi6 fl6;
1232         __u8 prio;
1233 
1234 #ifdef CONFIG_DST_CACHE
1235         dst_cache = (struct dst_cache *)&info->dst_cache;
1236         if (use_cache) {
1237                 dst = dst_cache_get_ip6(dst_cache, saddr);
1238                 if (dst)
1239                         return dst;
1240         }
1241 #endif
1242         memset(&fl6, 0, sizeof(fl6));
1243         fl6.flowi6_mark = skb->mark;
1244         fl6.flowi6_proto = protocol;
1245         fl6.daddr = info->key.u.ipv6.dst;
1246         fl6.saddr = info->key.u.ipv6.src;
1247         prio = info->key.tos;
1248         fl6.flowlabel = ip6_make_flowinfo(RT_TOS(prio),
1249                                           info->key.label);
1250 
1251         dst = ipv6_stub->ipv6_dst_lookup_flow(net, sock->sk, &fl6,
1252                                               NULL);
1253         if (IS_ERR(dst)) {
1254                 netdev_dbg(dev, "no route to %pI6\n", &fl6.daddr);
1255                 return ERR_PTR(-ENETUNREACH);
1256         }
1257         if (dst->dev == dev) { /* is this necessary? */
1258                 netdev_dbg(dev, "circular route to %pI6\n", &fl6.daddr);
1259                 dst_release(dst);
1260                 return ERR_PTR(-ELOOP);
1261         }
1262 #ifdef CONFIG_DST_CACHE
1263         if (use_cache)
1264                 dst_cache_set_ip6(dst_cache, dst, &fl6.saddr);
1265 #endif
1266         *saddr = fl6.saddr;
1267         return dst;
1268 }
1269 EXPORT_SYMBOL_GPL(ip6_dst_lookup_tunnel);
1270 
1271 static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
1272                                                gfp_t gfp)
1273 {
1274         return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
1275 }
1276 
1277 static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
1278                                                 gfp_t gfp)
1279 {
1280         return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
1281 }
1282 
1283 static void ip6_append_data_mtu(unsigned int *mtu,
1284                                 int *maxfraglen,
1285                                 unsigned int fragheaderlen,
1286                                 struct sk_buff *skb,
1287                                 struct rt6_info *rt,
1288                                 unsigned int orig_mtu)
1289 {
1290         if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
1291                 if (!skb) {
1292                         /* first fragment, reserve header_len */
1293                         *mtu = orig_mtu - rt->dst.header_len;
1294 
1295                 } else {
1296                         /*
1297                          * this fragment is not first, the headers
1298                          * space is regarded as data space.
1299                          */
1300                         *mtu = orig_mtu;
1301                 }
1302                 *maxfraglen = ((*mtu - fragheaderlen) & ~7)
1303                               + fragheaderlen - sizeof(struct frag_hdr);
1304         }
1305 }
1306 
1307 static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
1308                           struct inet6_cork *v6_cork, struct ipcm6_cookie *ipc6,
1309                           struct rt6_info *rt, struct flowi6 *fl6)
1310 {
1311         struct ipv6_pinfo *np = inet6_sk(sk);
1312         unsigned int mtu;
1313         struct ipv6_txoptions *opt = ipc6->opt;
1314 
1315         /*
1316          * setup for corking
1317          */
1318         if (opt) {
1319                 if (WARN_ON(v6_cork->opt))
1320                         return -EINVAL;
1321 
1322                 v6_cork->opt = kzalloc(sizeof(*opt), sk->sk_allocation);
1323                 if (unlikely(!v6_cork->opt))
1324                         return -ENOBUFS;
1325 
1326                 v6_cork->opt->tot_len = sizeof(*opt);
1327                 v6_cork->opt->opt_flen = opt->opt_flen;
1328                 v6_cork->opt->opt_nflen = opt->opt_nflen;
1329 
1330                 v6_cork->opt->dst0opt = ip6_opt_dup(opt->dst0opt,
1331                                                     sk->sk_allocation);
1332                 if (opt->dst0opt && !v6_cork->opt->dst0opt)
1333                         return -ENOBUFS;
1334 
1335                 v6_cork->opt->dst1opt = ip6_opt_dup(opt->dst1opt,
1336                                                     sk->sk_allocation);
1337                 if (opt->dst1opt && !v6_cork->opt->dst1opt)
1338                         return -ENOBUFS;
1339 
1340                 v6_cork->opt->hopopt = ip6_opt_dup(opt->hopopt,
1341                                                    sk->sk_allocation);
1342                 if (opt->hopopt && !v6_cork->opt->hopopt)
1343                         return -ENOBUFS;
1344 
1345                 v6_cork->opt->srcrt = ip6_rthdr_dup(opt->srcrt,
1346                                                     sk->sk_allocation);
1347                 if (opt->srcrt && !v6_cork->opt->srcrt)
1348                         return -ENOBUFS;
1349 
1350                 /* need source address above miyazawa*/
1351         }
1352         dst_hold(&rt->dst);
1353         cork->base.dst = &rt->dst;
1354         cork->fl.u.ip6 = *fl6;
1355         v6_cork->hop_limit = ipc6->hlimit;
1356         v6_cork->tclass = ipc6->tclass;
1357         if (rt->dst.flags & DST_XFRM_TUNNEL)
1358                 mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
1359                       READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst);
1360         else
1361                 mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
1362                         READ_ONCE(rt->dst.dev->mtu) : dst_mtu(xfrm_dst_path(&rt->dst));
1363         if (np->frag_size < mtu) {
1364                 if (np->frag_size)
1365                         mtu = np->frag_size;
1366         }
1367         if (mtu < IPV6_MIN_MTU)
1368                 return -EINVAL;
1369         cork->base.fragsize = mtu;
1370         cork->base.gso_size = ipc6->gso_size;
1371         cork->base.tx_flags = 0;
1372         cork->base.mark = ipc6->sockc.mark;
1373         sock_tx_timestamp(sk, ipc6->sockc.tsflags, &cork->base.tx_flags);
1374 
1375         if (dst_allfrag(xfrm_dst_path(&rt->dst)))
1376                 cork->base.flags |= IPCORK_ALLFRAG;
1377         cork->base.length = 0;
1378 
1379         cork->base.transmit_time = ipc6->sockc.transmit_time;
1380 
1381         return 0;
1382 }
1383 
1384 static int __ip6_append_data(struct sock *sk,
1385                              struct flowi6 *fl6,
1386                              struct sk_buff_head *queue,
1387                              struct inet_cork *cork,
1388                              struct inet6_cork *v6_cork,
1389                              struct page_frag *pfrag,
1390                              int getfrag(void *from, char *to, int offset,
1391                                          int len, int odd, struct sk_buff *skb),
1392                              void *from, int length, int transhdrlen,
1393                              unsigned int flags, struct ipcm6_cookie *ipc6)
1394 {
1395         struct sk_buff *skb, *skb_prev = NULL;
1396         unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu;
1397         struct ubuf_info *uarg = NULL;
1398         int exthdrlen = 0;
1399         int dst_exthdrlen = 0;
1400         int hh_len;
1401         int copy;
1402         int err;
1403         int offset = 0;
1404         u32 tskey = 0;
1405         struct rt6_info *rt = (struct rt6_info *)cork->dst;
1406         struct ipv6_txoptions *opt = v6_cork->opt;
1407         int csummode = CHECKSUM_NONE;
1408         unsigned int maxnonfragsize, headersize;
1409         unsigned int wmem_alloc_delta = 0;
1410         bool paged, extra_uref = false;
1411 
1412         skb = skb_peek_tail(queue);
1413         if (!skb) {
1414                 exthdrlen = opt ? opt->opt_flen : 0;
1415                 dst_exthdrlen = rt->dst.header_len - rt->rt6i_nfheader_len;
1416         }
1417 
1418         paged = !!cork->gso_size;
1419         mtu = cork->gso_size ? IP6_MAX_MTU : cork->fragsize;
1420         orig_mtu = mtu;
1421 
1422         if (cork->tx_flags & SKBTX_ANY_SW_TSTAMP &&
1423             sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)
1424                 tskey = sk->sk_tskey++;
1425 
1426         hh_len = LL_RESERVED_SPACE(rt->dst.dev);
1427 
1428         fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
1429                         (opt ? opt->opt_nflen : 0);
1430         maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen -
1431                      sizeof(struct frag_hdr);
1432 
1433         headersize = sizeof(struct ipv6hdr) +
1434                      (opt ? opt->opt_flen + opt->opt_nflen : 0) +
1435                      (dst_allfrag(&rt->dst) ?
1436                       sizeof(struct frag_hdr) : 0) +
1437                      rt->rt6i_nfheader_len;
1438 
1439         /* as per RFC 7112 section 5, the entire IPv6 Header Chain must fit
1440          * the first fragment
1441          */
1442         if (headersize + transhdrlen > mtu)
1443                 goto emsgsize;
1444 
1445         if (cork->length + length > mtu - headersize && ipc6->dontfrag &&
1446             (sk->sk_protocol == IPPROTO_UDP ||
1447              sk->sk_protocol == IPPROTO_RAW)) {
1448                 ipv6_local_rxpmtu(sk, fl6, mtu - headersize +
1449                                 sizeof(struct ipv6hdr));
1450                 goto emsgsize;
1451         }
1452 
1453         if (ip6_sk_ignore_df(sk))
1454                 maxnonfragsize = sizeof(struct ipv6hdr) + IPV6_MAXPLEN;
1455         else
1456                 maxnonfragsize = mtu;
1457 
1458         if (cork->length + length > maxnonfragsize - headersize) {
1459 emsgsize:
1460                 pmtu = max_t(int, mtu - headersize + sizeof(struct ipv6hdr), 0);
1461                 ipv6_local_error(sk, EMSGSIZE, fl6, pmtu);
1462                 return -EMSGSIZE;
1463         }
1464 
1465         /* CHECKSUM_PARTIAL only with no extension headers and when
1466          * we are not going to fragment
1467          */
1468         if (transhdrlen && sk->sk_protocol == IPPROTO_UDP &&
1469             headersize == sizeof(struct ipv6hdr) &&
1470             length <= mtu - headersize &&
1471             (!(flags & MSG_MORE) || cork->gso_size) &&
1472             rt->dst.dev->features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_CSUM))
1473                 csummode = CHECKSUM_PARTIAL;
1474 
1475         if (flags & MSG_ZEROCOPY && length && sock_flag(sk, SOCK_ZEROCOPY)) {
1476                 uarg = sock_zerocopy_realloc(sk, length, skb_zcopy(skb));
1477                 if (!uarg)
1478                         return -ENOBUFS;
1479                 extra_uref = !skb_zcopy(skb);   /* only ref on new uarg */
1480                 if (rt->dst.dev->features & NETIF_F_SG &&
1481                     csummode == CHECKSUM_PARTIAL) {
1482                         paged = true;
1483                 } else {
1484                         uarg->zerocopy = 0;
1485                         skb_zcopy_set(skb, uarg, &extra_uref);
1486                 }
1487         }
1488 
1489         /*
1490          * Let's try using as much space as possible.
1491          * Use MTU if total length of the message fits into the MTU.
1492          * Otherwise, we need to reserve fragment header and
1493          * fragment alignment (= 8-15 octects, in total).
1494          *
1495          * Note that we may need to "move" the data from the tail of
1496          * of the buffer to the new fragment when we split
1497          * the message.
1498          *
1499          * FIXME: It may be fragmented into multiple chunks
1500          *        at once if non-fragmentable extension headers
1501          *        are too large.
1502          * --yoshfuji
1503          */
1504 
1505         cork->length += length;
1506         if (!skb)
1507                 goto alloc_new_skb;
1508 
1509         while (length > 0) {
1510                 /* Check if the remaining data fits into current packet. */
1511                 copy = (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - skb->len;
1512                 if (copy < length)
1513                         copy = maxfraglen - skb->len;
1514 
1515                 if (copy <= 0) {
1516                         char *data;
1517                         unsigned int datalen;
1518                         unsigned int fraglen;
1519                         unsigned int fraggap;
1520                         unsigned int alloclen;
1521                         unsigned int pagedlen;
1522 alloc_new_skb:
1523                         /* There's no room in the current skb */
1524                         if (skb)
1525                                 fraggap = skb->len - maxfraglen;
1526                         else
1527                                 fraggap = 0;
1528                         /* update mtu and maxfraglen if necessary */
1529                         if (!skb || !skb_prev)
1530                                 ip6_append_data_mtu(&mtu, &maxfraglen,
1531                                                     fragheaderlen, skb, rt,
1532                                                     orig_mtu);
1533 
1534                         skb_prev = skb;
1535 
1536                         /*
1537                          * If remaining data exceeds the mtu,
1538                          * we know we need more fragment(s).
1539                          */
1540                         datalen = length + fraggap;
1541 
1542                         if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen)
1543                                 datalen = maxfraglen - fragheaderlen - rt->dst.trailer_len;
1544                         fraglen = datalen + fragheaderlen;
1545                         pagedlen = 0;
1546 
1547                         if ((flags & MSG_MORE) &&
1548                             !(rt->dst.dev->features&NETIF_F_SG))
1549                                 alloclen = mtu;
1550                         else if (!paged)
1551                                 alloclen = fraglen;
1552                         else {
1553                                 alloclen = min_t(int, fraglen, MAX_HEADER);
1554                                 pagedlen = fraglen - alloclen;
1555                         }
1556 
1557                         alloclen += dst_exthdrlen;
1558 
1559                         if (datalen != length + fraggap) {
1560                                 /*
1561                                  * this is not the last fragment, the trailer
1562                                  * space is regarded as data space.
1563                                  */
1564                                 datalen += rt->dst.trailer_len;
1565                         }
1566 
1567                         alloclen += rt->dst.trailer_len;
1568                         fraglen = datalen + fragheaderlen;
1569 
1570                         /*
1571                          * We just reserve space for fragment header.
1572                          * Note: this may be overallocation if the message
1573                          * (without MSG_MORE) fits into the MTU.
1574                          */
1575                         alloclen += sizeof(struct frag_hdr);
1576 
1577                         copy = datalen - transhdrlen - fraggap - pagedlen;
1578                         if (copy < 0) {
1579                                 err = -EINVAL;
1580                                 goto error;
1581                         }
1582                         if (transhdrlen) {
1583                                 skb = sock_alloc_send_skb(sk,
1584                                                 alloclen + hh_len,
1585                                                 (flags & MSG_DONTWAIT), &err);
1586                         } else {
1587                                 skb = NULL;
1588                                 if (refcount_read(&sk->sk_wmem_alloc) + wmem_alloc_delta <=
1589                                     2 * sk->sk_sndbuf)
1590                                         skb = alloc_skb(alloclen + hh_len,
1591                                                         sk->sk_allocation);
1592                                 if (unlikely(!skb))
1593                                         err = -ENOBUFS;
1594                         }
1595                         if (!skb)
1596                                 goto error;
1597                         /*
1598                          *      Fill in the control structures
1599                          */
1600                         skb->protocol = htons(ETH_P_IPV6);
1601                         skb->ip_summed = csummode;
1602                         skb->csum = 0;
1603                         /* reserve for fragmentation and ipsec header */
1604                         skb_reserve(skb, hh_len + sizeof(struct frag_hdr) +
1605                                     dst_exthdrlen);
1606 
1607                         /*
1608                          *      Find where to start putting bytes
1609                          */
1610                         data = skb_put(skb, fraglen - pagedlen);
1611                         skb_set_network_header(skb, exthdrlen);
1612                         data += fragheaderlen;
1613                         skb->transport_header = (skb->network_header +
1614                                                  fragheaderlen);
1615                         if (fraggap) {
1616                                 skb->csum = skb_copy_and_csum_bits(
1617                                         skb_prev, maxfraglen,
1618                                         data + transhdrlen, fraggap, 0);
1619                                 skb_prev->csum = csum_sub(skb_prev->csum,
1620                                                           skb->csum);
1621                                 data += fraggap;
1622                                 pskb_trim_unique(skb_prev, maxfraglen);
1623                         }
1624                         if (copy > 0 &&
1625                             getfrag(from, data + transhdrlen, offset,
1626                                     copy, fraggap, skb) < 0) {
1627                                 err = -EFAULT;
1628                                 kfree_skb(skb);
1629                                 goto error;
1630                         }
1631 
1632                         offset += copy;
1633                         length -= copy + transhdrlen;
1634                         transhdrlen = 0;
1635                         exthdrlen = 0;
1636                         dst_exthdrlen = 0;
1637 
1638                         /* Only the initial fragment is time stamped */
1639                         skb_shinfo(skb)->tx_flags = cork->tx_flags;
1640                         cork->tx_flags = 0;
1641                         skb_shinfo(skb)->tskey = tskey;
1642                         tskey = 0;
1643                         skb_zcopy_set(skb, uarg, &extra_uref);
1644 
1645                         if ((flags & MSG_CONFIRM) && !skb_prev)
1646                                 skb_set_dst_pending_confirm(skb, 1);
1647 
1648                         /*
1649                          * Put the packet on the pending queue
1650                          */
1651                         if (!skb->destructor) {
1652                                 skb->destructor = sock_wfree;
1653                                 skb->sk = sk;
1654                                 wmem_alloc_delta += skb->truesize;
1655                         }
1656                         __skb_queue_tail(queue, skb);
1657                         continue;
1658                 }
1659 
1660                 if (copy > length)
1661                         copy = length;
1662 
1663                 if (!(rt->dst.dev->features&NETIF_F_SG) &&
1664                     skb_tailroom(skb) >= copy) {
1665                         unsigned int off;
1666 
1667                         off = skb->len;
1668                         if (getfrag(from, skb_put(skb, copy),
1669                                                 offset, copy, off, skb) < 0) {
1670                                 __skb_trim(skb, off);
1671                                 err = -EFAULT;
1672                                 goto error;
1673                         }
1674                 } else if (!uarg || !uarg->zerocopy) {
1675                         int i = skb_shinfo(skb)->nr_frags;
1676 
1677                         err = -ENOMEM;
1678                         if (!sk_page_frag_refill(sk, pfrag))
1679                                 goto error;
1680 
1681                         if (!skb_can_coalesce(skb, i, pfrag->page,
1682                                               pfrag->offset)) {
1683                                 err = -EMSGSIZE;
1684                                 if (i == MAX_SKB_FRAGS)
1685                                         goto error;
1686 
1687                                 __skb_fill_page_desc(skb, i, pfrag->page,
1688                                                      pfrag->offset, 0);
1689                                 skb_shinfo(skb)->nr_frags = ++i;
1690                                 get_page(pfrag->page);
1691                         }
1692                         copy = min_t(int, copy, pfrag->size - pfrag->offset);
1693                         if (getfrag(from,
1694                                     page_address(pfrag->page) + pfrag->offset,
1695                                     offset, copy, skb->len, skb) < 0)
1696                                 goto error_efault;
1697 
1698                         pfrag->offset += copy;
1699                         skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
1700                         skb->len += copy;
1701                         skb->data_len += copy;
1702                         skb->truesize += copy;
1703                         wmem_alloc_delta += copy;
1704                 } else {
1705                         err = skb_zerocopy_iter_dgram(skb, from, copy);
1706                         if (err < 0)
1707                                 goto error;
1708                 }
1709                 offset += copy;
1710                 length -= copy;
1711         }
1712 
1713         if (wmem_alloc_delta)
1714                 refcount_add(wmem_alloc_delta, &sk->sk_wmem_alloc);
1715         return 0;
1716 
1717 error_efault:
1718         err = -EFAULT;
1719 error:
1720         if (uarg)
1721                 sock_zerocopy_put_abort(uarg, extra_uref);
1722         cork->length -= length;
1723         IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
1724         refcount_add(wmem_alloc_delta, &sk->sk_wmem_alloc);
1725         return err;
1726 }
1727 
1728 int ip6_append_data(struct sock *sk,
1729                     int getfrag(void *from, char *to, int offset, int len,
1730                                 int odd, struct sk_buff *skb),
1731                     void *from, int length, int transhdrlen,
1732                     struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
1733                     struct rt6_info *rt, unsigned int flags)
1734 {
1735         struct inet_sock *inet = inet_sk(sk);
1736         struct ipv6_pinfo *np = inet6_sk(sk);
1737         int exthdrlen;
1738         int err;
1739 
1740         if (flags&MSG_PROBE)
1741                 return 0;
1742         if (skb_queue_empty(&sk->sk_write_queue)) {
1743                 /*
1744                  * setup for corking
1745                  */
1746                 err = ip6_setup_cork(sk, &inet->cork, &np->cork,
1747                                      ipc6, rt, fl6);
1748                 if (err)
1749                         return err;
1750 
1751                 exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0);
1752                 length += exthdrlen;
1753                 transhdrlen += exthdrlen;
1754         } else {
1755                 fl6 = &inet->cork.fl.u.ip6;
1756                 transhdrlen = 0;
1757         }
1758 
1759         return __ip6_append_data(sk, fl6, &sk->sk_write_queue, &inet->cork.base,
1760                                  &np->cork, sk_page_frag(sk), getfrag,
1761                                  from, length, transhdrlen, flags, ipc6);
1762 }
1763 EXPORT_SYMBOL_GPL(ip6_append_data);
1764 
1765 static void ip6_cork_release(struct inet_cork_full *cork,
1766                              struct inet6_cork *v6_cork)
1767 {
1768         if (v6_cork->opt) {
1769                 kfree(v6_cork->opt->dst0opt);
1770                 kfree(v6_cork->opt->dst1opt);
1771                 kfree(v6_cork->opt->hopopt);
1772                 kfree(v6_cork->opt->srcrt);
1773                 kfree(v6_cork->opt);
1774                 v6_cork->opt = NULL;
1775         }
1776 
1777         if (cork->base.dst) {
1778                 dst_release(cork->base.dst);
1779                 cork->base.dst = NULL;
1780                 cork->base.flags &= ~IPCORK_ALLFRAG;
1781         }
1782         memset(&cork->fl, 0, sizeof(cork->fl));
1783 }
1784 
1785 struct sk_buff *__ip6_make_skb(struct sock *sk,
1786                                struct sk_buff_head *queue,
1787                                struct inet_cork_full *cork,
1788                                struct inet6_cork *v6_cork)
1789 {
1790         struct sk_buff *skb, *tmp_skb;
1791         struct sk_buff **tail_skb;
1792         struct in6_addr final_dst_buf, *final_dst = &final_dst_buf;
1793         struct ipv6_pinfo *np = inet6_sk(sk);
1794         struct net *net = sock_net(sk);
1795         struct ipv6hdr *hdr;
1796         struct ipv6_txoptions *opt = v6_cork->opt;
1797         struct rt6_info *rt = (struct rt6_info *)cork->base.dst;
1798         struct flowi6 *fl6 = &cork->fl.u.ip6;
1799         unsigned char proto = fl6->flowi6_proto;
1800 
1801         skb = __skb_dequeue(queue);
1802         if (!skb)
1803                 goto out;
1804         tail_skb = &(skb_shinfo(skb)->frag_list);
1805 
1806         /* move skb->data to ip header from ext header */
1807         if (skb->data < skb_network_header(skb))
1808                 __skb_pull(skb, skb_network_offset(skb));
1809         while ((tmp_skb = __skb_dequeue(queue)) != NULL) {
1810                 __skb_pull(tmp_skb, skb_network_header_len(skb));
1811                 *tail_skb = tmp_skb;
1812                 tail_skb = &(tmp_skb->next);
1813                 skb->len += tmp_skb->len;
1814                 skb->data_len += tmp_skb->len;
1815                 skb->truesize += tmp_skb->truesize;
1816                 tmp_skb->destructor = NULL;
1817                 tmp_skb->sk = NULL;
1818         }
1819 
1820         /* Allow local fragmentation. */
1821         skb->ignore_df = ip6_sk_ignore_df(sk);
1822 
1823         *final_dst = fl6->daddr;
1824         __skb_pull(skb, skb_network_header_len(skb));
1825         if (opt && opt->opt_flen)
1826                 ipv6_push_frag_opts(skb, opt, &proto);
1827         if (opt && opt->opt_nflen)
1828                 ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst, &fl6->saddr);
1829 
1830         skb_push(skb, sizeof(struct ipv6hdr));
1831         skb_reset_network_header(skb);
1832         hdr = ipv6_hdr(skb);
1833 
1834         ip6_flow_hdr(hdr, v6_cork->tclass,
1835                      ip6_make_flowlabel(net, skb, fl6->flowlabel,
1836                                         ip6_autoflowlabel(net, np), fl6));
1837         hdr->hop_limit = v6_cork->hop_limit;
1838         hdr->nexthdr = proto;
1839         hdr->saddr = fl6->saddr;
1840         hdr->daddr = *final_dst;
1841 
1842         skb->priority = sk->sk_priority;
1843         skb->mark = cork->base.mark;
1844 
1845         skb->tstamp = cork->base.transmit_time;
1846 
1847         skb_dst_set(skb, dst_clone(&rt->dst));
1848         IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
1849         if (proto == IPPROTO_ICMPV6) {
1850                 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
1851 
1852                 ICMP6MSGOUT_INC_STATS(net, idev, icmp6_hdr(skb)->icmp6_type);
1853                 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1854         }
1855 
1856         ip6_cork_release(cork, v6_cork);
1857 out:
1858         return skb;
1859 }
1860 
1861 int ip6_send_skb(struct sk_buff *skb)
1862 {
1863         struct net *net = sock_net(skb->sk);
1864         struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
1865         int err;
1866 
1867         err = ip6_local_out(net, skb->sk, skb);
1868         if (err) {
1869                 if (err > 0)
1870                         err = net_xmit_errno(err);
1871                 if (err)
1872                         IP6_INC_STATS(net, rt->rt6i_idev,
1873                                       IPSTATS_MIB_OUTDISCARDS);
1874         }
1875 
1876         return err;
1877 }
1878 
1879 int ip6_push_pending_frames(struct sock *sk)
1880 {
1881         struct sk_buff *skb;
1882 
1883         skb = ip6_finish_skb(sk);
1884         if (!skb)
1885                 return 0;
1886 
1887         return ip6_send_skb(skb);
1888 }
1889 EXPORT_SYMBOL_GPL(ip6_push_pending_frames);
1890 
1891 static void __ip6_flush_pending_frames(struct sock *sk,
1892                                        struct sk_buff_head *queue,
1893                                        struct inet_cork_full *cork,
1894                                        struct inet6_cork *v6_cork)
1895 {
1896         struct sk_buff *skb;
1897 
1898         while ((skb = __skb_dequeue_tail(queue)) != NULL) {
1899                 if (skb_dst(skb))
1900                         IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb_dst(skb)),
1901                                       IPSTATS_MIB_OUTDISCARDS);
1902                 kfree_skb(skb);
1903         }
1904 
1905         ip6_cork_release(cork, v6_cork);
1906 }
1907 
1908 void ip6_flush_pending_frames(struct sock *sk)
1909 {
1910         __ip6_flush_pending_frames(sk, &sk->sk_write_queue,
1911                                    &inet_sk(sk)->cork, &inet6_sk(sk)->cork);
1912 }
1913 EXPORT_SYMBOL_GPL(ip6_flush_pending_frames);
1914 
1915 struct sk_buff *ip6_make_skb(struct sock *sk,
1916                              int getfrag(void *from, char *to, int offset,
1917                                          int len, int odd, struct sk_buff *skb),
1918                              void *from, int length, int transhdrlen,
1919                              struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
1920                              struct rt6_info *rt, unsigned int flags,
1921                              struct inet_cork_full *cork)
1922 {
1923         struct inet6_cork v6_cork;
1924         struct sk_buff_head queue;
1925         int exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0);
1926         int err;
1927 
1928         if (flags & MSG_PROBE)
1929                 return NULL;
1930 
1931         __skb_queue_head_init(&queue);
1932 
1933         cork->base.flags = 0;
1934         cork->base.addr = 0;
1935         cork->base.opt = NULL;
1936         cork->base.dst = NULL;
1937         v6_cork.opt = NULL;
1938         err = ip6_setup_cork(sk, cork, &v6_cork, ipc6, rt, fl6);
1939         if (err) {
1940                 ip6_cork_release(cork, &v6_cork);
1941                 return ERR_PTR(err);
1942         }
1943         if (ipc6->dontfrag < 0)
1944                 ipc6->dontfrag = inet6_sk(sk)->dontfrag;
1945 
1946         err = __ip6_append_data(sk, fl6, &queue, &cork->base, &v6_cork,
1947                                 &current->task_frag, getfrag, from,
1948                                 length + exthdrlen, transhdrlen + exthdrlen,
1949                                 flags, ipc6);
1950         if (err) {
1951                 __ip6_flush_pending_frames(sk, &queue, cork, &v6_cork);
1952                 return ERR_PTR(err);
1953         }
1954 
1955         return __ip6_make_skb(sk, &queue, cork, &v6_cork);
1956 }
1957 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp