appletalk: Remove out of date message in printk
[linux-2.6-block.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);
b2e0b385 529 return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD, skb, skb->dev, dst->dev,
6e23ae2a 530 ip6_forward_finish);
1da177e4
LT
531
532error:
483a47d2 533 IP6_INC_STATS_BH(net, ip6_dst_idev(dst), IPSTATS_MIB_INADDRERRORS);
1da177e4
LT
534drop:
535 kfree_skb(skb);
536 return -EINVAL;
537}
538
539static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
540{
541 to->pkt_type = from->pkt_type;
542 to->priority = from->priority;
543 to->protocol = from->protocol;
adf30907
ED
544 skb_dst_drop(to);
545 skb_dst_set(to, dst_clone(skb_dst(from)));
1da177e4 546 to->dev = from->dev;
82e91ffe 547 to->mark = from->mark;
1da177e4
LT
548
549#ifdef CONFIG_NET_SCHED
550 to->tc_index = from->tc_index;
551#endif
e7ac05f3 552 nf_copy(to, from);
ba9dda3a
JK
553#if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \
554 defined(CONFIG_NETFILTER_XT_TARGET_TRACE_MODULE)
555 to->nf_trace = from->nf_trace;
556#endif
984bc16c 557 skb_copy_secmark(to, from);
1da177e4
LT
558}
559
560int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr)
561{
562 u16 offset = sizeof(struct ipv6hdr);
0660e03f
ACM
563 struct ipv6_opt_hdr *exthdr =
564 (struct ipv6_opt_hdr *)(ipv6_hdr(skb) + 1);
27a884dc 565 unsigned int packet_len = skb->tail - skb->network_header;
1da177e4 566 int found_rhdr = 0;
0660e03f 567 *nexthdr = &ipv6_hdr(skb)->nexthdr;
1da177e4
LT
568
569 while (offset + 1 <= packet_len) {
570
571 switch (**nexthdr) {
572
573 case NEXTHDR_HOP:
27637df9 574 break;
1da177e4 575 case NEXTHDR_ROUTING:
27637df9
MN
576 found_rhdr = 1;
577 break;
1da177e4 578 case NEXTHDR_DEST:
59fbb3a6 579#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
27637df9
MN
580 if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0)
581 break;
582#endif
583 if (found_rhdr)
584 return offset;
1da177e4
LT
585 break;
586 default :
587 return offset;
588 }
27637df9
MN
589
590 offset += ipv6_optlen(exthdr);
591 *nexthdr = &exthdr->nexthdr;
d56f90a7
ACM
592 exthdr = (struct ipv6_opt_hdr *)(skb_network_header(skb) +
593 offset);
1da177e4
LT
594 }
595
596 return offset;
597}
598
87c48fa3
ED
599void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt)
600{
601 static atomic_t ipv6_fragmentation_id;
602 int old, new;
603
e688a604 604 if (rt && !(rt->dst.flags & DST_NOPEER)) {
87c48fa3
ED
605 struct inet_peer *peer;
606
607 if (!rt->rt6i_peer)
608 rt6_bind_peer(rt, 1);
609 peer = rt->rt6i_peer;
610 if (peer) {
611 fhdr->identification = htonl(inet_getid(peer, 0));
612 return;
613 }
614 }
615 do {
616 old = atomic_read(&ipv6_fragmentation_id);
617 new = old + 1;
618 if (!new)
619 new = 1;
620 } while (atomic_cmpxchg(&ipv6_fragmentation_id, old, new) != old);
621 fhdr->identification = htonl(new);
622}
623
ad0081e4 624int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
1da177e4 625{
1da177e4 626 struct sk_buff *frag;
adf30907 627 struct rt6_info *rt = (struct rt6_info*)skb_dst(skb);
d91675f9 628 struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL;
1da177e4
LT
629 struct ipv6hdr *tmp_hdr;
630 struct frag_hdr *fh;
631 unsigned int mtu, hlen, left, len;
a7ae1992 632 int hroom, troom;
ae08e1f0 633 __be32 frag_id = 0;
1da177e4
LT
634 int ptr, offset = 0, err=0;
635 u8 *prevhdr, nexthdr = 0;
adf30907 636 struct net *net = dev_net(skb_dst(skb)->dev);
1da177e4 637
1da177e4
LT
638 hlen = ip6_find_1stfragopt(skb, &prevhdr);
639 nexthdr = *prevhdr;
640
628a5c56 641 mtu = ip6_skb_dst_mtu(skb);
b881ef76
JH
642
643 /* We must not fragment if the socket is set to force MTU discovery
14f3ad6f 644 * or if the skb it not generated by a local socket.
b881ef76 645 */
a34a101e
ED
646 if (unlikely(!skb->local_df && skb->len > mtu)) {
647 if (skb->sk && dst_allfrag(skb_dst(skb)))
648 sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK);
649
adf30907 650 skb->dev = skb_dst(skb)->dev;
3ffe533c 651 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
adf30907 652 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
3bd653c8 653 IPSTATS_MIB_FRAGFAILS);
b881ef76
JH
654 kfree_skb(skb);
655 return -EMSGSIZE;
656 }
657
d91675f9
YH
658 if (np && np->frag_size < mtu) {
659 if (np->frag_size)
660 mtu = np->frag_size;
661 }
662 mtu -= hlen + sizeof(struct frag_hdr);
1da177e4 663
21dc3301 664 if (skb_has_frag_list(skb)) {
1da177e4 665 int first_len = skb_pagelen(skb);
3d13008e 666 struct sk_buff *frag2;
1da177e4
LT
667
668 if (first_len - hlen > mtu ||
669 ((first_len - hlen) & 7) ||
670 skb_cloned(skb))
671 goto slow_path;
672
4d9092bb 673 skb_walk_frags(skb, frag) {
1da177e4
LT
674 /* Correct geometry. */
675 if (frag->len > mtu ||
676 ((frag->len & 7) && frag->next) ||
677 skb_headroom(frag) < hlen)
3d13008e 678 goto slow_path_clean;
1da177e4 679
1da177e4
LT
680 /* Partially cloned skb? */
681 if (skb_shared(frag))
3d13008e 682 goto slow_path_clean;
2fdba6b0
HX
683
684 BUG_ON(frag->sk);
685 if (skb->sk) {
2fdba6b0
HX
686 frag->sk = skb->sk;
687 frag->destructor = sock_wfree;
2fdba6b0 688 }
3d13008e 689 skb->truesize -= frag->truesize;
1da177e4
LT
690 }
691
692 err = 0;
693 offset = 0;
694 frag = skb_shinfo(skb)->frag_list;
4d9092bb 695 skb_frag_list_init(skb);
1da177e4
LT
696 /* BUILD HEADER */
697
9a217a1c 698 *prevhdr = NEXTHDR_FRAGMENT;
d56f90a7 699 tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC);
1da177e4 700 if (!tmp_hdr) {
adf30907 701 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
3bd653c8 702 IPSTATS_MIB_FRAGFAILS);
1da177e4
LT
703 return -ENOMEM;
704 }
705
1da177e4
LT
706 __skb_pull(skb, hlen);
707 fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr));
e2d1bca7
ACM
708 __skb_push(skb, hlen);
709 skb_reset_network_header(skb);
d56f90a7 710 memcpy(skb_network_header(skb), tmp_hdr, hlen);
1da177e4 711
87c48fa3 712 ipv6_select_ident(fh, rt);
1da177e4
LT
713 fh->nexthdr = nexthdr;
714 fh->reserved = 0;
715 fh->frag_off = htons(IP6_MF);
716 frag_id = fh->identification;
717
718 first_len = skb_pagelen(skb);
719 skb->data_len = first_len - skb_headlen(skb);
720 skb->len = first_len;
0660e03f
ACM
721 ipv6_hdr(skb)->payload_len = htons(first_len -
722 sizeof(struct ipv6hdr));
a11d206d 723
d8d1f30b 724 dst_hold(&rt->dst);
1da177e4
LT
725
726 for (;;) {
727 /* Prepare header of the next frame,
728 * before previous one went down. */
729 if (frag) {
730 frag->ip_summed = CHECKSUM_NONE;
badff6d0 731 skb_reset_transport_header(frag);
1da177e4 732 fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr));
e2d1bca7
ACM
733 __skb_push(frag, hlen);
734 skb_reset_network_header(frag);
d56f90a7
ACM
735 memcpy(skb_network_header(frag), tmp_hdr,
736 hlen);
1da177e4
LT
737 offset += skb->len - hlen - sizeof(struct frag_hdr);
738 fh->nexthdr = nexthdr;
739 fh->reserved = 0;
740 fh->frag_off = htons(offset);
741 if (frag->next != NULL)
742 fh->frag_off |= htons(IP6_MF);
743 fh->identification = frag_id;
0660e03f
ACM
744 ipv6_hdr(frag)->payload_len =
745 htons(frag->len -
746 sizeof(struct ipv6hdr));
1da177e4
LT
747 ip6_copy_metadata(frag, skb);
748 }
1ab1457c 749
1da177e4 750 err = output(skb);
dafee490 751 if(!err)
d8d1f30b 752 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
3bd653c8 753 IPSTATS_MIB_FRAGCREATES);
dafee490 754
1da177e4
LT
755 if (err || !frag)
756 break;
757
758 skb = frag;
759 frag = skb->next;
760 skb->next = NULL;
761 }
762
a51482bd 763 kfree(tmp_hdr);
1da177e4
LT
764
765 if (err == 0) {
d8d1f30b 766 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
3bd653c8 767 IPSTATS_MIB_FRAGOKS);
d8d1f30b 768 dst_release(&rt->dst);
1da177e4
LT
769 return 0;
770 }
771
772 while (frag) {
773 skb = frag->next;
774 kfree_skb(frag);
775 frag = skb;
776 }
777
d8d1f30b 778 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
3bd653c8 779 IPSTATS_MIB_FRAGFAILS);
d8d1f30b 780 dst_release(&rt->dst);
1da177e4 781 return err;
3d13008e
ED
782
783slow_path_clean:
784 skb_walk_frags(skb, frag2) {
785 if (frag2 == frag)
786 break;
787 frag2->sk = NULL;
788 frag2->destructor = NULL;
789 skb->truesize += frag2->truesize;
790 }
1da177e4
LT
791 }
792
793slow_path:
72e843bb
ED
794 if ((skb->ip_summed == CHECKSUM_PARTIAL) &&
795 skb_checksum_help(skb))
796 goto fail;
797
1da177e4
LT
798 left = skb->len - hlen; /* Space per frame */
799 ptr = hlen; /* Where to start from */
800
801 /*
802 * Fragment the datagram.
803 */
804
805 *prevhdr = NEXTHDR_FRAGMENT;
a7ae1992
HX
806 hroom = LL_RESERVED_SPACE(rt->dst.dev);
807 troom = rt->dst.dev->needed_tailroom;
1da177e4
LT
808
809 /*
810 * Keep copying data until we run out.
811 */
812 while(left > 0) {
813 len = left;
814 /* IF: it doesn't fit, use 'mtu' - the data space left */
815 if (len > mtu)
816 len = mtu;
25985edc 817 /* IF: we are not sending up to and including the packet end
1da177e4
LT
818 then align the next start on an eight byte boundary */
819 if (len < left) {
820 len &= ~7;
821 }
822 /*
823 * Allocate buffer.
824 */
825
a7ae1992
HX
826 if ((frag = alloc_skb(len + hlen + sizeof(struct frag_hdr) +
827 hroom + troom, GFP_ATOMIC)) == NULL) {
64ce2073 828 NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n");
adf30907 829 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d 830 IPSTATS_MIB_FRAGFAILS);
1da177e4
LT
831 err = -ENOMEM;
832 goto fail;
833 }
834
835 /*
836 * Set up data on packet
837 */
838
839 ip6_copy_metadata(frag, skb);
a7ae1992 840 skb_reserve(frag, hroom);
1da177e4 841 skb_put(frag, len + hlen + sizeof(struct frag_hdr));
c1d2bbe1 842 skb_reset_network_header(frag);
badff6d0 843 fh = (struct frag_hdr *)(skb_network_header(frag) + hlen);
b0e380b1
ACM
844 frag->transport_header = (frag->network_header + hlen +
845 sizeof(struct frag_hdr));
1da177e4
LT
846
847 /*
848 * Charge the memory for the fragment to any owner
849 * it might possess
850 */
851 if (skb->sk)
852 skb_set_owner_w(frag, skb->sk);
853
854 /*
855 * Copy the packet header into the new buffer.
856 */
d626f62b 857 skb_copy_from_linear_data(skb, skb_network_header(frag), hlen);
1da177e4
LT
858
859 /*
860 * Build fragment header.
861 */
862 fh->nexthdr = nexthdr;
863 fh->reserved = 0;
f36d6ab1 864 if (!frag_id) {
87c48fa3 865 ipv6_select_ident(fh, rt);
1da177e4
LT
866 frag_id = fh->identification;
867 } else
868 fh->identification = frag_id;
869
870 /*
871 * Copy a block of the IP datagram.
872 */
8984e41d 873 if (skb_copy_bits(skb, ptr, skb_transport_header(frag), len))
1da177e4
LT
874 BUG();
875 left -= len;
876
877 fh->frag_off = htons(offset);
878 if (left > 0)
879 fh->frag_off |= htons(IP6_MF);
0660e03f
ACM
880 ipv6_hdr(frag)->payload_len = htons(frag->len -
881 sizeof(struct ipv6hdr));
1da177e4
LT
882
883 ptr += len;
884 offset += len;
885
886 /*
887 * Put this fragment into the sending queue.
888 */
1da177e4
LT
889 err = output(frag);
890 if (err)
891 goto fail;
dafee490 892
adf30907 893 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
3bd653c8 894 IPSTATS_MIB_FRAGCREATES);
1da177e4 895 }
adf30907 896 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d 897 IPSTATS_MIB_FRAGOKS);
808db80a 898 consume_skb(skb);
1da177e4
LT
899 return err;
900
901fail:
adf30907 902 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
a11d206d 903 IPSTATS_MIB_FRAGFAILS);
1ab1457c 904 kfree_skb(skb);
1da177e4
LT
905 return err;
906}
907
b71d1d42
ED
908static inline int ip6_rt_check(const struct rt6key *rt_key,
909 const struct in6_addr *fl_addr,
910 const struct in6_addr *addr_cache)
cf6b1982 911{
a02cec21
ED
912 return (rt_key->plen != 128 || !ipv6_addr_equal(fl_addr, &rt_key->addr)) &&
913 (addr_cache == NULL || !ipv6_addr_equal(fl_addr, addr_cache));
cf6b1982
YH
914}
915
497c615a
HX
916static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
917 struct dst_entry *dst,
b71d1d42 918 const struct flowi6 *fl6)
1da177e4 919{
497c615a
HX
920 struct ipv6_pinfo *np = inet6_sk(sk);
921 struct rt6_info *rt = (struct rt6_info *)dst;
1da177e4 922
497c615a
HX
923 if (!dst)
924 goto out;
925
926 /* Yes, checking route validity in not connected
927 * case is not very simple. Take into account,
928 * that we do not support routing by source, TOS,
929 * and MSG_DONTROUTE --ANK (980726)
930 *
cf6b1982
YH
931 * 1. ip6_rt_check(): If route was host route,
932 * check that cached destination is current.
497c615a
HX
933 * If it is network route, we still may
934 * check its validity using saved pointer
935 * to the last used address: daddr_cache.
936 * We do not want to save whole address now,
937 * (because main consumer of this service
938 * is tcp, which has not this problem),
939 * so that the last trick works only on connected
940 * sockets.
941 * 2. oif also should be the same.
942 */
4c9483b2 943 if (ip6_rt_check(&rt->rt6i_dst, &fl6->daddr, np->daddr_cache) ||
8e1ef0a9 944#ifdef CONFIG_IPV6_SUBTREES
4c9483b2 945 ip6_rt_check(&rt->rt6i_src, &fl6->saddr, np->saddr_cache) ||
8e1ef0a9 946#endif
4c9483b2 947 (fl6->flowi6_oif && fl6->flowi6_oif != dst->dev->ifindex)) {
497c615a
HX
948 dst_release(dst);
949 dst = NULL;
1da177e4
LT
950 }
951
497c615a
HX
952out:
953 return dst;
954}
955
956static int ip6_dst_lookup_tail(struct sock *sk,
4c9483b2 957 struct dst_entry **dst, struct flowi6 *fl6)
497c615a 958{
3b1e0a65 959 struct net *net = sock_net(sk);
69cce1d1
DM
960#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
961 struct neighbour *n;
962#endif
963 int err;
497c615a 964
1da177e4 965 if (*dst == NULL)
4c9483b2 966 *dst = ip6_route_output(net, sk, fl6);
1da177e4
LT
967
968 if ((err = (*dst)->error))
969 goto out_err_release;
970
4c9483b2 971 if (ipv6_addr_any(&fl6->saddr)) {
c3968a85
DW
972 struct rt6_info *rt = (struct rt6_info *) *dst;
973 err = ip6_route_get_saddr(net, rt, &fl6->daddr,
974 sk ? inet6_sk(sk)->srcprefs : 0,
975 &fl6->saddr);
44456d37 976 if (err)
1da177e4 977 goto out_err_release;
1da177e4
LT
978 }
979
95c385b4 980#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
e550dfb0
NH
981 /*
982 * Here if the dst entry we've looked up
983 * has a neighbour entry that is in the INCOMPLETE
984 * state and the src address from the flow is
985 * marked as OPTIMISTIC, we release the found
986 * dst entry and replace it instead with the
987 * dst entry of the nexthop router
988 */
f2c31e32 989 rcu_read_lock();
27217455 990 n = dst_get_neighbour_noref(*dst);
69cce1d1 991 if (n && !(n->nud_state & NUD_VALID)) {
e550dfb0 992 struct inet6_ifaddr *ifp;
4c9483b2 993 struct flowi6 fl_gw6;
e550dfb0
NH
994 int redirect;
995
f2c31e32 996 rcu_read_unlock();
4c9483b2 997 ifp = ipv6_get_ifaddr(net, &fl6->saddr,
e550dfb0
NH
998 (*dst)->dev, 1);
999
1000 redirect = (ifp && ifp->flags & IFA_F_OPTIMISTIC);
1001 if (ifp)
1002 in6_ifa_put(ifp);
1003
1004 if (redirect) {
1005 /*
1006 * We need to get the dst entry for the
1007 * default router instead
1008 */
1009 dst_release(*dst);
4c9483b2
DM
1010 memcpy(&fl_gw6, fl6, sizeof(struct flowi6));
1011 memset(&fl_gw6.daddr, 0, sizeof(struct in6_addr));
1012 *dst = ip6_route_output(net, sk, &fl_gw6);
e550dfb0
NH
1013 if ((err = (*dst)->error))
1014 goto out_err_release;
95c385b4 1015 }
f2c31e32
ED
1016 } else {
1017 rcu_read_unlock();
e550dfb0 1018 }
95c385b4
NH
1019#endif
1020
1da177e4
LT
1021 return 0;
1022
1023out_err_release:
ca46f9c8 1024 if (err == -ENETUNREACH)
483a47d2 1025 IP6_INC_STATS_BH(net, NULL, IPSTATS_MIB_OUTNOROUTES);
1da177e4
LT
1026 dst_release(*dst);
1027 *dst = NULL;
1028 return err;
1029}
34a0b3cd 1030
497c615a
HX
1031/**
1032 * ip6_dst_lookup - perform route lookup on flow
1033 * @sk: socket which provides route info
1034 * @dst: pointer to dst_entry * for result
4c9483b2 1035 * @fl6: flow to lookup
497c615a
HX
1036 *
1037 * This function performs a route lookup on the given flow.
1038 *
1039 * It returns zero on success, or a standard errno code on error.
1040 */
4c9483b2 1041int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6)
497c615a
HX
1042{
1043 *dst = NULL;
4c9483b2 1044 return ip6_dst_lookup_tail(sk, dst, fl6);
497c615a 1045}
3cf3dc6c
ACM
1046EXPORT_SYMBOL_GPL(ip6_dst_lookup);
1047
497c615a 1048/**
68d0c6d3
DM
1049 * ip6_dst_lookup_flow - perform route lookup on flow with ipsec
1050 * @sk: socket which provides route info
4c9483b2 1051 * @fl6: flow to lookup
68d0c6d3 1052 * @final_dst: final destination address for ipsec lookup
a1414715 1053 * @can_sleep: we are in a sleepable context
68d0c6d3
DM
1054 *
1055 * This function performs a route lookup on the given flow.
1056 *
1057 * It returns a valid dst pointer on success, or a pointer encoded
1058 * error code.
1059 */
4c9483b2 1060struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
68d0c6d3 1061 const struct in6_addr *final_dst,
a1414715 1062 bool can_sleep)
68d0c6d3
DM
1063{
1064 struct dst_entry *dst = NULL;
1065 int err;
1066
4c9483b2 1067 err = ip6_dst_lookup_tail(sk, &dst, fl6);
68d0c6d3
DM
1068 if (err)
1069 return ERR_PTR(err);
1070 if (final_dst)
4e3fd7a0 1071 fl6->daddr = *final_dst;
2774c131 1072 if (can_sleep)
4c9483b2 1073 fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
2774c131 1074
4c9483b2 1075 return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
68d0c6d3
DM
1076}
1077EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
1078
1079/**
1080 * ip6_sk_dst_lookup_flow - perform socket cached route lookup on flow
497c615a 1081 * @sk: socket which provides the dst cache and route info
4c9483b2 1082 * @fl6: flow to lookup
68d0c6d3 1083 * @final_dst: final destination address for ipsec lookup
a1414715 1084 * @can_sleep: we are in a sleepable context
497c615a
HX
1085 *
1086 * This function performs a route lookup on the given flow with the
1087 * possibility of using the cached route in the socket if it is valid.
1088 * It will take the socket dst lock when operating on the dst cache.
1089 * As a result, this function can only be used in process context.
1090 *
68d0c6d3
DM
1091 * It returns a valid dst pointer on success, or a pointer encoded
1092 * error code.
497c615a 1093 */
4c9483b2 1094struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
68d0c6d3 1095 const struct in6_addr *final_dst,
a1414715 1096 bool can_sleep)
497c615a 1097{
68d0c6d3
DM
1098 struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
1099 int err;
497c615a 1100
4c9483b2 1101 dst = ip6_sk_dst_check(sk, dst, fl6);
68d0c6d3 1102
4c9483b2 1103 err = ip6_dst_lookup_tail(sk, &dst, fl6);
68d0c6d3
DM
1104 if (err)
1105 return ERR_PTR(err);
1106 if (final_dst)
4e3fd7a0 1107 fl6->daddr = *final_dst;
2774c131 1108 if (can_sleep)
4c9483b2 1109 fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
2774c131 1110
4c9483b2 1111 return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
497c615a 1112}
68d0c6d3 1113EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
497c615a 1114
34a0b3cd 1115static inline int ip6_ufo_append_data(struct sock *sk,
e89e9cf5
AR
1116 int getfrag(void *from, char *to, int offset, int len,
1117 int odd, struct sk_buff *skb),
1118 void *from, int length, int hh_len, int fragheaderlen,
87c48fa3
ED
1119 int transhdrlen, int mtu,unsigned int flags,
1120 struct rt6_info *rt)
e89e9cf5
AR
1121
1122{
1123 struct sk_buff *skb;
1124 int err;
1125
1126 /* There is support for UDP large send offload by network
1127 * device, so create one single skb packet containing complete
1128 * udp datagram
1129 */
1130 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {
1131 skb = sock_alloc_send_skb(sk,
1132 hh_len + fragheaderlen + transhdrlen + 20,
1133 (flags & MSG_DONTWAIT), &err);
1134 if (skb == NULL)
504744e4 1135 return err;
e89e9cf5
AR
1136
1137 /* reserve space for Hardware header */
1138 skb_reserve(skb, hh_len);
1139
1140 /* create space for UDP/IP header */
1141 skb_put(skb,fragheaderlen + transhdrlen);
1142
1143 /* initialize network header pointer */
c1d2bbe1 1144 skb_reset_network_header(skb);
e89e9cf5
AR
1145
1146 /* initialize protocol header pointer */
b0e380b1 1147 skb->transport_header = skb->network_header + fragheaderlen;
e89e9cf5 1148
84fa7933 1149 skb->ip_summed = CHECKSUM_PARTIAL;
e89e9cf5 1150 skb->csum = 0;
e89e9cf5
AR
1151 }
1152
1153 err = skb_append_datato_frags(sk,skb, getfrag, from,
1154 (length - transhdrlen));
1155 if (!err) {
1156 struct frag_hdr fhdr;
1157
c31d5326
SS
1158 /* Specify the length of each IPv6 datagram fragment.
1159 * It has to be a multiple of 8.
1160 */
1161 skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
1162 sizeof(struct frag_hdr)) & ~7;
f83ef8c0 1163 skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
87c48fa3 1164 ipv6_select_ident(&fhdr, rt);
e89e9cf5
AR
1165 skb_shinfo(skb)->ip6_frag_id = fhdr.identification;
1166 __skb_queue_tail(&sk->sk_write_queue, skb);
1167
1168 return 0;
1169 }
1170 /* There is not enough support do UPD LSO,
1171 * so follow normal path
1172 */
1173 kfree_skb(skb);
1174
1175 return err;
1176}
1da177e4 1177
0178b695
HX
1178static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
1179 gfp_t gfp)
1180{
1181 return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
1182}
1183
1184static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
1185 gfp_t gfp)
1186{
1187 return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
1188}
1189
0c183379
G
1190static void ip6_append_data_mtu(int *mtu,
1191 int *maxfraglen,
1192 unsigned int fragheaderlen,
1193 struct sk_buff *skb,
1194 struct rt6_info *rt)
1195{
1196 if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
1197 if (skb == NULL) {
1198 /* first fragment, reserve header_len */
1199 *mtu = *mtu - rt->dst.header_len;
1200
1201 } else {
1202 /*
1203 * this fragment is not first, the headers
1204 * space is regarded as data space.
1205 */
1206 *mtu = dst_mtu(rt->dst.path);
1207 }
1208 *maxfraglen = ((*mtu - fragheaderlen) & ~7)
1209 + fragheaderlen - sizeof(struct frag_hdr);
1210 }
1211}
1212
41a1f8ea
YH
1213int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
1214 int offset, int len, int odd, struct sk_buff *skb),
1215 void *from, int length, int transhdrlen,
4c9483b2 1216 int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,
13b52cd4 1217 struct rt6_info *rt, unsigned int flags, int dontfrag)
1da177e4
LT
1218{
1219 struct inet_sock *inet = inet_sk(sk);
1220 struct ipv6_pinfo *np = inet6_sk(sk);
bdc712b4 1221 struct inet_cork *cork;
0c183379 1222 struct sk_buff *skb, *skb_prev = NULL;
1da177e4
LT
1223 unsigned int maxfraglen, fragheaderlen;
1224 int exthdrlen;
299b0767 1225 int dst_exthdrlen;
1da177e4
LT
1226 int hh_len;
1227 int mtu;
1228 int copy;
1229 int err;
1230 int offset = 0;
a693e698 1231 __u8 tx_flags = 0;
1da177e4
LT
1232
1233 if (flags&MSG_PROBE)
1234 return 0;
bdc712b4 1235 cork = &inet->cork.base;
1da177e4
LT
1236 if (skb_queue_empty(&sk->sk_write_queue)) {
1237 /*
1238 * setup for corking
1239 */
1240 if (opt) {
0178b695 1241 if (WARN_ON(np->cork.opt))
1da177e4 1242 return -EINVAL;
0178b695
HX
1243
1244 np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
1245 if (unlikely(np->cork.opt == NULL))
1246 return -ENOBUFS;
1247
1248 np->cork.opt->tot_len = opt->tot_len;
1249 np->cork.opt->opt_flen = opt->opt_flen;
1250 np->cork.opt->opt_nflen = opt->opt_nflen;
1251
1252 np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt,
1253 sk->sk_allocation);
1254 if (opt->dst0opt && !np->cork.opt->dst0opt)
1255 return -ENOBUFS;
1256
1257 np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt,
1258 sk->sk_allocation);
1259 if (opt->dst1opt && !np->cork.opt->dst1opt)
1260 return -ENOBUFS;
1261
1262 np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt,
1263 sk->sk_allocation);
1264 if (opt->hopopt && !np->cork.opt->hopopt)
1265 return -ENOBUFS;
1266
1267 np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt,
1268 sk->sk_allocation);
1269 if (opt->srcrt && !np->cork.opt->srcrt)
1270 return -ENOBUFS;
1271
1da177e4
LT
1272 /* need source address above miyazawa*/
1273 }
d8d1f30b 1274 dst_hold(&rt->dst);
bdc712b4 1275 cork->dst = &rt->dst;
4c9483b2 1276 inet->cork.fl.u.ip6 = *fl6;
1da177e4 1277 np->cork.hop_limit = hlimit;
41a1f8ea 1278 np->cork.tclass = tclass;
0c183379
G
1279 if (rt->dst.flags & DST_XFRM_TUNNEL)
1280 mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
1281 rt->dst.dev->mtu : dst_mtu(&rt->dst);
1282 else
1283 mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
1284 rt->dst.dev->mtu : dst_mtu(rt->dst.path);
c7503609 1285 if (np->frag_size < mtu) {
d91675f9
YH
1286 if (np->frag_size)
1287 mtu = np->frag_size;
1288 }
bdc712b4 1289 cork->fragsize = mtu;
d8d1f30b 1290 if (dst_allfrag(rt->dst.path))
bdc712b4
DM
1291 cork->flags |= IPCORK_ALLFRAG;
1292 cork->length = 0;
1da177e4
LT
1293 sk->sk_sndmsg_page = NULL;
1294 sk->sk_sndmsg_off = 0;
299b0767 1295 exthdrlen = (opt ? opt->opt_flen : 0) - rt->rt6i_nfheader_len;
1da177e4
LT
1296 length += exthdrlen;
1297 transhdrlen += exthdrlen;
299b0767 1298 dst_exthdrlen = rt->dst.header_len;
1da177e4 1299 } else {
bdc712b4 1300 rt = (struct rt6_info *)cork->dst;
4c9483b2 1301 fl6 = &inet->cork.fl.u.ip6;
0178b695 1302 opt = np->cork.opt;
1da177e4
LT
1303 transhdrlen = 0;
1304 exthdrlen = 0;
299b0767 1305 dst_exthdrlen = 0;
bdc712b4 1306 mtu = cork->fragsize;
1da177e4
LT
1307 }
1308
d8d1f30b 1309 hh_len = LL_RESERVED_SPACE(rt->dst.dev);
1da177e4 1310
a1b05140 1311 fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
b4ce9277 1312 (opt ? opt->opt_nflen : 0);
1da177e4
LT
1313 maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen - sizeof(struct frag_hdr);
1314
1315 if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
bdc712b4 1316 if (cork->length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {
4c9483b2 1317 ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);
1da177e4
LT
1318 return -EMSGSIZE;
1319 }
1320 }
1321
a693e698
AB
1322 /* For UDP, check if TX timestamp is enabled */
1323 if (sk->sk_type == SOCK_DGRAM) {
1324 err = sock_tx_timestamp(sk, &tx_flags);
1325 if (err)
1326 goto error;
1327 }
1328
1da177e4
LT
1329 /*
1330 * Let's try using as much space as possible.
1331 * Use MTU if total length of the message fits into the MTU.
1332 * Otherwise, we need to reserve fragment header and
1333 * fragment alignment (= 8-15 octects, in total).
1334 *
1335 * Note that we may need to "move" the data from the tail of
1ab1457c 1336 * of the buffer to the new fragment when we split
1da177e4
LT
1337 * the message.
1338 *
1ab1457c 1339 * FIXME: It may be fragmented into multiple chunks
1da177e4
LT
1340 * at once if non-fragmentable extension headers
1341 * are too large.
1ab1457c 1342 * --yoshfuji
1da177e4
LT
1343 */
1344
bdc712b4 1345 cork->length += length;
4b340ae2
BH
1346 if (length > mtu) {
1347 int proto = sk->sk_protocol;
1348 if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){
4c9483b2 1349 ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
4b340ae2
BH
1350 return -EMSGSIZE;
1351 }
e89e9cf5 1352
4b340ae2 1353 if (proto == IPPROTO_UDP &&
d8d1f30b 1354 (rt->dst.dev->features & NETIF_F_UFO)) {
4b340ae2
BH
1355
1356 err = ip6_ufo_append_data(sk, getfrag, from, length,
1357 hh_len, fragheaderlen,
87c48fa3 1358 transhdrlen, mtu, flags, rt);
4b340ae2
BH
1359 if (err)
1360 goto error;
1361 return 0;
1362 }
e89e9cf5 1363 }
1da177e4
LT
1364
1365 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL)
1366 goto alloc_new_skb;
1367
1368 while (length > 0) {
1369 /* Check if the remaining data fits into current packet. */
bdc712b4 1370 copy = (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - skb->len;
1da177e4
LT
1371 if (copy < length)
1372 copy = maxfraglen - skb->len;
1373
1374 if (copy <= 0) {
1375 char *data;
1376 unsigned int datalen;
1377 unsigned int fraglen;
1378 unsigned int fraggap;
1379 unsigned int alloclen;
1da177e4 1380alloc_new_skb:
1da177e4 1381 /* There's no room in the current skb */
0c183379
G
1382 if (skb)
1383 fraggap = skb->len - maxfraglen;
1da177e4
LT
1384 else
1385 fraggap = 0;
0c183379
G
1386 /* update mtu and maxfraglen if necessary */
1387 if (skb == NULL || skb_prev == NULL)
1388 ip6_append_data_mtu(&mtu, &maxfraglen,
1389 fragheaderlen, skb, rt);
1390
1391 skb_prev = skb;
1da177e4
LT
1392
1393 /*
1394 * If remaining data exceeds the mtu,
1395 * we know we need more fragment(s).
1396 */
1397 datalen = length + fraggap;
1da177e4 1398
0c183379
G
1399 if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen)
1400 datalen = maxfraglen - fragheaderlen - rt->dst.trailer_len;
1da177e4 1401 if ((flags & MSG_MORE) &&
d8d1f30b 1402 !(rt->dst.dev->features&NETIF_F_SG))
1da177e4
LT
1403 alloclen = mtu;
1404 else
1405 alloclen = datalen + fragheaderlen;
1406
299b0767
SK
1407 alloclen += dst_exthdrlen;
1408
0c183379
G
1409 if (datalen != length + fraggap) {
1410 /*
1411 * this is not the last fragment, the trailer
1412 * space is regarded as data space.
1413 */
1414 datalen += rt->dst.trailer_len;
1415 }
1416
1417 alloclen += rt->dst.trailer_len;
1418 fraglen = datalen + fragheaderlen;
1da177e4
LT
1419
1420 /*
1421 * We just reserve space for fragment header.
1ab1457c 1422 * Note: this may be overallocation if the message
1da177e4
LT
1423 * (without MSG_MORE) fits into the MTU.
1424 */
1425 alloclen += sizeof(struct frag_hdr);
1426
1427 if (transhdrlen) {
1428 skb = sock_alloc_send_skb(sk,
1429 alloclen + hh_len,
1430 (flags & MSG_DONTWAIT), &err);
1431 } else {
1432 skb = NULL;
1433 if (atomic_read(&sk->sk_wmem_alloc) <=
1434 2 * sk->sk_sndbuf)
1435 skb = sock_wmalloc(sk,
1436 alloclen + hh_len, 1,
1437 sk->sk_allocation);
1438 if (unlikely(skb == NULL))
1439 err = -ENOBUFS;
a693e698
AB
1440 else {
1441 /* Only the initial fragment
1442 * is time stamped.
1443 */
1444 tx_flags = 0;
1445 }
1da177e4
LT
1446 }
1447 if (skb == NULL)
1448 goto error;
1449 /*
1450 * Fill in the control structures
1451 */
d7f7c0ac 1452 skb->ip_summed = CHECKSUM_NONE;
1da177e4 1453 skb->csum = 0;
1f85851e
G
1454 /* reserve for fragmentation and ipsec header */
1455 skb_reserve(skb, hh_len + sizeof(struct frag_hdr) +
1456 dst_exthdrlen);
1da177e4 1457
a693e698
AB
1458 if (sk->sk_type == SOCK_DGRAM)
1459 skb_shinfo(skb)->tx_flags = tx_flags;
1460
1da177e4
LT
1461 /*
1462 * Find where to start putting bytes
1463 */
1f85851e
G
1464 data = skb_put(skb, fraglen);
1465 skb_set_network_header(skb, exthdrlen);
1466 data += fragheaderlen;
b0e380b1
ACM
1467 skb->transport_header = (skb->network_header +
1468 fragheaderlen);
1da177e4
LT
1469 if (fraggap) {
1470 skb->csum = skb_copy_and_csum_bits(
1471 skb_prev, maxfraglen,
1472 data + transhdrlen, fraggap, 0);
1473 skb_prev->csum = csum_sub(skb_prev->csum,
1474 skb->csum);
1475 data += fraggap;
e9fa4f7b 1476 pskb_trim_unique(skb_prev, maxfraglen);
1da177e4
LT
1477 }
1478 copy = datalen - transhdrlen - fraggap;
299b0767 1479
1da177e4
LT
1480 if (copy < 0) {
1481 err = -EINVAL;
1482 kfree_skb(skb);
1483 goto error;
1484 } else if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) {
1485 err = -EFAULT;
1486 kfree_skb(skb);
1487 goto error;
1488 }
1489
1490 offset += copy;
1491 length -= datalen - fraggap;
1492 transhdrlen = 0;
1493 exthdrlen = 0;
299b0767 1494 dst_exthdrlen = 0;
1da177e4
LT
1495
1496 /*
1497 * Put the packet on the pending queue
1498 */
1499 __skb_queue_tail(&sk->sk_write_queue, skb);
1500 continue;
1501 }
1502
1503 if (copy > length)
1504 copy = length;
1505
d8d1f30b 1506 if (!(rt->dst.dev->features&NETIF_F_SG)) {
1da177e4
LT
1507 unsigned int off;
1508
1509 off = skb->len;
1510 if (getfrag(from, skb_put(skb, copy),
1511 offset, copy, off, skb) < 0) {
1512 __skb_trim(skb, off);
1513 err = -EFAULT;
1514 goto error;
1515 }
1516 } else {
1517 int i = skb_shinfo(skb)->nr_frags;
1518 skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1];
1519 struct page *page = sk->sk_sndmsg_page;
1520 int off = sk->sk_sndmsg_off;
1521 unsigned int left;
1522
1523 if (page && (left = PAGE_SIZE - off) > 0) {
1524 if (copy >= left)
1525 copy = left;
408dadf0 1526 if (page != skb_frag_page(frag)) {
1da177e4
LT
1527 if (i == MAX_SKB_FRAGS) {
1528 err = -EMSGSIZE;
1529 goto error;
1530 }
1da177e4 1531 skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
408dadf0 1532 skb_frag_ref(skb, i);
1da177e4
LT
1533 frag = &skb_shinfo(skb)->frags[i];
1534 }
1535 } else if(i < MAX_SKB_FRAGS) {
1536 if (copy > PAGE_SIZE)
1537 copy = PAGE_SIZE;
1538 page = alloc_pages(sk->sk_allocation, 0);
1539 if (page == NULL) {
1540 err = -ENOMEM;
1541 goto error;
1542 }
1543 sk->sk_sndmsg_page = page;
1544 sk->sk_sndmsg_off = 0;
1545
1546 skb_fill_page_desc(skb, i, page, 0, 0);
1547 frag = &skb_shinfo(skb)->frags[i];
1da177e4
LT
1548 } else {
1549 err = -EMSGSIZE;
1550 goto error;
1551 }
9e903e08
ED
1552 if (getfrag(from,
1553 skb_frag_address(frag) + skb_frag_size(frag),
408dadf0 1554 offset, copy, skb->len, skb) < 0) {
1da177e4
LT
1555 err = -EFAULT;
1556 goto error;
1557 }
1558 sk->sk_sndmsg_off += copy;
9e903e08 1559 skb_frag_size_add(frag, copy);
1da177e4
LT
1560 skb->len += copy;
1561 skb->data_len += copy;
f945fa7a
HX
1562 skb->truesize += copy;
1563 atomic_add(copy, &sk->sk_wmem_alloc);
1da177e4
LT
1564 }
1565 offset += copy;
1566 length -= copy;
1567 }
1568 return 0;
1569error:
bdc712b4 1570 cork->length -= length;
3bd653c8 1571 IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
1572 return err;
1573}
a495f836 1574EXPORT_SYMBOL_GPL(ip6_append_data);
1da177e4 1575
bf138862
PE
1576static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)
1577{
0178b695
HX
1578 if (np->cork.opt) {
1579 kfree(np->cork.opt->dst0opt);
1580 kfree(np->cork.opt->dst1opt);
1581 kfree(np->cork.opt->hopopt);
1582 kfree(np->cork.opt->srcrt);
1583 kfree(np->cork.opt);
1584 np->cork.opt = NULL;
1585 }
1586
bdc712b4
DM
1587 if (inet->cork.base.dst) {
1588 dst_release(inet->cork.base.dst);
1589 inet->cork.base.dst = NULL;
1590 inet->cork.base.flags &= ~IPCORK_ALLFRAG;
bf138862
PE
1591 }
1592 memset(&inet->cork.fl, 0, sizeof(inet->cork.fl));
1593}
1594
1da177e4
LT
1595int ip6_push_pending_frames(struct sock *sk)
1596{
1597 struct sk_buff *skb, *tmp_skb;
1598 struct sk_buff **tail_skb;
1599 struct in6_addr final_dst_buf, *final_dst = &final_dst_buf;
1600 struct inet_sock *inet = inet_sk(sk);
1601 struct ipv6_pinfo *np = inet6_sk(sk);
3bd653c8 1602 struct net *net = sock_net(sk);
1da177e4
LT
1603 struct ipv6hdr *hdr;
1604 struct ipv6_txoptions *opt = np->cork.opt;
bdc712b4 1605 struct rt6_info *rt = (struct rt6_info *)inet->cork.base.dst;
4c9483b2
DM
1606 struct flowi6 *fl6 = &inet->cork.fl.u.ip6;
1607 unsigned char proto = fl6->flowi6_proto;
1da177e4
LT
1608 int err = 0;
1609
1610 if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL)
1611 goto out;
1612 tail_skb = &(skb_shinfo(skb)->frag_list);
1613
1614 /* move skb->data to ip header from ext header */
d56f90a7 1615 if (skb->data < skb_network_header(skb))
bbe735e4 1616 __skb_pull(skb, skb_network_offset(skb));
1da177e4 1617 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
cfe1fc77 1618 __skb_pull(tmp_skb, skb_network_header_len(skb));
1da177e4
LT
1619 *tail_skb = tmp_skb;
1620 tail_skb = &(tmp_skb->next);
1621 skb->len += tmp_skb->len;
1622 skb->data_len += tmp_skb->len;
1da177e4 1623 skb->truesize += tmp_skb->truesize;
1da177e4
LT
1624 tmp_skb->destructor = NULL;
1625 tmp_skb->sk = NULL;
1da177e4
LT
1626 }
1627
28a89453 1628 /* Allow local fragmentation. */
b5c15fc0 1629 if (np->pmtudisc < IPV6_PMTUDISC_DO)
28a89453
HX
1630 skb->local_df = 1;
1631
4e3fd7a0 1632 *final_dst = fl6->daddr;
cfe1fc77 1633 __skb_pull(skb, skb_network_header_len(skb));
1da177e4
LT
1634 if (opt && opt->opt_flen)
1635 ipv6_push_frag_opts(skb, opt, &proto);
1636 if (opt && opt->opt_nflen)
1637 ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst);
1638
e2d1bca7
ACM
1639 skb_push(skb, sizeof(struct ipv6hdr));
1640 skb_reset_network_header(skb);
0660e03f 1641 hdr = ipv6_hdr(skb);
1ab1457c 1642
4c9483b2 1643 *(__be32*)hdr = fl6->flowlabel |
41a1f8ea 1644 htonl(0x60000000 | ((int)np->cork.tclass << 20));
1da177e4 1645
1da177e4
LT
1646 hdr->hop_limit = np->cork.hop_limit;
1647 hdr->nexthdr = proto;
4e3fd7a0
AD
1648 hdr->saddr = fl6->saddr;
1649 hdr->daddr = *final_dst;
1da177e4 1650
a2c2064f 1651 skb->priority = sk->sk_priority;
4a19ec58 1652 skb->mark = sk->sk_mark;
a2c2064f 1653
d8d1f30b 1654 skb_dst_set(skb, dst_clone(&rt->dst));
edf391ff 1655 IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
14878f75 1656 if (proto == IPPROTO_ICMPV6) {
adf30907 1657 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
14878f75 1658
5a57d4c7 1659 ICMP6MSGOUT_INC_STATS_BH(net, idev, icmp6_hdr(skb)->icmp6_type);
e41b5368 1660 ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS);
14878f75
DS
1661 }
1662
ef76bc23 1663 err = ip6_local_out(skb);
1da177e4
LT
1664 if (err) {
1665 if (err > 0)
6ce9e7b5 1666 err = net_xmit_errno(err);
1da177e4
LT
1667 if (err)
1668 goto error;
1669 }
1670
1671out:
bf138862 1672 ip6_cork_release(inet, np);
1da177e4
LT
1673 return err;
1674error:
06254914 1675 IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
1676 goto out;
1677}
a495f836 1678EXPORT_SYMBOL_GPL(ip6_push_pending_frames);
1da177e4
LT
1679
1680void ip6_flush_pending_frames(struct sock *sk)
1681{
1da177e4
LT
1682 struct sk_buff *skb;
1683
1684 while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) {
adf30907
ED
1685 if (skb_dst(skb))
1686 IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb_dst(skb)),
e1f52208 1687 IPSTATS_MIB_OUTDISCARDS);
1da177e4
LT
1688 kfree_skb(skb);
1689 }
1690
bf138862 1691 ip6_cork_release(inet_sk(sk), inet6_sk(sk));
1da177e4 1692}
a495f836 1693EXPORT_SYMBOL_GPL(ip6_flush_pending_frames);