]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - net/ipv6/ip6_output.c
Merge tag 'stable/for-linus-3.5-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-zesty-kernel.git] / net / ipv6 / ip6_output.c
CommitLineData
1da177e4
LT
1/*
2 * IPv6 output functions
1ab1457c 3 * Linux INET6 implementation
1da177e4
LT
4 *
5 * Authors:
1ab1457c 6 * Pedro Roque <roque@di.fc.ul.pt>
1da177e4 7 *
1da177e4
LT
8 * Based on linux/net/ipv4/ip_output.c
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version
13 * 2 of the License, or (at your option) any later version.
14 *
15 * Changes:
16 * A.N.Kuznetsov : airthmetics in fragmentation.
17 * extension headers are implemented.
18 * route changes now work.
19 * ip6_forward does not confuse sniffers.
20 * etc.
21 *
22 * H. von Brand : Added missing #include <linux/string.h>
23 * Imran Patel : frag id should be in NBO
24 * Kazunori MIYAZAWA @USAGI
25 * : add ip6_append_data and related functions
26 * for datagram xmit
27 */
28
1da177e4 29#include <linux/errno.h>
ef76bc23 30#include <linux/kernel.h>
1da177e4
LT
31#include <linux/string.h>
32#include <linux/socket.h>
33#include <linux/net.h>
34#include <linux/netdevice.h>
35#include <linux/if_arp.h>
36#include <linux/in6.h>
37#include <linux/tcp.h>
38#include <linux/route.h>
b59f45d0 39#include <linux/module.h>
5a0e3ad6 40#include <linux/slab.h>
1da177e4
LT
41
42#include <linux/netfilter.h>
43#include <linux/netfilter_ipv6.h>
44
45#include <net/sock.h>
46#include <net/snmp.h>
47
48#include <net/ipv6.h>
49#include <net/ndisc.h>
50#include <net/protocol.h>
51#include <net/ip6_route.h>
52#include <net/addrconf.h>
53#include <net/rawv6.h>
54#include <net/icmp.h>
55#include <net/xfrm.h>
56#include <net/checksum.h>
7bc570c8 57#include <linux/mroute6.h>
1da177e4 58
ad0081e4 59int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
1da177e4 60
ef76bc23
HX
61int __ip6_local_out(struct sk_buff *skb)
62{
63 int len;
64
65 len = skb->len - sizeof(struct ipv6hdr);
66 if (len > IPV6_MAXPLEN)
67 len = 0;
68 ipv6_hdr(skb)->payload_len = htons(len);
69
b2e0b385
JE
70 return nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL,
71 skb_dst(skb)->dev, dst_output);
ef76bc23
HX
72}
73
74int ip6_local_out(struct sk_buff *skb)
75{
76 int err;
77
78 err = __ip6_local_out(skb);
79 if (likely(err == 1))
80 err = dst_output(skb);
81
82 return err;
83}
84EXPORT_SYMBOL_GPL(ip6_local_out);
85
1da177e4
LT
86/* dev_loopback_xmit for use with netfilter. */
87static int ip6_dev_loopback_xmit(struct sk_buff *newskb)
88{
459a98ed 89 skb_reset_mac_header(newskb);
bbe735e4 90 __skb_pull(newskb, skb_network_offset(newskb));
1da177e4
LT
91 newskb->pkt_type = PACKET_LOOPBACK;
92 newskb->ip_summed = CHECKSUM_UNNECESSARY;
adf30907 93 WARN_ON(!skb_dst(newskb));
1da177e4 94
e30b38c2 95 netif_rx_ni(newskb);
1da177e4
LT
96 return 0;
97}
98
9e508490 99static int ip6_finish_output2(struct sk_buff *skb)
1da177e4 100{
adf30907 101 struct dst_entry *dst = skb_dst(skb);
1da177e4 102 struct net_device *dev = dst->dev;
f6b72b62 103 struct neighbour *neigh;
1da177e4
LT
104
105 skb->protocol = htons(ETH_P_IPV6);
106 skb->dev = dev;
107
0660e03f 108 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
adf30907 109 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
1da177e4 110
7ad6848c 111 if (!(dev->flags & IFF_LOOPBACK) && sk_mc_loop(skb->sk) &&
d1db275d 112 ((mroute6_socket(dev_net(dev), skb) &&
bd91b8bf 113 !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) ||
7bc570c8
YH
114 ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr,
115 &ipv6_hdr(skb)->saddr))) {
1da177e4
LT
116 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
117
118 /* Do not check for IFF_ALLMULTI; multicast routing
119 is not supported in any case.
120 */
121 if (newskb)
b2e0b385
JE
122 NF_HOOK(NFPROTO_IPV6, NF_INET_POST_ROUTING,
123 newskb, NULL, newskb->dev,
1da177e4
LT
124 ip6_dev_loopback_xmit);
125
0660e03f 126 if (ipv6_hdr(skb)->hop_limit == 0) {
3bd653c8
DL
127 IP6_INC_STATS(dev_net(dev), idev,
128 IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
129 kfree_skb(skb);
130 return 0;
131 }
132 }
133
edf391ff
NH
134 IP6_UPD_PO_STATS(dev_net(dev), idev, IPSTATS_MIB_OUTMCAST,
135 skb->len);
1da177e4
LT
136 }
137
f2c31e32 138 rcu_read_lock();
27217455 139 neigh = dst_get_neighbour_noref(dst);
f2c31e32
ED
140 if (neigh) {
141 int res = neigh_output(neigh, skb);
05e3aa09 142
f2c31e32
ED
143 rcu_read_unlock();
144 return res;
145 }
146 rcu_read_unlock();
9e508490
JE
147 IP6_INC_STATS_BH(dev_net(dst->dev),
148 ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
149 kfree_skb(skb);
150 return -EINVAL;
1da177e4
LT
151}
152
9e508490
JE
153static int ip6_finish_output(struct sk_buff *skb)
154{
155 if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) ||
156 dst_allfrag(skb_dst(skb)))
157 return ip6_fragment(skb, ip6_finish_output2);
158 else
159 return ip6_finish_output2(skb);
160}
161
1da177e4
LT
162int ip6_output(struct sk_buff *skb)
163{
9e508490 164 struct net_device *dev = skb_dst(skb)->dev;
adf30907 165 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
778d80be 166 if (unlikely(idev->cnf.disable_ipv6)) {
9e508490 167 IP6_INC_STATS(dev_net(dev), idev,
3bd653c8 168 IPSTATS_MIB_OUTDISCARDS);
778d80be
YH
169 kfree_skb(skb);
170 return 0;
171 }
172
9c6eb28a
JE
173 return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb, NULL, dev,
174 ip6_finish_output,
175 !(IP6CB(skb)->flags & IP6SKB_REROUTED));
1da177e4
LT
176}
177
1da177e4 178/*
b5d43998 179 * xmit an sk_buff (used by TCP, SCTP and DCCP)
1da177e4
LT
180 */
181
4c9483b2 182int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
b903d324 183 struct ipv6_txoptions *opt, int tclass)
1da177e4 184{
3bd653c8 185 struct net *net = sock_net(sk);
b30bd282 186 struct ipv6_pinfo *np = inet6_sk(sk);
4c9483b2 187 struct in6_addr *first_hop = &fl6->daddr;
adf30907 188 struct dst_entry *dst = skb_dst(skb);
1da177e4 189 struct ipv6hdr *hdr;
4c9483b2 190 u8 proto = fl6->flowi6_proto;
1da177e4 191 int seg_len = skb->len;
e651f03a 192 int hlimit = -1;
1da177e4
LT
193 u32 mtu;
194
195 if (opt) {
c2636b4d 196 unsigned int head_room;
1da177e4
LT
197
198 /* First: exthdrs may take lots of space (~8K for now)
199 MAX_HEADER is not enough.
200 */
201 head_room = opt->opt_nflen + opt->opt_flen;
202 seg_len += head_room;
203 head_room += sizeof(struct ipv6hdr) + LL_RESERVED_SPACE(dst->dev);
204
205 if (skb_headroom(skb) < head_room) {
206 struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room);
a11d206d 207 if (skb2 == NULL) {
adf30907 208 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d
YH
209 IPSTATS_MIB_OUTDISCARDS);
210 kfree_skb(skb);
1da177e4
LT
211 return -ENOBUFS;
212 }
808db80a 213 consume_skb(skb);
a11d206d 214 skb = skb2;
83d7eb29 215 skb_set_owner_w(skb, sk);
1da177e4
LT
216 }
217 if (opt->opt_flen)
218 ipv6_push_frag_opts(skb, opt, &proto);
219 if (opt->opt_nflen)
220 ipv6_push_nfrag_opts(skb, opt, &proto, &first_hop);
221 }
222
e2d1bca7
ACM
223 skb_push(skb, sizeof(struct ipv6hdr));
224 skb_reset_network_header(skb);
0660e03f 225 hdr = ipv6_hdr(skb);
1da177e4
LT
226
227 /*
228 * Fill in the IPv6 header
229 */
b903d324 230 if (np)
1da177e4
LT
231 hlimit = np->hop_limit;
232 if (hlimit < 0)
6b75d090 233 hlimit = ip6_dst_hoplimit(dst);
1da177e4 234
4c9483b2 235 *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl6->flowlabel;
41a1f8ea 236
1da177e4
LT
237 hdr->payload_len = htons(seg_len);
238 hdr->nexthdr = proto;
239 hdr->hop_limit = hlimit;
240
4e3fd7a0
AD
241 hdr->saddr = fl6->saddr;
242 hdr->daddr = *first_hop;
1da177e4 243
a2c2064f 244 skb->priority = sk->sk_priority;
4a19ec58 245 skb->mark = sk->sk_mark;
a2c2064f 246
1da177e4 247 mtu = dst_mtu(dst);
283d07ac 248 if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) {
adf30907 249 IP6_UPD_PO_STATS(net, ip6_dst_idev(skb_dst(skb)),
edf391ff 250 IPSTATS_MIB_OUT, skb->len);
b2e0b385
JE
251 return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL,
252 dst->dev, dst_output);
1da177e4
LT
253 }
254
e87cc472 255 net_dbg_ratelimited("IPv6: sending pkt_too_big to self\n");
1da177e4 256 skb->dev = dst->dev;
3ffe533c 257 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
adf30907 258 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_FRAGFAILS);
1da177e4
LT
259 kfree_skb(skb);
260 return -EMSGSIZE;
261}
262
7159039a
YH
263EXPORT_SYMBOL(ip6_xmit);
264
1da177e4
LT
265/*
266 * To avoid extra problems ND packets are send through this
267 * routine. It's code duplication but I really want to avoid
268 * extra checks since ipv6_build_header is used by TCP (which
269 * is for us performance critical)
270 */
271
272int ip6_nd_hdr(struct sock *sk, struct sk_buff *skb, struct net_device *dev,
9acd9f3a 273 const struct in6_addr *saddr, const struct in6_addr *daddr,
1da177e4
LT
274 int proto, int len)
275{
276 struct ipv6_pinfo *np = inet6_sk(sk);
277 struct ipv6hdr *hdr;
1da177e4
LT
278
279 skb->protocol = htons(ETH_P_IPV6);
280 skb->dev = dev;
281
55f79cc0
ACM
282 skb_reset_network_header(skb);
283 skb_put(skb, sizeof(struct ipv6hdr));
0660e03f 284 hdr = ipv6_hdr(skb);
1da177e4 285
ae08e1f0 286 *(__be32*)hdr = htonl(0x60000000);
1da177e4
LT
287
288 hdr->payload_len = htons(len);
289 hdr->nexthdr = proto;
290 hdr->hop_limit = np->hop_limit;
291
4e3fd7a0
AD
292 hdr->saddr = *saddr;
293 hdr->daddr = *daddr;
1da177e4
LT
294
295 return 0;
296}
297
298static int ip6_call_ra_chain(struct sk_buff *skb, int sel)
299{
300 struct ip6_ra_chain *ra;
301 struct sock *last = NULL;
302
303 read_lock(&ip6_ra_lock);
304 for (ra = ip6_ra_chain; ra; ra = ra->next) {
305 struct sock *sk = ra->sk;
0bd1b59b
AM
306 if (sk && ra->sel == sel &&
307 (!sk->sk_bound_dev_if ||
308 sk->sk_bound_dev_if == skb->dev->ifindex)) {
1da177e4
LT
309 if (last) {
310 struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
311 if (skb2)
312 rawv6_rcv(last, skb2);
313 }
314 last = sk;
315 }
316 }
317
318 if (last) {
319 rawv6_rcv(last, skb);
320 read_unlock(&ip6_ra_lock);
321 return 1;
322 }
323 read_unlock(&ip6_ra_lock);
324 return 0;
325}
326
e21e0b5f
VN
327static int ip6_forward_proxy_check(struct sk_buff *skb)
328{
0660e03f 329 struct ipv6hdr *hdr = ipv6_hdr(skb);
e21e0b5f 330 u8 nexthdr = hdr->nexthdr;
75f2811c 331 __be16 frag_off;
e21e0b5f
VN
332 int offset;
333
334 if (ipv6_ext_hdr(nexthdr)) {
75f2811c 335 offset = ipv6_skip_exthdr(skb, sizeof(*hdr), &nexthdr, &frag_off);
e21e0b5f
VN
336 if (offset < 0)
337 return 0;
338 } else
339 offset = sizeof(struct ipv6hdr);
340
341 if (nexthdr == IPPROTO_ICMPV6) {
342 struct icmp6hdr *icmp6;
343
d56f90a7
ACM
344 if (!pskb_may_pull(skb, (skb_network_header(skb) +
345 offset + 1 - skb->data)))
e21e0b5f
VN
346 return 0;
347
d56f90a7 348 icmp6 = (struct icmp6hdr *)(skb_network_header(skb) + offset);
e21e0b5f
VN
349
350 switch (icmp6->icmp6_type) {
351 case NDISC_ROUTER_SOLICITATION:
352 case NDISC_ROUTER_ADVERTISEMENT:
353 case NDISC_NEIGHBOUR_SOLICITATION:
354 case NDISC_NEIGHBOUR_ADVERTISEMENT:
355 case NDISC_REDIRECT:
356 /* For reaction involving unicast neighbor discovery
357 * message destined to the proxied address, pass it to
358 * input function.
359 */
360 return 1;
361 default:
362 break;
363 }
364 }
365
74553b09
VN
366 /*
367 * The proxying router can't forward traffic sent to a link-local
368 * address, so signal the sender and discard the packet. This
369 * behavior is clarified by the MIPv6 specification.
370 */
371 if (ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) {
372 dst_link_failure(skb);
373 return -1;
374 }
375
e21e0b5f
VN
376 return 0;
377}
378
1da177e4
LT
379static inline int ip6_forward_finish(struct sk_buff *skb)
380{
381 return dst_output(skb);
382}
383
384int ip6_forward(struct sk_buff *skb)
385{
adf30907 386 struct dst_entry *dst = skb_dst(skb);
0660e03f 387 struct ipv6hdr *hdr = ipv6_hdr(skb);
1da177e4 388 struct inet6_skb_parm *opt = IP6CB(skb);
c346dca1 389 struct net *net = dev_net(dst->dev);
14f3ad6f 390 u32 mtu;
1ab1457c 391
53b7997f 392 if (net->ipv6.devconf_all->forwarding == 0)
1da177e4
LT
393 goto error;
394
4497b076
BH
395 if (skb_warn_if_lro(skb))
396 goto drop;
397
1da177e4 398 if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
3bd653c8 399 IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS);
1da177e4
LT
400 goto drop;
401 }
402
72b43d08
AK
403 if (skb->pkt_type != PACKET_HOST)
404 goto drop;
405
35fc92a9 406 skb_forward_csum(skb);
1da177e4
LT
407
408 /*
409 * We DO NOT make any processing on
410 * RA packets, pushing them to user level AS IS
411 * without ane WARRANTY that application will be able
412 * to interpret them. The reason is that we
413 * cannot make anything clever here.
414 *
415 * We are not end-node, so that if packet contains
416 * AH/ESP, we cannot make anything.
417 * Defragmentation also would be mistake, RA packets
418 * cannot be fragmented, because there is no warranty
419 * that different fragments will go along one path. --ANK
420 */
421 if (opt->ra) {
d56f90a7 422 u8 *ptr = skb_network_header(skb) + opt->ra;
1da177e4
LT
423 if (ip6_call_ra_chain(skb, (ptr[2]<<8) + ptr[3]))
424 return 0;
425 }
426
427 /*
428 * check and decrement ttl
429 */
430 if (hdr->hop_limit <= 1) {
431 /* Force OUTPUT device used as source address */
432 skb->dev = dst->dev;
3ffe533c 433 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0);
483a47d2
DL
434 IP6_INC_STATS_BH(net,
435 ip6_dst_idev(dst), IPSTATS_MIB_INHDRERRORS);
1da177e4
LT
436
437 kfree_skb(skb);
438 return -ETIMEDOUT;
439 }
440
fbea49e1 441 /* XXX: idev->cnf.proxy_ndp? */
53b7997f 442 if (net->ipv6.devconf_all->proxy_ndp &&
8a3edd80 443 pneigh_lookup(&nd_tbl, net, &hdr->daddr, skb->dev, 0)) {
74553b09
VN
444 int proxied = ip6_forward_proxy_check(skb);
445 if (proxied > 0)
e21e0b5f 446 return ip6_input(skb);
74553b09 447 else if (proxied < 0) {
3bd653c8
DL
448 IP6_INC_STATS(net, ip6_dst_idev(dst),
449 IPSTATS_MIB_INDISCARDS);
74553b09
VN
450 goto drop;
451 }
e21e0b5f
VN
452 }
453
1da177e4 454 if (!xfrm6_route_forward(skb)) {
3bd653c8 455 IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS);
1da177e4
LT
456 goto drop;
457 }
adf30907 458 dst = skb_dst(skb);
1da177e4
LT
459
460 /* IPv6 specs say nothing about it, but it is clear that we cannot
461 send redirects to source routed frames.
1e5dc146 462 We don't send redirects to frames decapsulated from IPsec.
1da177e4 463 */
c45a3dfb 464 if (skb->dev == dst->dev && opt->srcrt == 0 && !skb_sec_path(skb)) {
1da177e4
LT
465 struct in6_addr *target = NULL;
466 struct rt6_info *rt;
1da177e4
LT
467
468 /*
469 * incoming and outgoing devices are the same
470 * send a redirect.
471 */
472
473 rt = (struct rt6_info *) dst;
c45a3dfb
DM
474 if (rt->rt6i_flags & RTF_GATEWAY)
475 target = &rt->rt6i_gateway;
1da177e4
LT
476 else
477 target = &hdr->daddr;
478
92d86829
DM
479 if (!rt->rt6i_peer)
480 rt6_bind_peer(rt, 1);
481
1da177e4
LT
482 /* Limit redirects both by destination (here)
483 and by source (inside ndisc_send_redirect)
484 */
92d86829 485 if (inet_peer_xrlim_allow(rt->rt6i_peer, 1*HZ))
4991969a 486 ndisc_send_redirect(skb, target);
5bb1ab09
DS
487 } else {
488 int addrtype = ipv6_addr_type(&hdr->saddr);
489
1da177e4 490 /* This check is security critical. */
f81b2e7d
YH
491 if (addrtype == IPV6_ADDR_ANY ||
492 addrtype & (IPV6_ADDR_MULTICAST | IPV6_ADDR_LOOPBACK))
5bb1ab09
DS
493 goto error;
494 if (addrtype & IPV6_ADDR_LINKLOCAL) {
495 icmpv6_send(skb, ICMPV6_DEST_UNREACH,
3ffe533c 496 ICMPV6_NOT_NEIGHBOUR, 0);
5bb1ab09
DS
497 goto error;
498 }
1da177e4
LT
499 }
500
14f3ad6f
UW
501 mtu = dst_mtu(dst);
502 if (mtu < IPV6_MIN_MTU)
503 mtu = IPV6_MIN_MTU;
504
0aa68271 505 if (skb->len > mtu && !skb_is_gso(skb)) {
1da177e4
LT
506 /* Again, force OUTPUT device used as source address */
507 skb->dev = dst->dev;
14f3ad6f 508 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
483a47d2
DL
509 IP6_INC_STATS_BH(net,
510 ip6_dst_idev(dst), IPSTATS_MIB_INTOOBIGERRORS);
511 IP6_INC_STATS_BH(net,
512 ip6_dst_idev(dst), IPSTATS_MIB_FRAGFAILS);
1da177e4
LT
513 kfree_skb(skb);
514 return -EMSGSIZE;
515 }
516
517 if (skb_cow(skb, dst->dev->hard_header_len)) {
3bd653c8 518 IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
519 goto drop;
520 }
521
0660e03f 522 hdr = ipv6_hdr(skb);
1da177e4
LT
523
524 /* Mangling hops number delayed to point after skb COW */
1ab1457c 525
1da177e4
LT
526 hdr->hop_limit--;
527
483a47d2 528 IP6_INC_STATS_BH(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS);
2d8dbb04 529 IP6_ADD_STATS_BH(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTOCTETS, skb->len);
b2e0b385 530 return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD, skb, skb->dev, dst->dev,
6e23ae2a 531 ip6_forward_finish);
1da177e4
LT
532
533error:
483a47d2 534 IP6_INC_STATS_BH(net, ip6_dst_idev(dst), IPSTATS_MIB_INADDRERRORS);
1da177e4
LT
535drop:
536 kfree_skb(skb);
537 return -EINVAL;
538}
539
540static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
541{
542 to->pkt_type = from->pkt_type;
543 to->priority = from->priority;
544 to->protocol = from->protocol;
adf30907
ED
545 skb_dst_drop(to);
546 skb_dst_set(to, dst_clone(skb_dst(from)));
1da177e4 547 to->dev = from->dev;
82e91ffe 548 to->mark = from->mark;
1da177e4
LT
549
550#ifdef CONFIG_NET_SCHED
551 to->tc_index = from->tc_index;
552#endif
e7ac05f3 553 nf_copy(to, from);
ba9dda3a
JK
554#if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \
555 defined(CONFIG_NETFILTER_XT_TARGET_TRACE_MODULE)
556 to->nf_trace = from->nf_trace;
557#endif
984bc16c 558 skb_copy_secmark(to, from);
1da177e4
LT
559}
560
561int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr)
562{
563 u16 offset = sizeof(struct ipv6hdr);
0660e03f
ACM
564 struct ipv6_opt_hdr *exthdr =
565 (struct ipv6_opt_hdr *)(ipv6_hdr(skb) + 1);
27a884dc 566 unsigned int packet_len = skb->tail - skb->network_header;
1da177e4 567 int found_rhdr = 0;
0660e03f 568 *nexthdr = &ipv6_hdr(skb)->nexthdr;
1da177e4
LT
569
570 while (offset + 1 <= packet_len) {
571
572 switch (**nexthdr) {
573
574 case NEXTHDR_HOP:
27637df9 575 break;
1da177e4 576 case NEXTHDR_ROUTING:
27637df9
MN
577 found_rhdr = 1;
578 break;
1da177e4 579 case NEXTHDR_DEST:
59fbb3a6 580#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
27637df9
MN
581 if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0)
582 break;
583#endif
584 if (found_rhdr)
585 return offset;
1da177e4
LT
586 break;
587 default :
588 return offset;
589 }
27637df9
MN
590
591 offset += ipv6_optlen(exthdr);
592 *nexthdr = &exthdr->nexthdr;
d56f90a7
ACM
593 exthdr = (struct ipv6_opt_hdr *)(skb_network_header(skb) +
594 offset);
1da177e4
LT
595 }
596
597 return offset;
598}
599
87c48fa3
ED
600void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt)
601{
602 static atomic_t ipv6_fragmentation_id;
603 int old, new;
604
e688a604 605 if (rt && !(rt->dst.flags & DST_NOPEER)) {
87c48fa3
ED
606 struct inet_peer *peer;
607
608 if (!rt->rt6i_peer)
609 rt6_bind_peer(rt, 1);
610 peer = rt->rt6i_peer;
611 if (peer) {
612 fhdr->identification = htonl(inet_getid(peer, 0));
613 return;
614 }
615 }
616 do {
617 old = atomic_read(&ipv6_fragmentation_id);
618 new = old + 1;
619 if (!new)
620 new = 1;
621 } while (atomic_cmpxchg(&ipv6_fragmentation_id, old, new) != old);
622 fhdr->identification = htonl(new);
623}
624
ad0081e4 625int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
1da177e4 626{
1da177e4 627 struct sk_buff *frag;
adf30907 628 struct rt6_info *rt = (struct rt6_info*)skb_dst(skb);
d91675f9 629 struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL;
1da177e4
LT
630 struct ipv6hdr *tmp_hdr;
631 struct frag_hdr *fh;
632 unsigned int mtu, hlen, left, len;
a7ae1992 633 int hroom, troom;
ae08e1f0 634 __be32 frag_id = 0;
1da177e4
LT
635 int ptr, offset = 0, err=0;
636 u8 *prevhdr, nexthdr = 0;
adf30907 637 struct net *net = dev_net(skb_dst(skb)->dev);
1da177e4 638
1da177e4
LT
639 hlen = ip6_find_1stfragopt(skb, &prevhdr);
640 nexthdr = *prevhdr;
641
628a5c56 642 mtu = ip6_skb_dst_mtu(skb);
b881ef76
JH
643
644 /* We must not fragment if the socket is set to force MTU discovery
14f3ad6f 645 * or if the skb it not generated by a local socket.
b881ef76 646 */
a34a101e
ED
647 if (unlikely(!skb->local_df && skb->len > mtu)) {
648 if (skb->sk && dst_allfrag(skb_dst(skb)))
649 sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK);
650
adf30907 651 skb->dev = skb_dst(skb)->dev;
3ffe533c 652 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
adf30907 653 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
3bd653c8 654 IPSTATS_MIB_FRAGFAILS);
b881ef76
JH
655 kfree_skb(skb);
656 return -EMSGSIZE;
657 }
658
d91675f9
YH
659 if (np && np->frag_size < mtu) {
660 if (np->frag_size)
661 mtu = np->frag_size;
662 }
663 mtu -= hlen + sizeof(struct frag_hdr);
1da177e4 664
21dc3301 665 if (skb_has_frag_list(skb)) {
1da177e4 666 int first_len = skb_pagelen(skb);
3d13008e 667 struct sk_buff *frag2;
1da177e4
LT
668
669 if (first_len - hlen > mtu ||
670 ((first_len - hlen) & 7) ||
671 skb_cloned(skb))
672 goto slow_path;
673
4d9092bb 674 skb_walk_frags(skb, frag) {
1da177e4
LT
675 /* Correct geometry. */
676 if (frag->len > mtu ||
677 ((frag->len & 7) && frag->next) ||
678 skb_headroom(frag) < hlen)
3d13008e 679 goto slow_path_clean;
1da177e4 680
1da177e4
LT
681 /* Partially cloned skb? */
682 if (skb_shared(frag))
3d13008e 683 goto slow_path_clean;
2fdba6b0
HX
684
685 BUG_ON(frag->sk);
686 if (skb->sk) {
2fdba6b0
HX
687 frag->sk = skb->sk;
688 frag->destructor = sock_wfree;
2fdba6b0 689 }
3d13008e 690 skb->truesize -= frag->truesize;
1da177e4
LT
691 }
692
693 err = 0;
694 offset = 0;
695 frag = skb_shinfo(skb)->frag_list;
4d9092bb 696 skb_frag_list_init(skb);
1da177e4
LT
697 /* BUILD HEADER */
698
9a217a1c 699 *prevhdr = NEXTHDR_FRAGMENT;
d56f90a7 700 tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC);
1da177e4 701 if (!tmp_hdr) {
adf30907 702 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
3bd653c8 703 IPSTATS_MIB_FRAGFAILS);
1da177e4
LT
704 return -ENOMEM;
705 }
706
1da177e4
LT
707 __skb_pull(skb, hlen);
708 fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr));
e2d1bca7
ACM
709 __skb_push(skb, hlen);
710 skb_reset_network_header(skb);
d56f90a7 711 memcpy(skb_network_header(skb), tmp_hdr, hlen);
1da177e4 712
87c48fa3 713 ipv6_select_ident(fh, rt);
1da177e4
LT
714 fh->nexthdr = nexthdr;
715 fh->reserved = 0;
716 fh->frag_off = htons(IP6_MF);
717 frag_id = fh->identification;
718
719 first_len = skb_pagelen(skb);
720 skb->data_len = first_len - skb_headlen(skb);
721 skb->len = first_len;
0660e03f
ACM
722 ipv6_hdr(skb)->payload_len = htons(first_len -
723 sizeof(struct ipv6hdr));
a11d206d 724
d8d1f30b 725 dst_hold(&rt->dst);
1da177e4
LT
726
727 for (;;) {
728 /* Prepare header of the next frame,
729 * before previous one went down. */
730 if (frag) {
731 frag->ip_summed = CHECKSUM_NONE;
badff6d0 732 skb_reset_transport_header(frag);
1da177e4 733 fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr));
e2d1bca7
ACM
734 __skb_push(frag, hlen);
735 skb_reset_network_header(frag);
d56f90a7
ACM
736 memcpy(skb_network_header(frag), tmp_hdr,
737 hlen);
1da177e4
LT
738 offset += skb->len - hlen - sizeof(struct frag_hdr);
739 fh->nexthdr = nexthdr;
740 fh->reserved = 0;
741 fh->frag_off = htons(offset);
742 if (frag->next != NULL)
743 fh->frag_off |= htons(IP6_MF);
744 fh->identification = frag_id;
0660e03f
ACM
745 ipv6_hdr(frag)->payload_len =
746 htons(frag->len -
747 sizeof(struct ipv6hdr));
1da177e4
LT
748 ip6_copy_metadata(frag, skb);
749 }
1ab1457c 750
1da177e4 751 err = output(skb);
dafee490 752 if(!err)
d8d1f30b 753 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
3bd653c8 754 IPSTATS_MIB_FRAGCREATES);
dafee490 755
1da177e4
LT
756 if (err || !frag)
757 break;
758
759 skb = frag;
760 frag = skb->next;
761 skb->next = NULL;
762 }
763
a51482bd 764 kfree(tmp_hdr);
1da177e4
LT
765
766 if (err == 0) {
d8d1f30b 767 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
3bd653c8 768 IPSTATS_MIB_FRAGOKS);
d8d1f30b 769 dst_release(&rt->dst);
1da177e4
LT
770 return 0;
771 }
772
773 while (frag) {
774 skb = frag->next;
775 kfree_skb(frag);
776 frag = skb;
777 }
778
d8d1f30b 779 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
3bd653c8 780 IPSTATS_MIB_FRAGFAILS);
d8d1f30b 781 dst_release(&rt->dst);
1da177e4 782 return err;
3d13008e
ED
783
784slow_path_clean:
785 skb_walk_frags(skb, frag2) {
786 if (frag2 == frag)
787 break;
788 frag2->sk = NULL;
789 frag2->destructor = NULL;
790 skb->truesize += frag2->truesize;
791 }
1da177e4
LT
792 }
793
794slow_path:
72e843bb
ED
795 if ((skb->ip_summed == CHECKSUM_PARTIAL) &&
796 skb_checksum_help(skb))
797 goto fail;
798
1da177e4
LT
799 left = skb->len - hlen; /* Space per frame */
800 ptr = hlen; /* Where to start from */
801
802 /*
803 * Fragment the datagram.
804 */
805
806 *prevhdr = NEXTHDR_FRAGMENT;
a7ae1992
HX
807 hroom = LL_RESERVED_SPACE(rt->dst.dev);
808 troom = rt->dst.dev->needed_tailroom;
1da177e4
LT
809
810 /*
811 * Keep copying data until we run out.
812 */
813 while(left > 0) {
814 len = left;
815 /* IF: it doesn't fit, use 'mtu' - the data space left */
816 if (len > mtu)
817 len = mtu;
25985edc 818 /* IF: we are not sending up to and including the packet end
1da177e4
LT
819 then align the next start on an eight byte boundary */
820 if (len < left) {
821 len &= ~7;
822 }
823 /*
824 * Allocate buffer.
825 */
826
a7ae1992
HX
827 if ((frag = alloc_skb(len + hlen + sizeof(struct frag_hdr) +
828 hroom + troom, GFP_ATOMIC)) == NULL) {
64ce2073 829 NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n");
adf30907 830 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d 831 IPSTATS_MIB_FRAGFAILS);
1da177e4
LT
832 err = -ENOMEM;
833 goto fail;
834 }
835
836 /*
837 * Set up data on packet
838 */
839
840 ip6_copy_metadata(frag, skb);
a7ae1992 841 skb_reserve(frag, hroom);
1da177e4 842 skb_put(frag, len + hlen + sizeof(struct frag_hdr));
c1d2bbe1 843 skb_reset_network_header(frag);
badff6d0 844 fh = (struct frag_hdr *)(skb_network_header(frag) + hlen);
b0e380b1
ACM
845 frag->transport_header = (frag->network_header + hlen +
846 sizeof(struct frag_hdr));
1da177e4
LT
847
848 /*
849 * Charge the memory for the fragment to any owner
850 * it might possess
851 */
852 if (skb->sk)
853 skb_set_owner_w(frag, skb->sk);
854
855 /*
856 * Copy the packet header into the new buffer.
857 */
d626f62b 858 skb_copy_from_linear_data(skb, skb_network_header(frag), hlen);
1da177e4
LT
859
860 /*
861 * Build fragment header.
862 */
863 fh->nexthdr = nexthdr;
864 fh->reserved = 0;
f36d6ab1 865 if (!frag_id) {
87c48fa3 866 ipv6_select_ident(fh, rt);
1da177e4
LT
867 frag_id = fh->identification;
868 } else
869 fh->identification = frag_id;
870
871 /*
872 * Copy a block of the IP datagram.
873 */
8984e41d 874 if (skb_copy_bits(skb, ptr, skb_transport_header(frag), len))
1da177e4
LT
875 BUG();
876 left -= len;
877
878 fh->frag_off = htons(offset);
879 if (left > 0)
880 fh->frag_off |= htons(IP6_MF);
0660e03f
ACM
881 ipv6_hdr(frag)->payload_len = htons(frag->len -
882 sizeof(struct ipv6hdr));
1da177e4
LT
883
884 ptr += len;
885 offset += len;
886
887 /*
888 * Put this fragment into the sending queue.
889 */
1da177e4
LT
890 err = output(frag);
891 if (err)
892 goto fail;
dafee490 893
adf30907 894 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
3bd653c8 895 IPSTATS_MIB_FRAGCREATES);
1da177e4 896 }
adf30907 897 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d 898 IPSTATS_MIB_FRAGOKS);
808db80a 899 consume_skb(skb);
1da177e4
LT
900 return err;
901
902fail:
adf30907 903 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d 904 IPSTATS_MIB_FRAGFAILS);
1ab1457c 905 kfree_skb(skb);
1da177e4
LT
906 return err;
907}
908
b71d1d42
ED
909static inline int ip6_rt_check(const struct rt6key *rt_key,
910 const struct in6_addr *fl_addr,
911 const struct in6_addr *addr_cache)
cf6b1982 912{
a02cec21
ED
913 return (rt_key->plen != 128 || !ipv6_addr_equal(fl_addr, &rt_key->addr)) &&
914 (addr_cache == NULL || !ipv6_addr_equal(fl_addr, addr_cache));
cf6b1982
YH
915}
916
497c615a
HX
917static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
918 struct dst_entry *dst,
b71d1d42 919 const struct flowi6 *fl6)
1da177e4 920{
497c615a
HX
921 struct ipv6_pinfo *np = inet6_sk(sk);
922 struct rt6_info *rt = (struct rt6_info *)dst;
1da177e4 923
497c615a
HX
924 if (!dst)
925 goto out;
926
927 /* Yes, checking route validity in not connected
928 * case is not very simple. Take into account,
929 * that we do not support routing by source, TOS,
930 * and MSG_DONTROUTE --ANK (980726)
931 *
cf6b1982
YH
932 * 1. ip6_rt_check(): If route was host route,
933 * check that cached destination is current.
497c615a
HX
934 * If it is network route, we still may
935 * check its validity using saved pointer
936 * to the last used address: daddr_cache.
937 * We do not want to save whole address now,
938 * (because main consumer of this service
939 * is tcp, which has not this problem),
940 * so that the last trick works only on connected
941 * sockets.
942 * 2. oif also should be the same.
943 */
4c9483b2 944 if (ip6_rt_check(&rt->rt6i_dst, &fl6->daddr, np->daddr_cache) ||
8e1ef0a9 945#ifdef CONFIG_IPV6_SUBTREES
4c9483b2 946 ip6_rt_check(&rt->rt6i_src, &fl6->saddr, np->saddr_cache) ||
8e1ef0a9 947#endif
4c9483b2 948 (fl6->flowi6_oif && fl6->flowi6_oif != dst->dev->ifindex)) {
497c615a
HX
949 dst_release(dst);
950 dst = NULL;
1da177e4
LT
951 }
952
497c615a
HX
953out:
954 return dst;
955}
956
957static int ip6_dst_lookup_tail(struct sock *sk,
4c9483b2 958 struct dst_entry **dst, struct flowi6 *fl6)
497c615a 959{
3b1e0a65 960 struct net *net = sock_net(sk);
69cce1d1
DM
961#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
962 struct neighbour *n;
963#endif
964 int err;
497c615a 965
1da177e4 966 if (*dst == NULL)
4c9483b2 967 *dst = ip6_route_output(net, sk, fl6);
1da177e4
LT
968
969 if ((err = (*dst)->error))
970 goto out_err_release;
971
4c9483b2 972 if (ipv6_addr_any(&fl6->saddr)) {
c3968a85
DW
973 struct rt6_info *rt = (struct rt6_info *) *dst;
974 err = ip6_route_get_saddr(net, rt, &fl6->daddr,
975 sk ? inet6_sk(sk)->srcprefs : 0,
976 &fl6->saddr);
44456d37 977 if (err)
1da177e4 978 goto out_err_release;
1da177e4
LT
979 }
980
95c385b4 981#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
e550dfb0
NH
982 /*
983 * Here if the dst entry we've looked up
984 * has a neighbour entry that is in the INCOMPLETE
985 * state and the src address from the flow is
986 * marked as OPTIMISTIC, we release the found
987 * dst entry and replace it instead with the
988 * dst entry of the nexthop router
989 */
f2c31e32 990 rcu_read_lock();
27217455 991 n = dst_get_neighbour_noref(*dst);
69cce1d1 992 if (n && !(n->nud_state & NUD_VALID)) {
e550dfb0 993 struct inet6_ifaddr *ifp;
4c9483b2 994 struct flowi6 fl_gw6;
e550dfb0
NH
995 int redirect;
996
f2c31e32 997 rcu_read_unlock();
4c9483b2 998 ifp = ipv6_get_ifaddr(net, &fl6->saddr,
e550dfb0
NH
999 (*dst)->dev, 1);
1000
1001 redirect = (ifp && ifp->flags & IFA_F_OPTIMISTIC);
1002 if (ifp)
1003 in6_ifa_put(ifp);
1004
1005 if (redirect) {
1006 /*
1007 * We need to get the dst entry for the
1008 * default router instead
1009 */
1010 dst_release(*dst);
4c9483b2
DM
1011 memcpy(&fl_gw6, fl6, sizeof(struct flowi6));
1012 memset(&fl_gw6.daddr, 0, sizeof(struct in6_addr));
1013 *dst = ip6_route_output(net, sk, &fl_gw6);
e550dfb0
NH
1014 if ((err = (*dst)->error))
1015 goto out_err_release;
95c385b4 1016 }
f2c31e32
ED
1017 } else {
1018 rcu_read_unlock();
e550dfb0 1019 }
95c385b4
NH
1020#endif
1021
1da177e4
LT
1022 return 0;
1023
1024out_err_release:
ca46f9c8 1025 if (err == -ENETUNREACH)
483a47d2 1026 IP6_INC_STATS_BH(net, NULL, IPSTATS_MIB_OUTNOROUTES);
1da177e4
LT
1027 dst_release(*dst);
1028 *dst = NULL;
1029 return err;
1030}
34a0b3cd 1031
497c615a
HX
1032/**
1033 * ip6_dst_lookup - perform route lookup on flow
1034 * @sk: socket which provides route info
1035 * @dst: pointer to dst_entry * for result
4c9483b2 1036 * @fl6: flow to lookup
497c615a
HX
1037 *
1038 * This function performs a route lookup on the given flow.
1039 *
1040 * It returns zero on success, or a standard errno code on error.
1041 */
4c9483b2 1042int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6)
497c615a
HX
1043{
1044 *dst = NULL;
4c9483b2 1045 return ip6_dst_lookup_tail(sk, dst, fl6);
497c615a 1046}
3cf3dc6c
ACM
1047EXPORT_SYMBOL_GPL(ip6_dst_lookup);
1048
497c615a 1049/**
68d0c6d3
DM
1050 * ip6_dst_lookup_flow - perform route lookup on flow with ipsec
1051 * @sk: socket which provides route info
4c9483b2 1052 * @fl6: flow to lookup
68d0c6d3 1053 * @final_dst: final destination address for ipsec lookup
a1414715 1054 * @can_sleep: we are in a sleepable context
68d0c6d3
DM
1055 *
1056 * This function performs a route lookup on the given flow.
1057 *
1058 * It returns a valid dst pointer on success, or a pointer encoded
1059 * error code.
1060 */
4c9483b2 1061struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
68d0c6d3 1062 const struct in6_addr *final_dst,
a1414715 1063 bool can_sleep)
68d0c6d3
DM
1064{
1065 struct dst_entry *dst = NULL;
1066 int err;
1067
4c9483b2 1068 err = ip6_dst_lookup_tail(sk, &dst, fl6);
68d0c6d3
DM
1069 if (err)
1070 return ERR_PTR(err);
1071 if (final_dst)
4e3fd7a0 1072 fl6->daddr = *final_dst;
2774c131 1073 if (can_sleep)
4c9483b2 1074 fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
2774c131 1075
4c9483b2 1076 return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
68d0c6d3
DM
1077}
1078EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
1079
1080/**
1081 * ip6_sk_dst_lookup_flow - perform socket cached route lookup on flow
497c615a 1082 * @sk: socket which provides the dst cache and route info
4c9483b2 1083 * @fl6: flow to lookup
68d0c6d3 1084 * @final_dst: final destination address for ipsec lookup
a1414715 1085 * @can_sleep: we are in a sleepable context
497c615a
HX
1086 *
1087 * This function performs a route lookup on the given flow with the
1088 * possibility of using the cached route in the socket if it is valid.
1089 * It will take the socket dst lock when operating on the dst cache.
1090 * As a result, this function can only be used in process context.
1091 *
68d0c6d3
DM
1092 * It returns a valid dst pointer on success, or a pointer encoded
1093 * error code.
497c615a 1094 */
4c9483b2 1095struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
68d0c6d3 1096 const struct in6_addr *final_dst,
a1414715 1097 bool can_sleep)
497c615a 1098{
68d0c6d3
DM
1099 struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
1100 int err;
497c615a 1101
4c9483b2 1102 dst = ip6_sk_dst_check(sk, dst, fl6);
68d0c6d3 1103
4c9483b2 1104 err = ip6_dst_lookup_tail(sk, &dst, fl6);
68d0c6d3
DM
1105 if (err)
1106 return ERR_PTR(err);
1107 if (final_dst)
4e3fd7a0 1108 fl6->daddr = *final_dst;
2774c131 1109 if (can_sleep)
4c9483b2 1110 fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
2774c131 1111
4c9483b2 1112 return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
497c615a 1113}
68d0c6d3 1114EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
497c615a 1115
34a0b3cd 1116static inline int ip6_ufo_append_data(struct sock *sk,
e89e9cf5
AR
1117 int getfrag(void *from, char *to, int offset, int len,
1118 int odd, struct sk_buff *skb),
1119 void *from, int length, int hh_len, int fragheaderlen,
87c48fa3
ED
1120 int transhdrlen, int mtu,unsigned int flags,
1121 struct rt6_info *rt)
e89e9cf5
AR
1122
1123{
1124 struct sk_buff *skb;
1125 int err;
1126
1127 /* There is support for UDP large send offload by network
1128 * device, so create one single skb packet containing complete
1129 * udp datagram
1130 */
1131 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {
1132 skb = sock_alloc_send_skb(sk,
1133 hh_len + fragheaderlen + transhdrlen + 20,
1134 (flags & MSG_DONTWAIT), &err);
1135 if (skb == NULL)
504744e4 1136 return err;
e89e9cf5
AR
1137
1138 /* reserve space for Hardware header */
1139 skb_reserve(skb, hh_len);
1140
1141 /* create space for UDP/IP header */
1142 skb_put(skb,fragheaderlen + transhdrlen);
1143
1144 /* initialize network header pointer */
c1d2bbe1 1145 skb_reset_network_header(skb);
e89e9cf5
AR
1146
1147 /* initialize protocol header pointer */
b0e380b1 1148 skb->transport_header = skb->network_header + fragheaderlen;
e89e9cf5 1149
84fa7933 1150 skb->ip_summed = CHECKSUM_PARTIAL;
e89e9cf5 1151 skb->csum = 0;
e89e9cf5
AR
1152 }
1153
1154 err = skb_append_datato_frags(sk,skb, getfrag, from,
1155 (length - transhdrlen));
1156 if (!err) {
1157 struct frag_hdr fhdr;
1158
c31d5326
SS
1159 /* Specify the length of each IPv6 datagram fragment.
1160 * It has to be a multiple of 8.
1161 */
1162 skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
1163 sizeof(struct frag_hdr)) & ~7;
f83ef8c0 1164 skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
87c48fa3 1165 ipv6_select_ident(&fhdr, rt);
e89e9cf5
AR
1166 skb_shinfo(skb)->ip6_frag_id = fhdr.identification;
1167 __skb_queue_tail(&sk->sk_write_queue, skb);
1168
1169 return 0;
1170 }
1171 /* There is not enough support do UPD LSO,
1172 * so follow normal path
1173 */
1174 kfree_skb(skb);
1175
1176 return err;
1177}
1da177e4 1178
0178b695
HX
1179static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
1180 gfp_t gfp)
1181{
1182 return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
1183}
1184
1185static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
1186 gfp_t gfp)
1187{
1188 return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
1189}
1190
0c183379
G
1191static void ip6_append_data_mtu(int *mtu,
1192 int *maxfraglen,
1193 unsigned int fragheaderlen,
1194 struct sk_buff *skb,
1195 struct rt6_info *rt)
1196{
1197 if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
1198 if (skb == NULL) {
1199 /* first fragment, reserve header_len */
1200 *mtu = *mtu - rt->dst.header_len;
1201
1202 } else {
1203 /*
1204 * this fragment is not first, the headers
1205 * space is regarded as data space.
1206 */
1207 *mtu = dst_mtu(rt->dst.path);
1208 }
1209 *maxfraglen = ((*mtu - fragheaderlen) & ~7)
1210 + fragheaderlen - sizeof(struct frag_hdr);
1211 }
1212}
1213
41a1f8ea
YH
1214int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
1215 int offset, int len, int odd, struct sk_buff *skb),
1216 void *from, int length, int transhdrlen,
4c9483b2 1217 int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,
13b52cd4 1218 struct rt6_info *rt, unsigned int flags, int dontfrag)
1da177e4
LT
1219{
1220 struct inet_sock *inet = inet_sk(sk);
1221 struct ipv6_pinfo *np = inet6_sk(sk);
bdc712b4 1222 struct inet_cork *cork;
0c183379 1223 struct sk_buff *skb, *skb_prev = NULL;
1da177e4
LT
1224 unsigned int maxfraglen, fragheaderlen;
1225 int exthdrlen;
299b0767 1226 int dst_exthdrlen;
1da177e4
LT
1227 int hh_len;
1228 int mtu;
1229 int copy;
1230 int err;
1231 int offset = 0;
a693e698 1232 __u8 tx_flags = 0;
1da177e4
LT
1233
1234 if (flags&MSG_PROBE)
1235 return 0;
bdc712b4 1236 cork = &inet->cork.base;
1da177e4
LT
1237 if (skb_queue_empty(&sk->sk_write_queue)) {
1238 /*
1239 * setup for corking
1240 */
1241 if (opt) {
0178b695 1242 if (WARN_ON(np->cork.opt))
1da177e4 1243 return -EINVAL;
0178b695
HX
1244
1245 np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
1246 if (unlikely(np->cork.opt == NULL))
1247 return -ENOBUFS;
1248
1249 np->cork.opt->tot_len = opt->tot_len;
1250 np->cork.opt->opt_flen = opt->opt_flen;
1251 np->cork.opt->opt_nflen = opt->opt_nflen;
1252
1253 np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt,
1254 sk->sk_allocation);
1255 if (opt->dst0opt && !np->cork.opt->dst0opt)
1256 return -ENOBUFS;
1257
1258 np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt,
1259 sk->sk_allocation);
1260 if (opt->dst1opt && !np->cork.opt->dst1opt)
1261 return -ENOBUFS;
1262
1263 np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt,
1264 sk->sk_allocation);
1265 if (opt->hopopt && !np->cork.opt->hopopt)
1266 return -ENOBUFS;
1267
1268 np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt,
1269 sk->sk_allocation);
1270 if (opt->srcrt && !np->cork.opt->srcrt)
1271 return -ENOBUFS;
1272
1da177e4
LT
1273 /* need source address above miyazawa*/
1274 }
d8d1f30b 1275 dst_hold(&rt->dst);
bdc712b4 1276 cork->dst = &rt->dst;
4c9483b2 1277 inet->cork.fl.u.ip6 = *fl6;
1da177e4 1278 np->cork.hop_limit = hlimit;
41a1f8ea 1279 np->cork.tclass = tclass;
0c183379
G
1280 if (rt->dst.flags & DST_XFRM_TUNNEL)
1281 mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
1282 rt->dst.dev->mtu : dst_mtu(&rt->dst);
1283 else
1284 mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
1285 rt->dst.dev->mtu : dst_mtu(rt->dst.path);
c7503609 1286 if (np->frag_size < mtu) {
d91675f9
YH
1287 if (np->frag_size)
1288 mtu = np->frag_size;
1289 }
bdc712b4 1290 cork->fragsize = mtu;
d8d1f30b 1291 if (dst_allfrag(rt->dst.path))
bdc712b4
DM
1292 cork->flags |= IPCORK_ALLFRAG;
1293 cork->length = 0;
1da177e4
LT
1294 sk->sk_sndmsg_page = NULL;
1295 sk->sk_sndmsg_off = 0;
299b0767 1296 exthdrlen = (opt ? opt->opt_flen : 0) - rt->rt6i_nfheader_len;
1da177e4
LT
1297 length += exthdrlen;
1298 transhdrlen += exthdrlen;
299b0767 1299 dst_exthdrlen = rt->dst.header_len;
1da177e4 1300 } else {
bdc712b4 1301 rt = (struct rt6_info *)cork->dst;
4c9483b2 1302 fl6 = &inet->cork.fl.u.ip6;
0178b695 1303 opt = np->cork.opt;
1da177e4
LT
1304 transhdrlen = 0;
1305 exthdrlen = 0;
299b0767 1306 dst_exthdrlen = 0;
bdc712b4 1307 mtu = cork->fragsize;
1da177e4
LT
1308 }
1309
d8d1f30b 1310 hh_len = LL_RESERVED_SPACE(rt->dst.dev);
1da177e4 1311
a1b05140 1312 fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
b4ce9277 1313 (opt ? opt->opt_nflen : 0);
1da177e4
LT
1314 maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen - sizeof(struct frag_hdr);
1315
1316 if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
bdc712b4 1317 if (cork->length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {
4c9483b2 1318 ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);
1da177e4
LT
1319 return -EMSGSIZE;
1320 }
1321 }
1322
a693e698
AB
1323 /* For UDP, check if TX timestamp is enabled */
1324 if (sk->sk_type == SOCK_DGRAM) {
1325 err = sock_tx_timestamp(sk, &tx_flags);
1326 if (err)
1327 goto error;
1328 }
1329
1da177e4
LT
1330 /*
1331 * Let's try using as much space as possible.
1332 * Use MTU if total length of the message fits into the MTU.
1333 * Otherwise, we need to reserve fragment header and
1334 * fragment alignment (= 8-15 octects, in total).
1335 *
1336 * Note that we may need to "move" the data from the tail of
1ab1457c 1337 * of the buffer to the new fragment when we split
1da177e4
LT
1338 * the message.
1339 *
1ab1457c 1340 * FIXME: It may be fragmented into multiple chunks
1da177e4
LT
1341 * at once if non-fragmentable extension headers
1342 * are too large.
1ab1457c 1343 * --yoshfuji
1da177e4
LT
1344 */
1345
bdc712b4 1346 cork->length += length;
4b340ae2
BH
1347 if (length > mtu) {
1348 int proto = sk->sk_protocol;
1349 if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){
4c9483b2 1350 ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
4b340ae2
BH
1351 return -EMSGSIZE;
1352 }
e89e9cf5 1353
4b340ae2 1354 if (proto == IPPROTO_UDP &&
d8d1f30b 1355 (rt->dst.dev->features & NETIF_F_UFO)) {
4b340ae2
BH
1356
1357 err = ip6_ufo_append_data(sk, getfrag, from, length,
1358 hh_len, fragheaderlen,
87c48fa3 1359 transhdrlen, mtu, flags, rt);
4b340ae2
BH
1360 if (err)
1361 goto error;
1362 return 0;
1363 }
e89e9cf5 1364 }
1da177e4
LT
1365
1366 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL)
1367 goto alloc_new_skb;
1368
1369 while (length > 0) {
1370 /* Check if the remaining data fits into current packet. */
bdc712b4 1371 copy = (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - skb->len;
1da177e4
LT
1372 if (copy < length)
1373 copy = maxfraglen - skb->len;
1374
1375 if (copy <= 0) {
1376 char *data;
1377 unsigned int datalen;
1378 unsigned int fraglen;
1379 unsigned int fraggap;
1380 unsigned int alloclen;
1da177e4 1381alloc_new_skb:
1da177e4 1382 /* There's no room in the current skb */
0c183379
G
1383 if (skb)
1384 fraggap = skb->len - maxfraglen;
1da177e4
LT
1385 else
1386 fraggap = 0;
0c183379
G
1387 /* update mtu and maxfraglen if necessary */
1388 if (skb == NULL || skb_prev == NULL)
1389 ip6_append_data_mtu(&mtu, &maxfraglen,
1390 fragheaderlen, skb, rt);
1391
1392 skb_prev = skb;
1da177e4
LT
1393
1394 /*
1395 * If remaining data exceeds the mtu,
1396 * we know we need more fragment(s).
1397 */
1398 datalen = length + fraggap;
1da177e4 1399
0c183379
G
1400 if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen)
1401 datalen = maxfraglen - fragheaderlen - rt->dst.trailer_len;
1da177e4 1402 if ((flags & MSG_MORE) &&
d8d1f30b 1403 !(rt->dst.dev->features&NETIF_F_SG))
1da177e4
LT
1404 alloclen = mtu;
1405 else
1406 alloclen = datalen + fragheaderlen;
1407
299b0767
SK
1408 alloclen += dst_exthdrlen;
1409
0c183379
G
1410 if (datalen != length + fraggap) {
1411 /*
1412 * this is not the last fragment, the trailer
1413 * space is regarded as data space.
1414 */
1415 datalen += rt->dst.trailer_len;
1416 }
1417
1418 alloclen += rt->dst.trailer_len;
1419 fraglen = datalen + fragheaderlen;
1da177e4
LT
1420
1421 /*
1422 * We just reserve space for fragment header.
1ab1457c 1423 * Note: this may be overallocation if the message
1da177e4
LT
1424 * (without MSG_MORE) fits into the MTU.
1425 */
1426 alloclen += sizeof(struct frag_hdr);
1427
1428 if (transhdrlen) {
1429 skb = sock_alloc_send_skb(sk,
1430 alloclen + hh_len,
1431 (flags & MSG_DONTWAIT), &err);
1432 } else {
1433 skb = NULL;
1434 if (atomic_read(&sk->sk_wmem_alloc) <=
1435 2 * sk->sk_sndbuf)
1436 skb = sock_wmalloc(sk,
1437 alloclen + hh_len, 1,
1438 sk->sk_allocation);
1439 if (unlikely(skb == NULL))
1440 err = -ENOBUFS;
a693e698
AB
1441 else {
1442 /* Only the initial fragment
1443 * is time stamped.
1444 */
1445 tx_flags = 0;
1446 }
1da177e4
LT
1447 }
1448 if (skb == NULL)
1449 goto error;
1450 /*
1451 * Fill in the control structures
1452 */
d7f7c0ac 1453 skb->ip_summed = CHECKSUM_NONE;
1da177e4 1454 skb->csum = 0;
1f85851e
G
1455 /* reserve for fragmentation and ipsec header */
1456 skb_reserve(skb, hh_len + sizeof(struct frag_hdr) +
1457 dst_exthdrlen);
1da177e4 1458
a693e698
AB
1459 if (sk->sk_type == SOCK_DGRAM)
1460 skb_shinfo(skb)->tx_flags = tx_flags;
1461
1da177e4
LT
1462 /*
1463 * Find where to start putting bytes
1464 */
1f85851e
G
1465 data = skb_put(skb, fraglen);
1466 skb_set_network_header(skb, exthdrlen);
1467 data += fragheaderlen;
b0e380b1
ACM
1468 skb->transport_header = (skb->network_header +
1469 fragheaderlen);
1da177e4
LT
1470 if (fraggap) {
1471 skb->csum = skb_copy_and_csum_bits(
1472 skb_prev, maxfraglen,
1473 data + transhdrlen, fraggap, 0);
1474 skb_prev->csum = csum_sub(skb_prev->csum,
1475 skb->csum);
1476 data += fraggap;
e9fa4f7b 1477 pskb_trim_unique(skb_prev, maxfraglen);
1da177e4
LT
1478 }
1479 copy = datalen - transhdrlen - fraggap;
299b0767 1480
1da177e4
LT
1481 if (copy < 0) {
1482 err = -EINVAL;
1483 kfree_skb(skb);
1484 goto error;
1485 } else if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) {
1486 err = -EFAULT;
1487 kfree_skb(skb);
1488 goto error;
1489 }
1490
1491 offset += copy;
1492 length -= datalen - fraggap;
1493 transhdrlen = 0;
1494 exthdrlen = 0;
299b0767 1495 dst_exthdrlen = 0;
1da177e4
LT
1496
1497 /*
1498 * Put the packet on the pending queue
1499 */
1500 __skb_queue_tail(&sk->sk_write_queue, skb);
1501 continue;
1502 }
1503
1504 if (copy > length)
1505 copy = length;
1506
d8d1f30b 1507 if (!(rt->dst.dev->features&NETIF_F_SG)) {
1da177e4
LT
1508 unsigned int off;
1509
1510 off = skb->len;
1511 if (getfrag(from, skb_put(skb, copy),
1512 offset, copy, off, skb) < 0) {
1513 __skb_trim(skb, off);
1514 err = -EFAULT;
1515 goto error;
1516 }
1517 } else {
1518 int i = skb_shinfo(skb)->nr_frags;
1519 skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1];
1520 struct page *page = sk->sk_sndmsg_page;
1521 int off = sk->sk_sndmsg_off;
1522 unsigned int left;
1523
1524 if (page && (left = PAGE_SIZE - off) > 0) {
1525 if (copy >= left)
1526 copy = left;
408dadf0 1527 if (page != skb_frag_page(frag)) {
1da177e4
LT
1528 if (i == MAX_SKB_FRAGS) {
1529 err = -EMSGSIZE;
1530 goto error;
1531 }
1da177e4 1532 skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
408dadf0 1533 skb_frag_ref(skb, i);
1da177e4
LT
1534 frag = &skb_shinfo(skb)->frags[i];
1535 }
1536 } else if(i < MAX_SKB_FRAGS) {
1537 if (copy > PAGE_SIZE)
1538 copy = PAGE_SIZE;
1539 page = alloc_pages(sk->sk_allocation, 0);
1540 if (page == NULL) {
1541 err = -ENOMEM;
1542 goto error;
1543 }
1544 sk->sk_sndmsg_page = page;
1545 sk->sk_sndmsg_off = 0;
1546
1547 skb_fill_page_desc(skb, i, page, 0, 0);
1548 frag = &skb_shinfo(skb)->frags[i];
1da177e4
LT
1549 } else {
1550 err = -EMSGSIZE;
1551 goto error;
1552 }
9e903e08
ED
1553 if (getfrag(from,
1554 skb_frag_address(frag) + skb_frag_size(frag),
408dadf0 1555 offset, copy, skb->len, skb) < 0) {
1da177e4
LT
1556 err = -EFAULT;
1557 goto error;
1558 }
1559 sk->sk_sndmsg_off += copy;
9e903e08 1560 skb_frag_size_add(frag, copy);
1da177e4
LT
1561 skb->len += copy;
1562 skb->data_len += copy;
f945fa7a
HX
1563 skb->truesize += copy;
1564 atomic_add(copy, &sk->sk_wmem_alloc);
1da177e4
LT
1565 }
1566 offset += copy;
1567 length -= copy;
1568 }
1569 return 0;
1570error:
bdc712b4 1571 cork->length -= length;
3bd653c8 1572 IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
1573 return err;
1574}
a495f836 1575EXPORT_SYMBOL_GPL(ip6_append_data);
1da177e4 1576
bf138862
PE
1577static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)
1578{
0178b695
HX
1579 if (np->cork.opt) {
1580 kfree(np->cork.opt->dst0opt);
1581 kfree(np->cork.opt->dst1opt);
1582 kfree(np->cork.opt->hopopt);
1583 kfree(np->cork.opt->srcrt);
1584 kfree(np->cork.opt);
1585 np->cork.opt = NULL;
1586 }
1587
bdc712b4
DM
1588 if (inet->cork.base.dst) {
1589 dst_release(inet->cork.base.dst);
1590 inet->cork.base.dst = NULL;
1591 inet->cork.base.flags &= ~IPCORK_ALLFRAG;
bf138862
PE
1592 }
1593 memset(&inet->cork.fl, 0, sizeof(inet->cork.fl));
1594}
1595
1da177e4
LT
1596int ip6_push_pending_frames(struct sock *sk)
1597{
1598 struct sk_buff *skb, *tmp_skb;
1599 struct sk_buff **tail_skb;
1600 struct in6_addr final_dst_buf, *final_dst = &final_dst_buf;
1601 struct inet_sock *inet = inet_sk(sk);
1602 struct ipv6_pinfo *np = inet6_sk(sk);
3bd653c8 1603 struct net *net = sock_net(sk);
1da177e4
LT
1604 struct ipv6hdr *hdr;
1605 struct ipv6_txoptions *opt = np->cork.opt;
bdc712b4 1606 struct rt6_info *rt = (struct rt6_info *)inet->cork.base.dst;
4c9483b2
DM
1607 struct flowi6 *fl6 = &inet->cork.fl.u.ip6;
1608 unsigned char proto = fl6->flowi6_proto;
1da177e4
LT
1609 int err = 0;
1610
1611 if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL)
1612 goto out;
1613 tail_skb = &(skb_shinfo(skb)->frag_list);
1614
1615 /* move skb->data to ip header from ext header */
d56f90a7 1616 if (skb->data < skb_network_header(skb))
bbe735e4 1617 __skb_pull(skb, skb_network_offset(skb));
1da177e4 1618 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
cfe1fc77 1619 __skb_pull(tmp_skb, skb_network_header_len(skb));
1da177e4
LT
1620 *tail_skb = tmp_skb;
1621 tail_skb = &(tmp_skb->next);
1622 skb->len += tmp_skb->len;
1623 skb->data_len += tmp_skb->len;
1da177e4 1624 skb->truesize += tmp_skb->truesize;
1da177e4
LT
1625 tmp_skb->destructor = NULL;
1626 tmp_skb->sk = NULL;
1da177e4
LT
1627 }
1628
28a89453 1629 /* Allow local fragmentation. */
b5c15fc0 1630 if (np->pmtudisc < IPV6_PMTUDISC_DO)
28a89453
HX
1631 skb->local_df = 1;
1632
4e3fd7a0 1633 *final_dst = fl6->daddr;
cfe1fc77 1634 __skb_pull(skb, skb_network_header_len(skb));
1da177e4
LT
1635 if (opt && opt->opt_flen)
1636 ipv6_push_frag_opts(skb, opt, &proto);
1637 if (opt && opt->opt_nflen)
1638 ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst);
1639
e2d1bca7
ACM
1640 skb_push(skb, sizeof(struct ipv6hdr));
1641 skb_reset_network_header(skb);
0660e03f 1642 hdr = ipv6_hdr(skb);
1ab1457c 1643
4c9483b2 1644 *(__be32*)hdr = fl6->flowlabel |
41a1f8ea 1645 htonl(0x60000000 | ((int)np->cork.tclass << 20));
1da177e4 1646
1da177e4
LT
1647 hdr->hop_limit = np->cork.hop_limit;
1648 hdr->nexthdr = proto;
4e3fd7a0
AD
1649 hdr->saddr = fl6->saddr;
1650 hdr->daddr = *final_dst;
1da177e4 1651
a2c2064f 1652 skb->priority = sk->sk_priority;
4a19ec58 1653 skb->mark = sk->sk_mark;
a2c2064f 1654
d8d1f30b 1655 skb_dst_set(skb, dst_clone(&rt->dst));
edf391ff 1656 IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
14878f75 1657 if (proto == IPPROTO_ICMPV6) {
adf30907 1658 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
14878f75 1659
5a57d4c7 1660 ICMP6MSGOUT_INC_STATS_BH(net, idev, icmp6_hdr(skb)->icmp6_type);
e41b5368 1661 ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS);
14878f75
DS
1662 }
1663
ef76bc23 1664 err = ip6_local_out(skb);
1da177e4
LT
1665 if (err) {
1666 if (err > 0)
6ce9e7b5 1667 err = net_xmit_errno(err);
1da177e4
LT
1668 if (err)
1669 goto error;
1670 }
1671
1672out:
bf138862 1673 ip6_cork_release(inet, np);
1da177e4
LT
1674 return err;
1675error:
06254914 1676 IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
1677 goto out;
1678}
a495f836 1679EXPORT_SYMBOL_GPL(ip6_push_pending_frames);
1da177e4
LT
1680
1681void ip6_flush_pending_frames(struct sock *sk)
1682{
1da177e4
LT
1683 struct sk_buff *skb;
1684
1685 while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) {
adf30907
ED
1686 if (skb_dst(skb))
1687 IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb_dst(skb)),
e1f52208 1688 IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
1689 kfree_skb(skb);
1690 }
1691
bf138862 1692 ip6_cork_release(inet_sk(sk), inet6_sk(sk));
1da177e4 1693}
a495f836 1694EXPORT_SYMBOL_GPL(ip6_flush_pending_frames);