]> bbs.cooldavid.org Git - net-next-2.6.git/blame - net/ipv4/ip_output.c
[NETFILTER]: Remove okfn usage in ip_vs_core.c
[net-next-2.6.git] / net / ipv4 / ip_output.c
CommitLineData
1da177e4
LT
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * The Internet Protocol (IP) output module.
7 *
8 * Version: $Id: ip_output.c,v 1.100 2002/02/01 22:01:03 davem Exp $
9 *
02c30a84 10 * Authors: Ross Biro
1da177e4
LT
11 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12 * Donald Becker, <becker@super.org>
13 * Alan Cox, <Alan.Cox@linux.org>
14 * Richard Underwood
15 * Stefan Becker, <stefanb@yello.ping.de>
16 * Jorge Cwik, <jorge@laser.satlink.net>
17 * Arnt Gulbrandsen, <agulbra@nvg.unit.no>
18 * Hirokazu Takahashi, <taka@valinux.co.jp>
19 *
20 * See ip_input.c for original log
21 *
22 * Fixes:
23 * Alan Cox : Missing nonblock feature in ip_build_xmit.
24 * Mike Kilburn : htons() missing in ip_build_xmit.
25 * Bradford Johnson: Fix faulty handling of some frames when
26 * no route is found.
27 * Alexander Demenshin: Missing sk/skb free in ip_queue_xmit
28 * (in case if packet not accepted by
29 * output firewall rules)
30 * Mike McLagan : Routing by source
31 * Alexey Kuznetsov: use new route cache
32 * Andi Kleen: Fix broken PMTU recovery and remove
33 * some redundant tests.
34 * Vitaly E. Lavrov : Transparent proxy revived after year coma.
35 * Andi Kleen : Replace ip_reply with ip_send_reply.
36 * Andi Kleen : Split fast and slow ip_build_xmit path
37 * for decreased register pressure on x86
38 * and more readibility.
39 * Marc Boucher : When call_out_firewall returns FW_QUEUE,
40 * silently drop skb instead of failing with -EPERM.
41 * Detlev Wengorz : Copy protocol for fragments.
42 * Hirokazu Takahashi: HW checksumming for outgoing UDP
43 * datagrams.
44 * Hirokazu Takahashi: sendfile() on UDP works now.
45 */
46
47#include <asm/uaccess.h>
48#include <asm/system.h>
49#include <linux/module.h>
50#include <linux/types.h>
51#include <linux/kernel.h>
52#include <linux/sched.h>
53#include <linux/mm.h>
54#include <linux/string.h>
55#include <linux/errno.h>
56#include <linux/config.h>
57
58#include <linux/socket.h>
59#include <linux/sockios.h>
60#include <linux/in.h>
61#include <linux/inet.h>
62#include <linux/netdevice.h>
63#include <linux/etherdevice.h>
64#include <linux/proc_fs.h>
65#include <linux/stat.h>
66#include <linux/init.h>
67
68#include <net/snmp.h>
69#include <net/ip.h>
70#include <net/protocol.h>
71#include <net/route.h>
1da177e4
LT
72#include <linux/skbuff.h>
73#include <net/sock.h>
74#include <net/arp.h>
75#include <net/icmp.h>
1da177e4
LT
76#include <net/checksum.h>
77#include <net/inetpeer.h>
78#include <net/checksum.h>
79#include <linux/igmp.h>
80#include <linux/netfilter_ipv4.h>
81#include <linux/netfilter_bridge.h>
82#include <linux/mroute.h>
83#include <linux/netlink.h>
6cbb0df7 84#include <linux/tcp.h>
1da177e4 85
1da177e4
LT
86int sysctl_ip_default_ttl = IPDEFTTL;
87
88/* Generate a checksum for an outgoing IP datagram. */
89__inline__ void ip_send_check(struct iphdr *iph)
90{
91 iph->check = 0;
92 iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
93}
94
95/* dev_loopback_xmit for use with netfilter. */
96static int ip_dev_loopback_xmit(struct sk_buff *newskb)
97{
98 newskb->mac.raw = newskb->data;
99 __skb_pull(newskb, newskb->nh.raw - newskb->data);
100 newskb->pkt_type = PACKET_LOOPBACK;
101 newskb->ip_summed = CHECKSUM_UNNECESSARY;
102 BUG_TRAP(newskb->dst);
1da177e4
LT
103 netif_rx(newskb);
104 return 0;
105}
106
107static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst)
108{
109 int ttl = inet->uc_ttl;
110
111 if (ttl < 0)
112 ttl = dst_metric(dst, RTAX_HOPLIMIT);
113 return ttl;
114}
115
116/*
117 * Add an ip header to a skbuff and send it out.
118 *
119 */
120int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
121 u32 saddr, u32 daddr, struct ip_options *opt)
122{
123 struct inet_sock *inet = inet_sk(sk);
124 struct rtable *rt = (struct rtable *)skb->dst;
125 struct iphdr *iph;
126
127 /* Build the IP header. */
128 if (opt)
129 iph=(struct iphdr *)skb_push(skb,sizeof(struct iphdr) + opt->optlen);
130 else
131 iph=(struct iphdr *)skb_push(skb,sizeof(struct iphdr));
132
133 iph->version = 4;
134 iph->ihl = 5;
135 iph->tos = inet->tos;
136 if (ip_dont_fragment(sk, &rt->u.dst))
137 iph->frag_off = htons(IP_DF);
138 else
139 iph->frag_off = 0;
140 iph->ttl = ip_select_ttl(inet, &rt->u.dst);
141 iph->daddr = rt->rt_dst;
142 iph->saddr = rt->rt_src;
143 iph->protocol = sk->sk_protocol;
144 iph->tot_len = htons(skb->len);
145 ip_select_ident(iph, &rt->u.dst, sk);
146 skb->nh.iph = iph;
147
148 if (opt && opt->optlen) {
149 iph->ihl += opt->optlen>>2;
150 ip_options_build(skb, opt, daddr, rt, 0);
151 }
152 ip_send_check(iph);
153
154 skb->priority = sk->sk_priority;
155
156 /* Send it out. */
157 return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
158 dst_output);
159}
160
d8c97a94
ACM
161EXPORT_SYMBOL_GPL(ip_build_and_send_pkt);
162
1da177e4
LT
163static inline int ip_finish_output2(struct sk_buff *skb)
164{
165 struct dst_entry *dst = skb->dst;
166 struct hh_cache *hh = dst->hh;
167 struct net_device *dev = dst->dev;
168 int hh_len = LL_RESERVED_SPACE(dev);
169
170 /* Be paranoid, rather than too clever. */
171 if (unlikely(skb_headroom(skb) < hh_len && dev->hard_header)) {
172 struct sk_buff *skb2;
173
174 skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev));
175 if (skb2 == NULL) {
176 kfree_skb(skb);
177 return -ENOMEM;
178 }
179 if (skb->sk)
180 skb_set_owner_w(skb2, skb->sk);
181 kfree_skb(skb);
182 skb = skb2;
183 }
184
1da177e4
LT
185 if (hh) {
186 int hh_alen;
187
188 read_lock_bh(&hh->hh_lock);
189 hh_alen = HH_DATA_ALIGN(hh->hh_len);
190 memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
191 read_unlock_bh(&hh->hh_lock);
192 skb_push(skb, hh->hh_len);
193 return hh->hh_output(skb);
194 } else if (dst->neighbour)
195 return dst->neighbour->output(skb);
196
197 if (net_ratelimit())
198 printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!\n");
199 kfree_skb(skb);
200 return -EINVAL;
201}
202
33d043d6 203static inline int ip_finish_output(struct sk_buff *skb)
1da177e4
LT
204{
205 struct net_device *dev = skb->dst->dev;
206
207 skb->dev = dev;
208 skb->protocol = htons(ETH_P_IP);
209
210 return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev,
211 ip_finish_output2);
212}
213
214int ip_mc_output(struct sk_buff *skb)
215{
216 struct sock *sk = skb->sk;
217 struct rtable *rt = (struct rtable*)skb->dst;
218 struct net_device *dev = rt->u.dst.dev;
219
220 /*
221 * If the indicated interface is up and running, send the packet.
222 */
223 IP_INC_STATS(IPSTATS_MIB_OUTREQUESTS);
224
225 skb->dev = dev;
226 skb->protocol = htons(ETH_P_IP);
227
228 /*
229 * Multicasts are looped back for other local users
230 */
231
232 if (rt->rt_flags&RTCF_MULTICAST) {
233 if ((!sk || inet_sk(sk)->mc_loop)
234#ifdef CONFIG_IP_MROUTE
235 /* Small optimization: do not loopback not local frames,
236 which returned after forwarding; they will be dropped
237 by ip_mr_input in any case.
238 Note, that local frames are looped back to be delivered
239 to local recipients.
240
241 This check is duplicated in ip_mr_input at the moment.
242 */
243 && ((rt->rt_flags&RTCF_LOCAL) || !(IPCB(skb)->flags&IPSKB_FORWARDED))
244#endif
245 ) {
246 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
247 if (newskb)
248 NF_HOOK(PF_INET, NF_IP_POST_ROUTING, newskb, NULL,
249 newskb->dev,
250 ip_dev_loopback_xmit);
251 }
252
253 /* Multicasts with ttl 0 must not go beyond the host */
254
255 if (skb->nh.iph->ttl == 0) {
256 kfree_skb(skb);
257 return 0;
258 }
259 }
260
261 if (rt->rt_flags&RTCF_BROADCAST) {
262 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
263 if (newskb)
264 NF_HOOK(PF_INET, NF_IP_POST_ROUTING, newskb, NULL,
265 newskb->dev, ip_dev_loopback_xmit);
266 }
267
268 if (skb->len > dst_mtu(&rt->u.dst))
269 return ip_fragment(skb, ip_finish_output);
270 else
271 return ip_finish_output(skb);
272}
273
274int ip_output(struct sk_buff *skb)
275{
276 IP_INC_STATS(IPSTATS_MIB_OUTREQUESTS);
277
e89e9cf5
AR
278 if (skb->len > dst_mtu(skb->dst) &&
279 !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size))
1da177e4
LT
280 return ip_fragment(skb, ip_finish_output);
281 else
282 return ip_finish_output(skb);
283}
284
285int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
286{
287 struct sock *sk = skb->sk;
288 struct inet_sock *inet = inet_sk(sk);
289 struct ip_options *opt = inet->opt;
290 struct rtable *rt;
291 struct iphdr *iph;
292
293 /* Skip all of this if the packet is already routed,
294 * f.e. by something like SCTP.
295 */
296 rt = (struct rtable *) skb->dst;
297 if (rt != NULL)
298 goto packet_routed;
299
300 /* Make sure we can route this packet. */
301 rt = (struct rtable *)__sk_dst_check(sk, 0);
302 if (rt == NULL) {
303 u32 daddr;
304
305 /* Use correct destination address if we have options. */
306 daddr = inet->daddr;
307 if(opt && opt->srr)
308 daddr = opt->faddr;
309
310 {
311 struct flowi fl = { .oif = sk->sk_bound_dev_if,
312 .nl_u = { .ip4_u =
313 { .daddr = daddr,
314 .saddr = inet->saddr,
315 .tos = RT_CONN_FLAGS(sk) } },
316 .proto = sk->sk_protocol,
317 .uli_u = { .ports =
318 { .sport = inet->sport,
319 .dport = inet->dport } } };
320
321 /* If this fails, retransmit mechanism of transport layer will
322 * keep trying until route appears or the connection times
323 * itself out.
324 */
325 if (ip_route_output_flow(&rt, &fl, sk, 0))
326 goto no_route;
327 }
6cbb0df7 328 sk_setup_caps(sk, &rt->u.dst);
1da177e4
LT
329 }
330 skb->dst = dst_clone(&rt->u.dst);
331
332packet_routed:
333 if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
334 goto no_route;
335
336 /* OK, we know where to send it, allocate and build IP header. */
337 iph = (struct iphdr *) skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0));
338 *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff));
339 iph->tot_len = htons(skb->len);
340 if (ip_dont_fragment(sk, &rt->u.dst) && !ipfragok)
341 iph->frag_off = htons(IP_DF);
342 else
343 iph->frag_off = 0;
344 iph->ttl = ip_select_ttl(inet, &rt->u.dst);
345 iph->protocol = sk->sk_protocol;
346 iph->saddr = rt->rt_src;
347 iph->daddr = rt->rt_dst;
348 skb->nh.iph = iph;
349 /* Transport layer set skb->h.foo itself. */
350
351 if (opt && opt->optlen) {
352 iph->ihl += opt->optlen >> 2;
353 ip_options_build(skb, opt, inet->daddr, rt, 0);
354 }
355
89f5f0ae
HX
356 ip_select_ident_more(iph, &rt->u.dst, sk,
357 (skb_shinfo(skb)->tso_segs ?: 1) - 1);
1da177e4
LT
358
359 /* Add an IP checksum. */
360 ip_send_check(iph);
361
362 skb->priority = sk->sk_priority;
363
364 return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
365 dst_output);
366
367no_route:
368 IP_INC_STATS(IPSTATS_MIB_OUTNOROUTES);
369 kfree_skb(skb);
370 return -EHOSTUNREACH;
371}
372
373
374static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from)
375{
376 to->pkt_type = from->pkt_type;
377 to->priority = from->priority;
378 to->protocol = from->protocol;
1da177e4
LT
379 dst_release(to->dst);
380 to->dst = dst_clone(from->dst);
381 to->dev = from->dev;
382
383 /* Copy the flags to each fragment. */
384 IPCB(to)->flags = IPCB(from)->flags;
385
386#ifdef CONFIG_NET_SCHED
387 to->tc_index = from->tc_index;
388#endif
389#ifdef CONFIG_NETFILTER
390 to->nfmark = from->nfmark;
1da177e4
LT
391 /* Connection association is same as pre-frag packet */
392 nf_conntrack_put(to->nfct);
393 to->nfct = from->nfct;
394 nf_conntrack_get(to->nfct);
395 to->nfctinfo = from->nfctinfo;
c98d80ed
JA
396#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
397 to->ipvs_property = from->ipvs_property;
398#endif
1da177e4
LT
399#ifdef CONFIG_BRIDGE_NETFILTER
400 nf_bridge_put(to->nf_bridge);
401 to->nf_bridge = from->nf_bridge;
402 nf_bridge_get(to->nf_bridge);
403#endif
1da177e4
LT
404#endif
405}
406
407/*
408 * This IP datagram is too large to be sent in one piece. Break it up into
409 * smaller pieces (each of size equal to IP header plus
410 * a block of the data of the original IP data part) that will yet fit in a
411 * single device frame, and queue such a frame for sending.
412 */
413
414int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
415{
416 struct iphdr *iph;
417 int raw = 0;
418 int ptr;
419 struct net_device *dev;
420 struct sk_buff *skb2;
421 unsigned int mtu, hlen, left, len, ll_rs;
422 int offset;
423 int not_last_frag;
424 struct rtable *rt = (struct rtable*)skb->dst;
425 int err = 0;
426
427 dev = rt->u.dst.dev;
428
429 /*
430 * Point into the IP datagram header.
431 */
432
433 iph = skb->nh.iph;
434
435 if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) {
436 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
437 htonl(dst_mtu(&rt->u.dst)));
438 kfree_skb(skb);
439 return -EMSGSIZE;
440 }
441
442 /*
443 * Setup starting values.
444 */
445
446 hlen = iph->ihl * 4;
447 mtu = dst_mtu(&rt->u.dst) - hlen; /* Size of data space */
89cee8b1 448 IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE;
1da177e4
LT
449
450 /* When frag_list is given, use it. First, check its validity:
451 * some transformers could create wrong frag_list or break existing
452 * one, it is not prohibited. In this case fall back to copying.
453 *
454 * LATER: this step can be merged to real generation of fragments,
455 * we can switch to copy when see the first bad fragment.
456 */
457 if (skb_shinfo(skb)->frag_list) {
458 struct sk_buff *frag;
459 int first_len = skb_pagelen(skb);
460
461 if (first_len - hlen > mtu ||
462 ((first_len - hlen) & 7) ||
463 (iph->frag_off & htons(IP_MF|IP_OFFSET)) ||
464 skb_cloned(skb))
465 goto slow_path;
466
467 for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) {
468 /* Correct geometry. */
469 if (frag->len > mtu ||
470 ((frag->len & 7) && frag->next) ||
471 skb_headroom(frag) < hlen)
472 goto slow_path;
473
474 /* Partially cloned skb? */
475 if (skb_shared(frag))
476 goto slow_path;
2fdba6b0
HX
477
478 BUG_ON(frag->sk);
479 if (skb->sk) {
480 sock_hold(skb->sk);
481 frag->sk = skb->sk;
482 frag->destructor = sock_wfree;
483 skb->truesize -= frag->truesize;
484 }
1da177e4
LT
485 }
486
487 /* Everything is OK. Generate! */
488
489 err = 0;
490 offset = 0;
491 frag = skb_shinfo(skb)->frag_list;
492 skb_shinfo(skb)->frag_list = NULL;
493 skb->data_len = first_len - skb_headlen(skb);
494 skb->len = first_len;
495 iph->tot_len = htons(first_len);
496 iph->frag_off = htons(IP_MF);
497 ip_send_check(iph);
498
499 for (;;) {
500 /* Prepare header of the next frame,
501 * before previous one went down. */
502 if (frag) {
503 frag->ip_summed = CHECKSUM_NONE;
504 frag->h.raw = frag->data;
505 frag->nh.raw = __skb_push(frag, hlen);
506 memcpy(frag->nh.raw, iph, hlen);
507 iph = frag->nh.iph;
508 iph->tot_len = htons(frag->len);
509 ip_copy_metadata(frag, skb);
510 if (offset == 0)
511 ip_options_fragment(frag);
512 offset += skb->len - hlen;
513 iph->frag_off = htons(offset>>3);
514 if (frag->next != NULL)
515 iph->frag_off |= htons(IP_MF);
516 /* Ready, complete checksum */
517 ip_send_check(iph);
518 }
519
520 err = output(skb);
521
522 if (err || !frag)
523 break;
524
525 skb = frag;
526 frag = skb->next;
527 skb->next = NULL;
528 }
529
530 if (err == 0) {
531 IP_INC_STATS(IPSTATS_MIB_FRAGOKS);
532 return 0;
533 }
534
535 while (frag) {
536 skb = frag->next;
537 kfree_skb(frag);
538 frag = skb;
539 }
540 IP_INC_STATS(IPSTATS_MIB_FRAGFAILS);
541 return err;
542 }
543
544slow_path:
545 left = skb->len - hlen; /* Space per frame */
546 ptr = raw + hlen; /* Where to start from */
547
548#ifdef CONFIG_BRIDGE_NETFILTER
549 /* for bridged IP traffic encapsulated inside f.e. a vlan header,
550 * we need to make room for the encapsulating header */
551 ll_rs = LL_RESERVED_SPACE_EXTRA(rt->u.dst.dev, nf_bridge_pad(skb));
552 mtu -= nf_bridge_pad(skb);
553#else
554 ll_rs = LL_RESERVED_SPACE(rt->u.dst.dev);
555#endif
556 /*
557 * Fragment the datagram.
558 */
559
560 offset = (ntohs(iph->frag_off) & IP_OFFSET) << 3;
561 not_last_frag = iph->frag_off & htons(IP_MF);
562
563 /*
564 * Keep copying data until we run out.
565 */
566
567 while(left > 0) {
568 len = left;
569 /* IF: it doesn't fit, use 'mtu' - the data space left */
570 if (len > mtu)
571 len = mtu;
572 /* IF: we are not sending upto and including the packet end
573 then align the next start on an eight byte boundary */
574 if (len < left) {
575 len &= ~7;
576 }
577 /*
578 * Allocate buffer.
579 */
580
581 if ((skb2 = alloc_skb(len+hlen+ll_rs, GFP_ATOMIC)) == NULL) {
64ce2073 582 NETDEBUG(KERN_INFO "IP: frag: no memory for new fragment!\n");
1da177e4
LT
583 err = -ENOMEM;
584 goto fail;
585 }
586
587 /*
588 * Set up data on packet
589 */
590
591 ip_copy_metadata(skb2, skb);
592 skb_reserve(skb2, ll_rs);
593 skb_put(skb2, len + hlen);
594 skb2->nh.raw = skb2->data;
595 skb2->h.raw = skb2->data + hlen;
596
597 /*
598 * Charge the memory for the fragment to any owner
599 * it might possess
600 */
601
602 if (skb->sk)
603 skb_set_owner_w(skb2, skb->sk);
604
605 /*
606 * Copy the packet header into the new buffer.
607 */
608
609 memcpy(skb2->nh.raw, skb->data, hlen);
610
611 /*
612 * Copy a block of the IP datagram.
613 */
614 if (skb_copy_bits(skb, ptr, skb2->h.raw, len))
615 BUG();
616 left -= len;
617
618 /*
619 * Fill in the new header fields.
620 */
621 iph = skb2->nh.iph;
622 iph->frag_off = htons((offset >> 3));
623
624 /* ANK: dirty, but effective trick. Upgrade options only if
625 * the segment to be fragmented was THE FIRST (otherwise,
626 * options are already fixed) and make it ONCE
627 * on the initial skb, so that all the following fragments
628 * will inherit fixed options.
629 */
630 if (offset == 0)
631 ip_options_fragment(skb);
632
633 /*
634 * Added AC : If we are fragmenting a fragment that's not the
635 * last fragment then keep MF on each bit
636 */
637 if (left > 0 || not_last_frag)
638 iph->frag_off |= htons(IP_MF);
639 ptr += len;
640 offset += len;
641
642 /*
643 * Put this fragment into the sending queue.
644 */
645
646 IP_INC_STATS(IPSTATS_MIB_FRAGCREATES);
647
648 iph->tot_len = htons(len + hlen);
649
650 ip_send_check(iph);
651
652 err = output(skb2);
653 if (err)
654 goto fail;
655 }
656 kfree_skb(skb);
657 IP_INC_STATS(IPSTATS_MIB_FRAGOKS);
658 return err;
659
660fail:
661 kfree_skb(skb);
662 IP_INC_STATS(IPSTATS_MIB_FRAGFAILS);
663 return err;
664}
665
666int
667ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
668{
669 struct iovec *iov = from;
670
671 if (skb->ip_summed == CHECKSUM_HW) {
672 if (memcpy_fromiovecend(to, iov, offset, len) < 0)
673 return -EFAULT;
674 } else {
675 unsigned int csum = 0;
676 if (csum_partial_copy_fromiovecend(to, iov, offset, len, &csum) < 0)
677 return -EFAULT;
678 skb->csum = csum_block_add(skb->csum, csum, odd);
679 }
680 return 0;
681}
682
683static inline unsigned int
684csum_page(struct page *page, int offset, int copy)
685{
686 char *kaddr;
687 unsigned int csum;
688 kaddr = kmap(page);
689 csum = csum_partial(kaddr + offset, copy, 0);
690 kunmap(page);
691 return csum;
692}
693
4b30b1c6 694static inline int ip_ufo_append_data(struct sock *sk,
e89e9cf5
AR
695 int getfrag(void *from, char *to, int offset, int len,
696 int odd, struct sk_buff *skb),
697 void *from, int length, int hh_len, int fragheaderlen,
698 int transhdrlen, int mtu,unsigned int flags)
699{
700 struct sk_buff *skb;
701 int err;
702
703 /* There is support for UDP fragmentation offload by network
704 * device, so create one single skb packet containing complete
705 * udp datagram
706 */
707 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {
708 skb = sock_alloc_send_skb(sk,
709 hh_len + fragheaderlen + transhdrlen + 20,
710 (flags & MSG_DONTWAIT), &err);
711
712 if (skb == NULL)
713 return err;
714
715 /* reserve space for Hardware header */
716 skb_reserve(skb, hh_len);
717
718 /* create space for UDP/IP header */
719 skb_put(skb,fragheaderlen + transhdrlen);
720
721 /* initialize network header pointer */
722 skb->nh.raw = skb->data;
723
724 /* initialize protocol header pointer */
725 skb->h.raw = skb->data + fragheaderlen;
726
727 skb->ip_summed = CHECKSUM_HW;
728 skb->csum = 0;
729 sk->sk_sndmsg_off = 0;
730 }
731
732 err = skb_append_datato_frags(sk,skb, getfrag, from,
733 (length - transhdrlen));
734 if (!err) {
735 /* specify the length of each IP datagram fragment*/
736 skb_shinfo(skb)->ufo_size = (mtu - fragheaderlen);
737 __skb_queue_tail(&sk->sk_write_queue, skb);
738
739 return 0;
740 }
741 /* There is not enough support do UFO ,
742 * so follow normal path
743 */
744 kfree_skb(skb);
745 return err;
746}
747
1da177e4
LT
748/*
749 * ip_append_data() and ip_append_page() can make one large IP datagram
750 * from many pieces of data. Each pieces will be holded on the socket
751 * until ip_push_pending_frames() is called. Each piece can be a page
752 * or non-page data.
753 *
754 * Not only UDP, other transport protocols - e.g. raw sockets - can use
755 * this interface potentially.
756 *
757 * LATER: length must be adjusted by pad at tail, when it is required.
758 */
759int ip_append_data(struct sock *sk,
760 int getfrag(void *from, char *to, int offset, int len,
761 int odd, struct sk_buff *skb),
762 void *from, int length, int transhdrlen,
763 struct ipcm_cookie *ipc, struct rtable *rt,
764 unsigned int flags)
765{
766 struct inet_sock *inet = inet_sk(sk);
767 struct sk_buff *skb;
768
769 struct ip_options *opt = NULL;
770 int hh_len;
771 int exthdrlen;
772 int mtu;
773 int copy;
774 int err;
775 int offset = 0;
776 unsigned int maxfraglen, fragheaderlen;
777 int csummode = CHECKSUM_NONE;
778
779 if (flags&MSG_PROBE)
780 return 0;
781
782 if (skb_queue_empty(&sk->sk_write_queue)) {
783 /*
784 * setup for corking.
785 */
786 opt = ipc->opt;
787 if (opt) {
788 if (inet->cork.opt == NULL) {
789 inet->cork.opt = kmalloc(sizeof(struct ip_options) + 40, sk->sk_allocation);
790 if (unlikely(inet->cork.opt == NULL))
791 return -ENOBUFS;
792 }
793 memcpy(inet->cork.opt, opt, sizeof(struct ip_options)+opt->optlen);
794 inet->cork.flags |= IPCORK_OPT;
795 inet->cork.addr = ipc->addr;
796 }
797 dst_hold(&rt->u.dst);
798 inet->cork.fragsize = mtu = dst_mtu(rt->u.dst.path);
799 inet->cork.rt = rt;
800 inet->cork.length = 0;
801 sk->sk_sndmsg_page = NULL;
802 sk->sk_sndmsg_off = 0;
803 if ((exthdrlen = rt->u.dst.header_len) != 0) {
804 length += exthdrlen;
805 transhdrlen += exthdrlen;
806 }
807 } else {
808 rt = inet->cork.rt;
809 if (inet->cork.flags & IPCORK_OPT)
810 opt = inet->cork.opt;
811
812 transhdrlen = 0;
813 exthdrlen = 0;
814 mtu = inet->cork.fragsize;
815 }
816 hh_len = LL_RESERVED_SPACE(rt->u.dst.dev);
817
818 fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0);
819 maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
820
821 if (inet->cork.length + length > 0xFFFF - fragheaderlen) {
822 ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu-exthdrlen);
823 return -EMSGSIZE;
824 }
825
826 /*
827 * transhdrlen > 0 means that this is the first fragment and we wish
828 * it won't be fragmented in the future.
829 */
830 if (transhdrlen &&
831 length + fragheaderlen <= mtu &&
832 rt->u.dst.dev->features&(NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) &&
833 !exthdrlen)
834 csummode = CHECKSUM_HW;
835
836 inet->cork.length += length;
e89e9cf5
AR
837 if (((length > mtu) && (sk->sk_protocol == IPPROTO_UDP)) &&
838 (rt->u.dst.dev->features & NETIF_F_UFO)) {
839
840 if(ip_ufo_append_data(sk, getfrag, from, length, hh_len,
841 fragheaderlen, transhdrlen, mtu, flags))
842 goto error;
843
844 return 0;
845 }
1da177e4
LT
846
847 /* So, what's going on in the loop below?
848 *
849 * We use calculated fragment length to generate chained skb,
850 * each of segments is IP fragment ready for sending to network after
851 * adding appropriate IP header.
852 */
853
854 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL)
855 goto alloc_new_skb;
856
857 while (length > 0) {
858 /* Check if the remaining data fits into current packet. */
859 copy = mtu - skb->len;
860 if (copy < length)
861 copy = maxfraglen - skb->len;
862 if (copy <= 0) {
863 char *data;
864 unsigned int datalen;
865 unsigned int fraglen;
866 unsigned int fraggap;
867 unsigned int alloclen;
868 struct sk_buff *skb_prev;
869alloc_new_skb:
870 skb_prev = skb;
871 if (skb_prev)
872 fraggap = skb_prev->len - maxfraglen;
873 else
874 fraggap = 0;
875
876 /*
877 * If remaining data exceeds the mtu,
878 * we know we need more fragment(s).
879 */
880 datalen = length + fraggap;
881 if (datalen > mtu - fragheaderlen)
882 datalen = maxfraglen - fragheaderlen;
883 fraglen = datalen + fragheaderlen;
884
885 if ((flags & MSG_MORE) &&
886 !(rt->u.dst.dev->features&NETIF_F_SG))
887 alloclen = mtu;
888 else
889 alloclen = datalen + fragheaderlen;
890
891 /* The last fragment gets additional space at tail.
892 * Note, with MSG_MORE we overallocate on fragments,
893 * because we have no idea what fragment will be
894 * the last.
895 */
896 if (datalen == length)
897 alloclen += rt->u.dst.trailer_len;
898
899 if (transhdrlen) {
900 skb = sock_alloc_send_skb(sk,
901 alloclen + hh_len + 15,
902 (flags & MSG_DONTWAIT), &err);
903 } else {
904 skb = NULL;
905 if (atomic_read(&sk->sk_wmem_alloc) <=
906 2 * sk->sk_sndbuf)
907 skb = sock_wmalloc(sk,
908 alloclen + hh_len + 15, 1,
909 sk->sk_allocation);
910 if (unlikely(skb == NULL))
911 err = -ENOBUFS;
912 }
913 if (skb == NULL)
914 goto error;
915
916 /*
917 * Fill in the control structures
918 */
919 skb->ip_summed = csummode;
920 skb->csum = 0;
921 skb_reserve(skb, hh_len);
922
923 /*
924 * Find where to start putting bytes.
925 */
926 data = skb_put(skb, fraglen);
927 skb->nh.raw = data + exthdrlen;
928 data += fragheaderlen;
929 skb->h.raw = data + exthdrlen;
930
931 if (fraggap) {
932 skb->csum = skb_copy_and_csum_bits(
933 skb_prev, maxfraglen,
934 data + transhdrlen, fraggap, 0);
935 skb_prev->csum = csum_sub(skb_prev->csum,
936 skb->csum);
937 data += fraggap;
938 skb_trim(skb_prev, maxfraglen);
939 }
940
941 copy = datalen - transhdrlen - fraggap;
942 if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) {
943 err = -EFAULT;
944 kfree_skb(skb);
945 goto error;
946 }
947
948 offset += copy;
949 length -= datalen - fraggap;
950 transhdrlen = 0;
951 exthdrlen = 0;
952 csummode = CHECKSUM_NONE;
953
954 /*
955 * Put the packet on the pending queue.
956 */
957 __skb_queue_tail(&sk->sk_write_queue, skb);
958 continue;
959 }
960
961 if (copy > length)
962 copy = length;
963
964 if (!(rt->u.dst.dev->features&NETIF_F_SG)) {
965 unsigned int off;
966
967 off = skb->len;
968 if (getfrag(from, skb_put(skb, copy),
969 offset, copy, off, skb) < 0) {
970 __skb_trim(skb, off);
971 err = -EFAULT;
972 goto error;
973 }
974 } else {
975 int i = skb_shinfo(skb)->nr_frags;
976 skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1];
977 struct page *page = sk->sk_sndmsg_page;
978 int off = sk->sk_sndmsg_off;
979 unsigned int left;
980
981 if (page && (left = PAGE_SIZE - off) > 0) {
982 if (copy >= left)
983 copy = left;
984 if (page != frag->page) {
985 if (i == MAX_SKB_FRAGS) {
986 err = -EMSGSIZE;
987 goto error;
988 }
989 get_page(page);
990 skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
991 frag = &skb_shinfo(skb)->frags[i];
992 }
993 } else if (i < MAX_SKB_FRAGS) {
994 if (copy > PAGE_SIZE)
995 copy = PAGE_SIZE;
996 page = alloc_pages(sk->sk_allocation, 0);
997 if (page == NULL) {
998 err = -ENOMEM;
999 goto error;
1000 }
1001 sk->sk_sndmsg_page = page;
1002 sk->sk_sndmsg_off = 0;
1003
1004 skb_fill_page_desc(skb, i, page, 0, 0);
1005 frag = &skb_shinfo(skb)->frags[i];
1006 skb->truesize += PAGE_SIZE;
1007 atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
1008 } else {
1009 err = -EMSGSIZE;
1010 goto error;
1011 }
1012 if (getfrag(from, page_address(frag->page)+frag->page_offset+frag->size, offset, copy, skb->len, skb) < 0) {
1013 err = -EFAULT;
1014 goto error;
1015 }
1016 sk->sk_sndmsg_off += copy;
1017 frag->size += copy;
1018 skb->len += copy;
1019 skb->data_len += copy;
1020 }
1021 offset += copy;
1022 length -= copy;
1023 }
1024
1025 return 0;
1026
1027error:
1028 inet->cork.length -= length;
1029 IP_INC_STATS(IPSTATS_MIB_OUTDISCARDS);
1030 return err;
1031}
1032
1033ssize_t ip_append_page(struct sock *sk, struct page *page,
1034 int offset, size_t size, int flags)
1035{
1036 struct inet_sock *inet = inet_sk(sk);
1037 struct sk_buff *skb;
1038 struct rtable *rt;
1039 struct ip_options *opt = NULL;
1040 int hh_len;
1041 int mtu;
1042 int len;
1043 int err;
1044 unsigned int maxfraglen, fragheaderlen, fraggap;
1045
1046 if (inet->hdrincl)
1047 return -EPERM;
1048
1049 if (flags&MSG_PROBE)
1050 return 0;
1051
1052 if (skb_queue_empty(&sk->sk_write_queue))
1053 return -EINVAL;
1054
1055 rt = inet->cork.rt;
1056 if (inet->cork.flags & IPCORK_OPT)
1057 opt = inet->cork.opt;
1058
1059 if (!(rt->u.dst.dev->features&NETIF_F_SG))
1060 return -EOPNOTSUPP;
1061
1062 hh_len = LL_RESERVED_SPACE(rt->u.dst.dev);
1063 mtu = inet->cork.fragsize;
1064
1065 fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0);
1066 maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
1067
1068 if (inet->cork.length + size > 0xFFFF - fragheaderlen) {
1069 ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu);
1070 return -EMSGSIZE;
1071 }
1072
1073 if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL)
1074 return -EINVAL;
1075
1076 inet->cork.length += size;
e89e9cf5
AR
1077 if ((sk->sk_protocol == IPPROTO_UDP) &&
1078 (rt->u.dst.dev->features & NETIF_F_UFO))
1079 skb_shinfo(skb)->ufo_size = (mtu - fragheaderlen);
1080
1da177e4
LT
1081
1082 while (size > 0) {
1083 int i;
1084
e89e9cf5
AR
1085 if (skb_shinfo(skb)->ufo_size)
1086 len = size;
1087 else {
1088
1089 /* Check if the remaining data fits into current packet. */
1090 len = mtu - skb->len;
1091 if (len < size)
1092 len = maxfraglen - skb->len;
1093 }
1da177e4
LT
1094 if (len <= 0) {
1095 struct sk_buff *skb_prev;
1096 char *data;
1097 struct iphdr *iph;
1098 int alloclen;
1099
1100 skb_prev = skb;
0d0d2bba 1101 fraggap = skb_prev->len - maxfraglen;
1da177e4
LT
1102
1103 alloclen = fragheaderlen + hh_len + fraggap + 15;
1104 skb = sock_wmalloc(sk, alloclen, 1, sk->sk_allocation);
1105 if (unlikely(!skb)) {
1106 err = -ENOBUFS;
1107 goto error;
1108 }
1109
1110 /*
1111 * Fill in the control structures
1112 */
1113 skb->ip_summed = CHECKSUM_NONE;
1114 skb->csum = 0;
1115 skb_reserve(skb, hh_len);
1116
1117 /*
1118 * Find where to start putting bytes.
1119 */
1120 data = skb_put(skb, fragheaderlen + fraggap);
1121 skb->nh.iph = iph = (struct iphdr *)data;
1122 data += fragheaderlen;
1123 skb->h.raw = data;
1124
1125 if (fraggap) {
1126 skb->csum = skb_copy_and_csum_bits(
1127 skb_prev, maxfraglen,
1128 data, fraggap, 0);
1129 skb_prev->csum = csum_sub(skb_prev->csum,
1130 skb->csum);
1131 skb_trim(skb_prev, maxfraglen);
1132 }
1133
1134 /*
1135 * Put the packet on the pending queue.
1136 */
1137 __skb_queue_tail(&sk->sk_write_queue, skb);
1138 continue;
1139 }
1140
1141 i = skb_shinfo(skb)->nr_frags;
1142 if (len > size)
1143 len = size;
1144 if (skb_can_coalesce(skb, i, page, offset)) {
1145 skb_shinfo(skb)->frags[i-1].size += len;
1146 } else if (i < MAX_SKB_FRAGS) {
1147 get_page(page);
1148 skb_fill_page_desc(skb, i, page, offset, len);
1149 } else {
1150 err = -EMSGSIZE;
1151 goto error;
1152 }
1153
1154 if (skb->ip_summed == CHECKSUM_NONE) {
1155 unsigned int csum;
1156 csum = csum_page(page, offset, len);
1157 skb->csum = csum_block_add(skb->csum, csum, skb->len);
1158 }
1159
1160 skb->len += len;
1161 skb->data_len += len;
1162 offset += len;
1163 size -= len;
1164 }
1165 return 0;
1166
1167error:
1168 inet->cork.length -= size;
1169 IP_INC_STATS(IPSTATS_MIB_OUTDISCARDS);
1170 return err;
1171}
1172
1173/*
1174 * Combined all pending IP fragments on the socket as one IP datagram
1175 * and push them out.
1176 */
1177int ip_push_pending_frames(struct sock *sk)
1178{
1179 struct sk_buff *skb, *tmp_skb;
1180 struct sk_buff **tail_skb;
1181 struct inet_sock *inet = inet_sk(sk);
1182 struct ip_options *opt = NULL;
1183 struct rtable *rt = inet->cork.rt;
1184 struct iphdr *iph;
1185 int df = 0;
1186 __u8 ttl;
1187 int err = 0;
1188
1189 if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL)
1190 goto out;
1191 tail_skb = &(skb_shinfo(skb)->frag_list);
1192
1193 /* move skb->data to ip header from ext header */
1194 if (skb->data < skb->nh.raw)
1195 __skb_pull(skb, skb->nh.raw - skb->data);
1196 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
1197 __skb_pull(tmp_skb, skb->h.raw - skb->nh.raw);
1198 *tail_skb = tmp_skb;
1199 tail_skb = &(tmp_skb->next);
1200 skb->len += tmp_skb->len;
1201 skb->data_len += tmp_skb->len;
1202 skb->truesize += tmp_skb->truesize;
1203 __sock_put(tmp_skb->sk);
1204 tmp_skb->destructor = NULL;
1205 tmp_skb->sk = NULL;
1206 }
1207
1208 /* Unless user demanded real pmtu discovery (IP_PMTUDISC_DO), we allow
1209 * to fragment the frame generated here. No matter, what transforms
1210 * how transforms change size of the packet, it will come out.
1211 */
1212 if (inet->pmtudisc != IP_PMTUDISC_DO)
1213 skb->local_df = 1;
1214
1215 /* DF bit is set when we want to see DF on outgoing frames.
1216 * If local_df is set too, we still allow to fragment this frame
1217 * locally. */
1218 if (inet->pmtudisc == IP_PMTUDISC_DO ||
1219 (skb->len <= dst_mtu(&rt->u.dst) &&
1220 ip_dont_fragment(sk, &rt->u.dst)))
1221 df = htons(IP_DF);
1222
1223 if (inet->cork.flags & IPCORK_OPT)
1224 opt = inet->cork.opt;
1225
1226 if (rt->rt_type == RTN_MULTICAST)
1227 ttl = inet->mc_ttl;
1228 else
1229 ttl = ip_select_ttl(inet, &rt->u.dst);
1230
1231 iph = (struct iphdr *)skb->data;
1232 iph->version = 4;
1233 iph->ihl = 5;
1234 if (opt) {
1235 iph->ihl += opt->optlen>>2;
1236 ip_options_build(skb, opt, inet->cork.addr, rt, 0);
1237 }
1238 iph->tos = inet->tos;
1239 iph->tot_len = htons(skb->len);
1240 iph->frag_off = df;
1241 if (!df) {
1242 __ip_select_ident(iph, &rt->u.dst, 0);
1243 } else {
1244 iph->id = htons(inet->id++);
1245 }
1246 iph->ttl = ttl;
1247 iph->protocol = sk->sk_protocol;
1248 iph->saddr = rt->rt_src;
1249 iph->daddr = rt->rt_dst;
1250 ip_send_check(iph);
1251
1252 skb->priority = sk->sk_priority;
1253 skb->dst = dst_clone(&rt->u.dst);
1254
1255 /* Netfilter gets whole the not fragmented skb. */
1256 err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,
1257 skb->dst->dev, dst_output);
1258 if (err) {
1259 if (err > 0)
1260 err = inet->recverr ? net_xmit_errno(err) : 0;
1261 if (err)
1262 goto error;
1263 }
1264
1265out:
1266 inet->cork.flags &= ~IPCORK_OPT;
a51482bd
JJ
1267 kfree(inet->cork.opt);
1268 inet->cork.opt = NULL;
1da177e4
LT
1269 if (inet->cork.rt) {
1270 ip_rt_put(inet->cork.rt);
1271 inet->cork.rt = NULL;
1272 }
1273 return err;
1274
1275error:
1276 IP_INC_STATS(IPSTATS_MIB_OUTDISCARDS);
1277 goto out;
1278}
1279
1280/*
1281 * Throw away all pending data on the socket.
1282 */
1283void ip_flush_pending_frames(struct sock *sk)
1284{
1285 struct inet_sock *inet = inet_sk(sk);
1286 struct sk_buff *skb;
1287
1288 while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL)
1289 kfree_skb(skb);
1290
1291 inet->cork.flags &= ~IPCORK_OPT;
a51482bd
JJ
1292 kfree(inet->cork.opt);
1293 inet->cork.opt = NULL;
1da177e4
LT
1294 if (inet->cork.rt) {
1295 ip_rt_put(inet->cork.rt);
1296 inet->cork.rt = NULL;
1297 }
1298}
1299
1300
1301/*
1302 * Fetch data from kernel space and fill in checksum if needed.
1303 */
1304static int ip_reply_glue_bits(void *dptr, char *to, int offset,
1305 int len, int odd, struct sk_buff *skb)
1306{
1307 unsigned int csum;
1308
1309 csum = csum_partial_copy_nocheck(dptr+offset, to, len, 0);
1310 skb->csum = csum_block_add(skb->csum, csum, odd);
1311 return 0;
1312}
1313
1314/*
1315 * Generic function to send a packet as reply to another packet.
1316 * Used to send TCP resets so far. ICMP should use this function too.
1317 *
1318 * Should run single threaded per socket because it uses the sock
1319 * structure to pass arguments.
1320 *
1321 * LATER: switch from ip_build_xmit to ip_append_*
1322 */
1323void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg,
1324 unsigned int len)
1325{
1326 struct inet_sock *inet = inet_sk(sk);
1327 struct {
1328 struct ip_options opt;
1329 char data[40];
1330 } replyopts;
1331 struct ipcm_cookie ipc;
1332 u32 daddr;
1333 struct rtable *rt = (struct rtable*)skb->dst;
1334
1335 if (ip_options_echo(&replyopts.opt, skb))
1336 return;
1337
1338 daddr = ipc.addr = rt->rt_src;
1339 ipc.opt = NULL;
1340
1341 if (replyopts.opt.optlen) {
1342 ipc.opt = &replyopts.opt;
1343
1344 if (ipc.opt->srr)
1345 daddr = replyopts.opt.faddr;
1346 }
1347
1348 {
1349 struct flowi fl = { .nl_u = { .ip4_u =
1350 { .daddr = daddr,
1351 .saddr = rt->rt_spec_dst,
1352 .tos = RT_TOS(skb->nh.iph->tos) } },
1353 /* Not quite clean, but right. */
1354 .uli_u = { .ports =
1355 { .sport = skb->h.th->dest,
1356 .dport = skb->h.th->source } },
1357 .proto = sk->sk_protocol };
1358 if (ip_route_output_key(&rt, &fl))
1359 return;
1360 }
1361
1362 /* And let IP do all the hard work.
1363
1364 This chunk is not reenterable, hence spinlock.
1365 Note that it uses the fact, that this function is called
1366 with locally disabled BH and that sk cannot be already spinlocked.
1367 */
1368 bh_lock_sock(sk);
1369 inet->tos = skb->nh.iph->tos;
1370 sk->sk_priority = skb->priority;
1371 sk->sk_protocol = skb->nh.iph->protocol;
1372 ip_append_data(sk, ip_reply_glue_bits, arg->iov->iov_base, len, 0,
1373 &ipc, rt, MSG_DONTWAIT);
1374 if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
1375 if (arg->csumoffset >= 0)
1376 *((u16 *)skb->h.raw + arg->csumoffset) = csum_fold(csum_add(skb->csum, arg->csum));
1377 skb->ip_summed = CHECKSUM_NONE;
1378 ip_push_pending_frames(sk);
1379 }
1380
1381 bh_unlock_sock(sk);
1382
1383 ip_rt_put(rt);
1384}
1385
1da177e4
LT
1386void __init ip_init(void)
1387{
1da177e4
LT
1388 ip_rt_init();
1389 inet_initpeers();
1390
1391#if defined(CONFIG_IP_MULTICAST) && defined(CONFIG_PROC_FS)
1392 igmp_mc_proc_init();
1393#endif
1394}
1395
1da177e4
LT
1396EXPORT_SYMBOL(ip_fragment);
1397EXPORT_SYMBOL(ip_generic_getfrag);
1398EXPORT_SYMBOL(ip_queue_xmit);
1399EXPORT_SYMBOL(ip_send_check);