This source file includes following definitions.
- ip_ioctl
- ip_send
- ip_send_room
- ip_build_header
- ip_send_check
- ip_frag_create
- ip_find
- ip_free
- ip_expire
- ip_create
- ip_done
- ip_glue
- ip_defrag
- ip_fragment
- ip_forward
- ip_rcv
- ip_loopback
- ip_queue_xmit
- ip_mc_procinfo
- ip_mc_find_devfor
- ip_setsockopt
- ip_getsockopt
- ip_build_xmit
- ip_rt_event
- ip_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 #include <asm/segment.h>
117 #include <asm/system.h>
118 #include <linux/types.h>
119 #include <linux/kernel.h>
120 #include <linux/sched.h>
121 #include <linux/mm.h>
122 #include <linux/string.h>
123 #include <linux/errno.h>
124 #include <linux/config.h>
125
126 #include <linux/socket.h>
127 #include <linux/sockios.h>
128 #include <linux/in.h>
129 #include <linux/inet.h>
130 #include <linux/netdevice.h>
131 #include <linux/etherdevice.h>
132 #include <linux/proc_fs.h>
133 #include <linux/stat.h>
134
135 #include <net/snmp.h>
136 #include <net/ip.h>
137 #include <net/protocol.h>
138 #include <net/route.h>
139 #include <net/tcp.h>
140 #include <net/udp.h>
141 #include <linux/skbuff.h>
142 #include <net/sock.h>
143 #include <net/arp.h>
144 #include <net/icmp.h>
145 #include <net/raw.h>
146 #include <net/checksum.h>
147 #include <linux/igmp.h>
148 #include <linux/ip_fw.h>
149 #include <linux/mroute.h>
150
151 #define CONFIG_IP_DEFRAG
152
153 extern int last_retran;
154 extern void sort_send(struct sock *sk);
155
156 #define min(a,b) ((a)<(b)?(a):(b))
157
158
159
160
161
162 #ifdef CONFIG_IP_FORWARD
163 struct ip_mib ip_statistics={1,64,};
164 #else
165 struct ip_mib ip_statistics={2,64,};
166 #endif
167
168
169
170
171
172
173
174 int ip_ioctl(struct sock *sk, int cmd, unsigned long arg)
175 {
176 switch(cmd)
177 {
178 default:
179 return(-EINVAL);
180 }
181 }
182
183
184
185
186
187
188 static int ip_send(struct sk_buff *skb, unsigned long daddr, int len, struct device *dev, unsigned long saddr)
189 {
190 int mac = 0;
191
192 skb->dev = dev;
193 skb->arp = 1;
194 if (dev->hard_header)
195 {
196
197
198
199
200 skb_reserve(skb,(dev->hard_header_len+15)&~15);
201 mac = dev->hard_header(skb, dev, ETH_P_IP, NULL, NULL, len);
202 if (mac < 0)
203 {
204 mac = -mac;
205 skb->arp = 0;
206 skb->raddr = daddr;
207 }
208 }
209 return mac;
210 }
211
212 static int ip_send_room(struct sk_buff *skb, unsigned long daddr, int len, struct device *dev, unsigned long saddr)
213 {
214 int mac = 0;
215
216 skb->dev = dev;
217 skb->arp = 1;
218 if (dev->hard_header)
219 {
220 skb_reserve(skb,MAX_HEADER);
221 mac = dev->hard_header(skb, dev, ETH_P_IP, NULL, NULL, len);
222 if (mac < 0)
223 {
224 mac = -mac;
225 skb->arp = 0;
226 skb->raddr = daddr;
227 }
228 }
229 return mac;
230 }
231
232 int ip_id_count = 0;
233
234
235
236
237
238
239
240 int ip_build_header(struct sk_buff *skb, unsigned long saddr, unsigned long daddr,
241 struct device **dev, int type, struct options *opt, int len, int tos, int ttl)
242 {
243 struct rtable *rt;
244 unsigned long raddr;
245 int tmp;
246 unsigned long src;
247 struct iphdr *iph;
248
249
250
251
252
253 #ifdef CONFIG_IP_MULTICAST
254 if(MULTICAST(daddr) && *dev==NULL && skb->sk && *skb->sk->ip_mc_name)
255 *dev=dev_get(skb->sk->ip_mc_name);
256 #endif
257 if (*dev == NULL)
258 {
259 if(skb->localroute)
260 rt = ip_rt_local(daddr, NULL, &src);
261 else
262 rt = ip_rt_route(daddr, NULL, &src);
263 if (rt == NULL)
264 {
265 ip_statistics.IpOutNoRoutes++;
266 return(-ENETUNREACH);
267 }
268
269 *dev = rt->rt_dev;
270
271
272
273
274 if (LOOPBACK(saddr) && !LOOPBACK(daddr))
275 saddr = src;
276 raddr = rt->rt_gateway;
277
278 }
279 else
280 {
281
282
283
284 if(skb->localroute)
285 rt = ip_rt_local(daddr, NULL, &src);
286 else
287 rt = ip_rt_route(daddr, NULL, &src);
288
289
290
291
292 if (LOOPBACK(saddr) && !LOOPBACK(daddr))
293 saddr = src;
294
295 raddr = (rt == NULL) ? 0 : rt->rt_gateway;
296 }
297
298
299
300
301 if (saddr == 0)
302 saddr = src;
303
304
305
306
307 if (raddr == 0)
308 raddr = daddr;
309
310
311
312
313
314 if(type==IPPROTO_TCP)
315 tmp = ip_send_room(skb, raddr, len, *dev, saddr);
316 else
317 tmp = ip_send(skb, raddr, len, *dev, saddr);
318
319
320
321
322
323 skb->dev = *dev;
324 skb->saddr = saddr;
325 if (skb->sk)
326 skb->sk->saddr = saddr;
327
328
329
330
331
332
333
334
335
336
337 if(type == IPPROTO_RAW)
338 return (tmp);
339
340
341
342
343
344 iph=(struct iphdr *)skb_put(skb,sizeof(struct iphdr));
345
346 iph->version = 4;
347 iph->ihl = 5;
348 iph->tos = tos;
349 iph->frag_off = 0;
350 iph->ttl = ttl;
351 iph->daddr = daddr;
352 iph->saddr = saddr;
353 iph->protocol = type;
354 skb->ip_hdr = iph;
355
356 return(20 + tmp);
357 }
358
359
360
361
362
363
364 void ip_send_check(struct iphdr *iph)
365 {
366 iph->check = 0;
367 iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
368 }
369
370
371
372
373
374
375
376
377
378 static struct ipq *ipqueue = NULL;
379
380
381
382
383
384 static struct ipfrag *ip_frag_create(int offset, int end, struct sk_buff *skb, unsigned char *ptr)
385 {
386 struct ipfrag *fp;
387
388 fp = (struct ipfrag *) kmalloc(sizeof(struct ipfrag), GFP_ATOMIC);
389 if (fp == NULL)
390 {
391 NETDEBUG(printk("IP: frag_create: no memory left !\n"));
392 return(NULL);
393 }
394 memset(fp, 0, sizeof(struct ipfrag));
395
396
397 fp->offset = offset;
398 fp->end = end;
399 fp->len = end - offset;
400 fp->skb = skb;
401 fp->ptr = ptr;
402
403 return(fp);
404 }
405
406
407
408
409
410
411
412 static struct ipq *ip_find(struct iphdr *iph)
413 {
414 struct ipq *qp;
415 struct ipq *qplast;
416
417 cli();
418 qplast = NULL;
419 for(qp = ipqueue; qp != NULL; qplast = qp, qp = qp->next)
420 {
421 if (iph->id== qp->iph->id && iph->saddr == qp->iph->saddr &&
422 iph->daddr == qp->iph->daddr && iph->protocol == qp->iph->protocol)
423 {
424 del_timer(&qp->timer);
425 sti();
426 return(qp);
427 }
428 }
429 sti();
430 return(NULL);
431 }
432
433
434
435
436
437
438
439
440 static void ip_free(struct ipq *qp)
441 {
442 struct ipfrag *fp;
443 struct ipfrag *xp;
444
445
446
447
448
449 del_timer(&qp->timer);
450
451
452 cli();
453 if (qp->prev == NULL)
454 {
455 ipqueue = qp->next;
456 if (ipqueue != NULL)
457 ipqueue->prev = NULL;
458 }
459 else
460 {
461 qp->prev->next = qp->next;
462 if (qp->next != NULL)
463 qp->next->prev = qp->prev;
464 }
465
466
467
468 fp = qp->fragments;
469 while (fp != NULL)
470 {
471 xp = fp->next;
472 IS_SKB(fp->skb);
473 kfree_skb(fp->skb,FREE_READ);
474 kfree_s(fp, sizeof(struct ipfrag));
475 fp = xp;
476 }
477
478
479 kfree_s(qp->iph, 64 + 8);
480
481
482 kfree_s(qp, sizeof(struct ipq));
483 sti();
484 }
485
486
487
488
489
490
491 static void ip_expire(unsigned long arg)
492 {
493 struct ipq *qp;
494
495 qp = (struct ipq *)arg;
496
497
498
499
500
501 ip_statistics.IpReasmTimeout++;
502 ip_statistics.IpReasmFails++;
503
504 if(qp->fragments!=NULL)
505 icmp_send(qp->fragments->skb,ICMP_TIME_EXCEEDED,
506 ICMP_EXC_FRAGTIME, 0, qp->dev);
507
508
509
510
511 ip_free(qp);
512 }
513
514
515
516
517
518
519
520
521
522 static struct ipq *ip_create(struct sk_buff *skb, struct iphdr *iph, struct device *dev)
523 {
524 struct ipq *qp;
525 int ihlen;
526
527 qp = (struct ipq *) kmalloc(sizeof(struct ipq), GFP_ATOMIC);
528 if (qp == NULL)
529 {
530 NETDEBUG(printk("IP: create: no memory left !\n"));
531 return(NULL);
532 skb->dev = qp->dev;
533 }
534 memset(qp, 0, sizeof(struct ipq));
535
536
537
538
539
540 ihlen = iph->ihl * 4;
541 qp->iph = (struct iphdr *) kmalloc(64 + 8, GFP_ATOMIC);
542 if (qp->iph == NULL)
543 {
544 NETDEBUG(printk("IP: create: no memory left !\n"));
545 kfree_s(qp, sizeof(struct ipq));
546 return(NULL);
547 }
548
549 memcpy(qp->iph, iph, ihlen + 8);
550 qp->len = 0;
551 qp->ihlen = ihlen;
552 qp->fragments = NULL;
553 qp->dev = dev;
554
555
556 qp->timer.expires = jiffies + IP_FRAG_TIME;
557 qp->timer.data = (unsigned long) qp;
558 qp->timer.function = ip_expire;
559 add_timer(&qp->timer);
560
561
562 qp->prev = NULL;
563 cli();
564 qp->next = ipqueue;
565 if (qp->next != NULL)
566 qp->next->prev = qp;
567 ipqueue = qp;
568 sti();
569 return(qp);
570 }
571
572
573
574
575
576
577 static int ip_done(struct ipq *qp)
578 {
579 struct ipfrag *fp;
580 int offset;
581
582
583 if (qp->len == 0)
584 return(0);
585
586
587 fp = qp->fragments;
588 offset = 0;
589 while (fp != NULL)
590 {
591 if (fp->offset > offset)
592 return(0);
593 offset = fp->end;
594 fp = fp->next;
595 }
596
597
598 return(1);
599 }
600
601
602
603
604
605
606
607
608
609
610 static struct sk_buff *ip_glue(struct ipq *qp)
611 {
612 struct sk_buff *skb;
613 struct iphdr *iph;
614 struct ipfrag *fp;
615 unsigned char *ptr;
616 int count, len;
617
618
619
620
621 len = qp->ihlen + qp->len;
622
623 if ((skb = dev_alloc_skb(len)) == NULL)
624 {
625 ip_statistics.IpReasmFails++;
626 NETDEBUG(printk("IP: queue_glue: no memory for gluing queue %p\n", qp));
627 ip_free(qp);
628 return(NULL);
629 }
630
631
632 skb_put(skb,len);
633 skb->h.raw = skb->data;
634 skb->free = 1;
635
636
637 ptr = (unsigned char *) skb->h.raw;
638 memcpy(ptr, ((unsigned char *) qp->iph), qp->ihlen);
639 ptr += qp->ihlen;
640
641 count = 0;
642
643
644 fp = qp->fragments;
645 while(fp != NULL)
646 {
647 if(count+fp->len > skb->len)
648 {
649 NETDEBUG(printk("Invalid fragment list: Fragment over size.\n"));
650 ip_free(qp);
651 kfree_skb(skb,FREE_WRITE);
652 ip_statistics.IpReasmFails++;
653 return NULL;
654 }
655 memcpy((ptr + fp->offset), fp->ptr, fp->len);
656 count += fp->len;
657 fp = fp->next;
658 }
659
660
661 ip_free(qp);
662
663
664 iph = skb->h.iph;
665 iph->frag_off = 0;
666 iph->tot_len = htons((iph->ihl * 4) + count);
667 skb->ip_hdr = iph;
668
669 ip_statistics.IpReasmOKs++;
670 return(skb);
671 }
672
673
674
675
676
677
678 static struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct device *dev)
679 {
680 struct ipfrag *prev, *next, *tmp;
681 struct ipfrag *tfp;
682 struct ipq *qp;
683 struct sk_buff *skb2;
684 unsigned char *ptr;
685 int flags, offset;
686 int i, ihl, end;
687
688 ip_statistics.IpReasmReqds++;
689
690
691 qp = ip_find(iph);
692
693
694 offset = ntohs(iph->frag_off);
695 flags = offset & ~IP_OFFSET;
696 offset &= IP_OFFSET;
697 if (((flags & IP_MF) == 0) && (offset == 0))
698 {
699 if (qp != NULL)
700 ip_free(qp);
701 return(skb);
702 }
703
704 offset <<= 3;
705
706
707
708
709
710
711
712 if (qp != NULL)
713 {
714 del_timer(&qp->timer);
715 qp->timer.expires = jiffies + IP_FRAG_TIME;
716 qp->timer.data = (unsigned long) qp;
717 qp->timer.function = ip_expire;
718 add_timer(&qp->timer);
719 }
720 else
721 {
722
723
724
725 if ((qp = ip_create(skb, iph, dev)) == NULL)
726 {
727 skb->sk = NULL;
728 kfree_skb(skb, FREE_READ);
729 ip_statistics.IpReasmFails++;
730 return NULL;
731 }
732 }
733
734
735
736
737
738 ihl = iph->ihl * 4;
739 end = offset + ntohs(iph->tot_len) - ihl;
740
741
742
743
744
745 ptr = skb->data + ihl;
746
747
748
749
750
751 if ((flags & IP_MF) == 0)
752 qp->len = end;
753
754
755
756
757
758
759
760 prev = NULL;
761 for(next = qp->fragments; next != NULL; next = next->next)
762 {
763 if (next->offset > offset)
764 break;
765 prev = next;
766 }
767
768
769
770
771
772
773 if (prev != NULL && offset < prev->end)
774 {
775 i = prev->end - offset;
776 offset += i;
777 ptr += i;
778 }
779
780
781
782
783
784
785 for(tmp=next; tmp != NULL; tmp = tfp)
786 {
787 tfp = tmp->next;
788 if (tmp->offset >= end)
789 break;
790
791 i = end - next->offset;
792 tmp->len -= i;
793 tmp->offset += i;
794 tmp->ptr += i;
795
796
797
798
799 if (tmp->len <= 0)
800 {
801 if (tmp->prev != NULL)
802 tmp->prev->next = tmp->next;
803 else
804 qp->fragments = tmp->next;
805
806 if (tfp->next != NULL)
807 tmp->next->prev = tmp->prev;
808
809 next=tfp;
810
811 kfree_skb(tmp->skb,FREE_READ);
812 kfree_s(tmp, sizeof(struct ipfrag));
813 }
814 }
815
816
817
818
819
820 tfp = NULL;
821 tfp = ip_frag_create(offset, end, skb, ptr);
822
823
824
825
826
827 if (!tfp)
828 {
829 skb->sk = NULL;
830 kfree_skb(skb, FREE_READ);
831 return NULL;
832 }
833 tfp->prev = prev;
834 tfp->next = next;
835 if (prev != NULL)
836 prev->next = tfp;
837 else
838 qp->fragments = tfp;
839
840 if (next != NULL)
841 next->prev = tfp;
842
843
844
845
846
847
848
849 if (ip_done(qp))
850 {
851 skb2 = ip_glue(qp);
852 return(skb2);
853 }
854 return(NULL);
855 }
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872 void ip_fragment(struct sock *sk, struct sk_buff *skb, struct device *dev, int is_frag)
873 {
874 struct iphdr *iph;
875 unsigned char *raw;
876 unsigned char *ptr;
877 struct sk_buff *skb2;
878 int left, mtu, hlen, len;
879 int offset;
880 unsigned long flags;
881
882
883
884
885
886 raw = skb->data;
887 #if 0
888 iph = (struct iphdr *) (raw + dev->hard_header_len);
889 skb->ip_hdr = iph;
890 #else
891 iph = skb->ip_hdr;
892 #endif
893
894
895
896
897
898 hlen = iph->ihl * 4;
899 left = ntohs(iph->tot_len) - hlen;
900 hlen += dev->hard_header_len;
901 mtu = (dev->mtu - hlen);
902 ptr = (raw + hlen);
903
904
905
906
907
908 if (ntohs(iph->frag_off) & IP_DF)
909 {
910
911
912
913 ip_statistics.IpFragFails++;
914 icmp_send(skb,ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, dev->mtu, dev);
915 return;
916 }
917
918
919
920
921
922
923
924 if(mtu<8)
925 {
926
927 icmp_send(skb,ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED,dev->mtu, dev);
928 ip_statistics.IpFragFails++;
929 return;
930 }
931
932
933
934
935
936
937
938
939
940
941 if (is_frag & 2)
942 offset = (ntohs(iph->frag_off) & IP_OFFSET) << 3;
943 else
944 offset = 0;
945
946
947
948
949
950
951 while(left > 0)
952 {
953 len = left;
954
955 if (len > mtu)
956 len = mtu;
957
958
959 if (len < left)
960 {
961 len/=8;
962 len*=8;
963 }
964
965
966
967
968 if ((skb2 = alloc_skb(len + hlen+15,GFP_ATOMIC)) == NULL)
969 {
970 NETDEBUG(printk("IP: frag: no memory for new fragment!\n"));
971 ip_statistics.IpFragFails++;
972 return;
973 }
974
975
976
977
978
979 skb2->arp = skb->arp;
980 if(skb->free==0)
981 printk("IP fragmenter: BUG free!=1 in fragmenter\n");
982 skb2->free = 1;
983 skb_put(skb2,len + hlen);
984 skb2->h.raw=(char *) skb2->data;
985
986
987
988
989
990 save_flags(flags);
991 if (sk)
992 {
993 cli();
994 sk->wmem_alloc += skb2->truesize;
995 skb2->sk=sk;
996 }
997 restore_flags(flags);
998 skb2->raddr = skb->raddr;
999
1000
1001
1002
1003
1004 memcpy(skb2->h.raw, raw, hlen);
1005
1006
1007
1008
1009 memcpy(skb2->h.raw + hlen, ptr, len);
1010 left -= len;
1011
1012 skb2->h.raw+=dev->hard_header_len;
1013
1014
1015
1016
1017 iph = (struct iphdr *)(skb2->h.raw);
1018 iph->frag_off = htons((offset >> 3));
1019 skb2->ip_hdr = iph;
1020
1021
1022
1023
1024 if (left > 0 || (is_frag & 1))
1025 iph->frag_off |= htons(IP_MF);
1026 ptr += len;
1027 offset += len;
1028
1029
1030
1031
1032
1033 ip_statistics.IpFragCreates++;
1034
1035 ip_queue_xmit(sk, dev, skb2, 2);
1036 }
1037 ip_statistics.IpFragOKs++;
1038 }
1039
1040
1041
1042 #ifdef CONFIG_IP_FORWARD
1043
1044
1045
1046
1047
1048 int ip_forward(struct sk_buff *skb, struct device *dev, int is_frag, unsigned long target_addr, int target_strict)
1049 {
1050 struct device *dev2;
1051 struct iphdr *iph;
1052 struct sk_buff *skb2;
1053 struct rtable *rt;
1054 unsigned char *ptr;
1055 unsigned long raddr;
1056 #ifdef CONFIG_IP_FIREWALL
1057 int fw_res = 0;
1058 #ifdef CONFIG_IP_MASQUERADE
1059 struct sk_buff *skb_in = skb;
1060 #endif
1061
1062
1063
1064
1065
1066
1067
1068 if(!(is_frag&4))
1069 {
1070 fw_res=ip_fw_chk(skb->h.iph, dev, ip_fw_fwd_chain, ip_fw_fwd_policy, 0);
1071 switch (fw_res) {
1072 case 1:
1073 #ifdef CONFIG_IP_MASQUERADE
1074 case 2:
1075 #endif
1076 break;
1077 case -1:
1078 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0, dev);
1079
1080 default:
1081 return -1;
1082 }
1083 }
1084 #endif
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096 iph = skb->h.iph;
1097 iph->ttl--;
1098
1099
1100
1101
1102
1103
1104
1105 iph->check = ntohs(iph->check) + 0x0100;
1106 if ((iph->check & 0xFF00) == 0)
1107 iph->check++;
1108 iph->check = htons(iph->check);
1109
1110 if (iph->ttl <= 0)
1111 {
1112
1113 icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0, dev);
1114 return -1;
1115 }
1116
1117
1118
1119
1120
1121
1122 rt = ip_rt_route(target_addr, NULL, NULL);
1123 if (rt == NULL)
1124 {
1125
1126
1127
1128
1129 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_UNREACH, 0, dev);
1130 return -1;
1131 }
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 raddr = rt->rt_gateway;
1143
1144 if (raddr != 0)
1145 {
1146
1147
1148
1149
1150 if(target_strict)
1151 {
1152 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_SR_FAILED, 0, dev);
1153 return -1;
1154 }
1155
1156
1157
1158
1159
1160
1161 rt = ip_rt_route(raddr, NULL, NULL);
1162 if (rt == NULL)
1163 {
1164
1165
1166
1167 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0, dev);
1168 return -1;
1169 }
1170 if (rt->rt_gateway != 0)
1171 raddr = rt->rt_gateway;
1172 }
1173 else
1174 raddr = target_addr;
1175
1176
1177
1178
1179
1180 dev2 = rt->rt_dev;
1181
1182
1183
1184
1185
1186
1187 #ifndef CONFIG_IP_NO_ICMP_REDIRECT
1188 if (dev == dev2 && !((iph->saddr^iph->daddr)&dev->pa_mask) && (rt->rt_flags&RTF_MODIFIED))
1189 icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, raddr, dev);
1190 #endif
1191
1192
1193
1194
1195
1196
1197 if (dev2->flags & IFF_UP)
1198 {
1199 #ifdef CONFIG_IP_MASQUERADE
1200
1201
1202
1203
1204 if (!(is_frag&4) && fw_res==2)
1205 ip_fw_masquerade(&skb, dev2);
1206 #endif
1207 IS_SKB(skb);
1208
1209 if(skb_headroom(skb)<dev2->hard_header_len)
1210 {
1211 skb2 = alloc_skb(dev2->hard_header_len + skb->len + 15, GFP_ATOMIC);
1212 IS_SKB(skb2);
1213
1214
1215
1216
1217
1218
1219 if (skb2 == NULL)
1220 {
1221 NETDEBUG(printk("\nIP: No memory available for IP forward\n"));
1222 return -1;
1223 }
1224
1225
1226
1227
1228
1229 ip_send(skb2,raddr,skb->len,dev2,dev2->pa_addr);
1230
1231
1232
1233
1234
1235
1236 ptr = skb_put(skb2,skb->len);
1237 skb2->free = 1;
1238 skb2->h.raw = ptr;
1239
1240
1241
1242
1243 memcpy(ptr, skb->h.raw, skb->len);
1244 }
1245 else
1246 {
1247
1248
1249
1250
1251 skb2 = skb;
1252 skb2->dev=dev2;
1253 skb->arp=1;
1254 skb->raddr=raddr;
1255 if(dev2->hard_header)
1256 {
1257 if(dev2->hard_header(skb, dev2, ETH_P_IP, NULL, NULL, skb->len)<0)
1258 skb->arp=0;
1259 }
1260 ip_statistics.IpForwDatagrams++;
1261 }
1262
1263
1264
1265
1266
1267
1268 if(skb2->len > dev2->mtu + dev2->hard_header_len)
1269 {
1270 ip_fragment(NULL,skb2,dev2, is_frag);
1271 kfree_skb(skb2,FREE_WRITE);
1272 }
1273 else
1274 {
1275 #ifdef CONFIG_IP_ACCT
1276
1277
1278
1279
1280 ip_fw_chk(iph,dev,ip_acct_chain,IP_FW_F_ACCEPT,1);
1281 #endif
1282
1283
1284
1285
1286
1287
1288 if(iph->tos & IPTOS_LOWDELAY)
1289 dev_queue_xmit(skb2, dev2, SOPRI_INTERACTIVE);
1290 else if(iph->tos & IPTOS_THROUGHPUT)
1291 dev_queue_xmit(skb2, dev2, SOPRI_BACKGROUND);
1292 else
1293 dev_queue_xmit(skb2, dev2, SOPRI_NORMAL);
1294 }
1295 }
1296 else
1297 return -1;
1298
1299
1300
1301
1302
1303 if(skb==skb2)
1304 return 0;
1305
1306 #ifdef CONFIG_IP_MASQUERADE
1307
1308
1309
1310
1311 if(skb!=skb_in)
1312 {
1313 kfree_skb(skb_in, FREE_WRITE);
1314 return 0;
1315 }
1316 #endif
1317 return 1;
1318 }
1319
1320
1321 #endif
1322
1323
1324
1325
1326
1327
1328
1329
1330 int ip_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
1331 {
1332 struct iphdr *iph = skb->h.iph;
1333 struct sock *raw_sk=NULL;
1334 unsigned char hash;
1335 unsigned char flag = 0;
1336 struct inet_protocol *ipprot;
1337 int brd=IS_MYADDR;
1338 unsigned long target_addr;
1339 int target_strict=0;
1340 int is_frag=0;
1341 #ifdef CONFIG_IP_FIREWALL
1342 int err;
1343 #endif
1344
1345 #ifdef CONFIG_NET_IPV6
1346
1347
1348
1349
1350 if(iph->version == 6)
1351 return ipv6_rcv(skb,dev,pt);
1352 #endif
1353
1354 ip_statistics.IpInReceives++;
1355
1356
1357
1358
1359
1360 skb->ip_hdr = iph;
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375 if (skb->len<sizeof(struct iphdr) || iph->ihl<5 || iph->version != 4 || ip_fast_csum((unsigned char *)iph, iph->ihl) !=0
1376 || skb->len < ntohs(iph->tot_len))
1377 {
1378 ip_statistics.IpInHdrErrors++;
1379 kfree_skb(skb, FREE_WRITE);
1380 return(0);
1381 }
1382
1383
1384
1385
1386
1387
1388
1389 skb_trim(skb,ntohs(iph->tot_len));
1390
1391
1392
1393
1394
1395 #ifdef CONFIG_IP_FIREWALL
1396
1397 if ((err=ip_fw_chk(iph,dev,ip_fw_blk_chain,ip_fw_blk_policy, 0))<1)
1398 {
1399 if(err==-1)
1400 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0, dev);
1401 kfree_skb(skb, FREE_WRITE);
1402 return 0;
1403 }
1404
1405 #endif
1406
1407
1408
1409
1410
1411
1412
1413 target_addr = iph->daddr;
1414
1415 if (iph->ihl != 5)
1416 {
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427 int opt_space=4*(iph->ihl-5);
1428 int opt_size;
1429 unsigned char *opt_ptr=skb->h.raw+sizeof(struct iphdr);
1430
1431 skb->ip_summed=0;
1432
1433 while(opt_space>0)
1434 {
1435 if(*opt_ptr==IPOPT_NOOP)
1436 {
1437 opt_ptr++;
1438 opt_space--;
1439 continue;
1440 }
1441 if(*opt_ptr==IPOPT_END)
1442 break;
1443 if(opt_space<2 || (opt_size=opt_ptr[1])<2 || opt_ptr[1]>opt_space)
1444 {
1445
1446
1447
1448 icmp_send(skb, ICMP_PARAMETERPROB, 0, 0, skb->dev);
1449 kfree_skb(skb, FREE_READ);
1450 return -EINVAL;
1451 }
1452 switch(opt_ptr[0])
1453 {
1454 case IPOPT_SEC:
1455
1456 break;
1457 case IPOPT_SSRR:
1458 target_strict=1;
1459
1460 case IPOPT_LSRR:
1461 #ifdef CONFIG_IP_NOSR
1462 kfree_skb(skb, FREE_READ);
1463 return -EINVAL;
1464 #endif
1465 case IPOPT_RR:
1466
1467
1468
1469 if (iph->daddr!=skb->dev->pa_addr && (brd = ip_chk_addr(iph->daddr)) == 0)
1470 break;
1471 if((opt_size<3) || ( opt_ptr[0]==IPOPT_RR && opt_ptr[2] > opt_size-4 ))
1472 {
1473 if(ip_chk_addr(iph->daddr))
1474 icmp_send(skb, ICMP_PARAMETERPROB, 0, 0, skb->dev);
1475 kfree_skb(skb, FREE_READ);
1476 return -EINVAL;
1477 }
1478 if(opt_ptr[2] > opt_size-4 )
1479 break;
1480
1481
1482 if(opt_ptr[0]!=IPOPT_RR)
1483 {
1484 int t;
1485 target_addr=*(u32 *)(&opt_ptr[opt_ptr[2]]);
1486 t=ip_chk_addr(target_addr);
1487 if(t==IS_MULTICAST||t==IS_BROADCAST)
1488 {
1489 if(ip_chk_addr(iph->daddr))
1490 icmp_send(skb, ICMP_PARAMETERPROB, 0, 0, skb->dev);
1491 kfree_skb(skb,FREE_READ);
1492 return -EINVAL;
1493 }
1494 }
1495 *(u32 *)(&opt_ptr[opt_ptr[2]])=skb->dev->pa_addr;
1496 break;
1497 case IPOPT_TIMESTAMP:
1498
1499
1500
1501
1502 NETDEBUG(printk("ICMP: Someone finish the timestamp routine ;)\n"));
1503 break;
1504 default:
1505 break;
1506 }
1507 opt_ptr+=opt_size;
1508 opt_space-=opt_size;
1509 }
1510
1511 }
1512
1513
1514
1515
1516
1517
1518 if(iph->frag_off)
1519 {
1520 if (iph->frag_off & htons(IP_MF))
1521 is_frag|=1;
1522
1523
1524
1525
1526 if (iph->frag_off & htons(IP_OFFSET))
1527 is_frag|=2;
1528 }
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542 if ( iph->daddr == skb->dev->pa_addr || (brd = ip_chk_addr(iph->daddr)) != 0)
1543 {
1544 #ifdef CONFIG_IP_MULTICAST
1545 if(!(dev->flags&IFF_ALLMULTI) && brd==IS_MULTICAST && iph->daddr!=IGMP_ALL_HOSTS && !(dev->flags&IFF_LOOPBACK))
1546 {
1547
1548
1549
1550 struct ip_mc_list *ip_mc=dev->ip_mc_list;
1551 do
1552 {
1553 if(ip_mc==NULL)
1554 {
1555 kfree_skb(skb, FREE_WRITE);
1556 return 0;
1557 }
1558 if(ip_mc->multiaddr==iph->daddr)
1559 break;
1560 ip_mc=ip_mc->next;
1561 }
1562 while(1);
1563 }
1564 #endif
1565
1566 #ifdef CONFIG_IP_MASQUERADE
1567
1568
1569
1570 if (ip_fw_demasquerade(skb))
1571 {
1572 struct iphdr *iph=skb->h.iph;
1573 if(ip_forward(skb, dev, is_frag|4, iph->daddr, 0))
1574 kfree_skb(skb, FREE_WRITE);
1575 return(0);
1576 }
1577 #endif
1578
1579
1580
1581
1582
1583 #ifdef CONFIG_IP_ACCT
1584 ip_fw_chk(iph,dev,ip_acct_chain,IP_FW_F_ACCEPT,1);
1585 #endif
1586
1587
1588
1589
1590
1591 if(is_frag)
1592 {
1593
1594 skb=ip_defrag(iph,skb,dev);
1595 if(skb==NULL)
1596 return 0;
1597 skb->dev = dev;
1598 iph=skb->h.iph;
1599 }
1600
1601
1602
1603
1604
1605 skb->ip_hdr = iph;
1606 skb->h.raw += iph->ihl*4;
1607
1608
1609
1610
1611
1612
1613
1614 hash = iph->protocol & (SOCK_ARRAY_SIZE-1);
1615
1616
1617
1618
1619
1620 if((raw_sk=raw_prot.sock_array[hash])!=NULL)
1621 {
1622 struct sock *sknext=NULL;
1623 struct sk_buff *skb1;
1624 raw_sk=get_sock_raw(raw_sk, iph->protocol, iph->saddr, iph->daddr);
1625 if(raw_sk)
1626 {
1627 do
1628 {
1629
1630 sknext=get_sock_raw(raw_sk->next, iph->protocol, iph->saddr, iph->daddr);
1631 if(sknext)
1632 skb1=skb_clone(skb, GFP_ATOMIC);
1633 else
1634 break;
1635 if(skb1)
1636 raw_rcv(raw_sk, skb1, dev, iph->saddr,iph->daddr);
1637 raw_sk=sknext;
1638 }
1639 while(raw_sk!=NULL);
1640
1641
1642
1643
1644
1645
1646
1647
1648 }
1649 }
1650
1651
1652
1653
1654
1655 hash = iph->protocol & (MAX_INET_PROTOS -1);
1656 for (ipprot = (struct inet_protocol *)inet_protos[hash];ipprot != NULL;ipprot=(struct inet_protocol *)ipprot->next)
1657 {
1658 struct sk_buff *skb2;
1659
1660 if (ipprot->protocol != iph->protocol)
1661 continue;
1662
1663
1664
1665
1666
1667
1668
1669 if (ipprot->copy || raw_sk)
1670 {
1671 skb2 = skb_clone(skb, GFP_ATOMIC);
1672 if(skb2==NULL)
1673 continue;
1674 }
1675 else
1676 {
1677 skb2 = skb;
1678 }
1679 flag = 1;
1680
1681
1682
1683
1684
1685
1686
1687 ipprot->handler(skb2, dev, NULL, iph->daddr,
1688 (ntohs(iph->tot_len) - (iph->ihl * 4)),
1689 iph->saddr, 0, ipprot);
1690
1691 }
1692
1693
1694
1695
1696
1697
1698
1699
1700 if(raw_sk!=NULL)
1701 raw_rcv(raw_sk, skb, dev, iph->saddr, iph->daddr);
1702 else if (!flag)
1703 {
1704 if (brd != IS_BROADCAST && brd!=IS_MULTICAST)
1705 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PROT_UNREACH, 0, dev);
1706 kfree_skb(skb, FREE_WRITE);
1707 }
1708
1709 return(0);
1710 }
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720 if(skb->pkt_type!=PACKET_HOST || brd==IS_BROADCAST)
1721 {
1722 kfree_skb(skb,FREE_WRITE);
1723 return 0;
1724 }
1725
1726
1727
1728
1729
1730 #ifdef CONFIG_IP_FORWARD
1731 if(ip_forward(skb, dev, is_frag, target_addr, target_strict))
1732 kfree_skb(skb, FREE_WRITE);
1733 #else
1734
1735
1736 ip_statistics.IpInAddrErrors++;
1737 kfree_skb(skb, FREE_WRITE);
1738 #endif
1739 return(0);
1740 }
1741
1742
1743
1744
1745
1746
1747 static void ip_loopback(struct device *old_dev, struct sk_buff *skb)
1748 {
1749 struct device *dev=&loopback_dev;
1750 int len=ntohs(skb->ip_hdr->tot_len);
1751 struct sk_buff *newskb=dev_alloc_skb(len+dev->hard_header_len+15);
1752
1753 if(newskb==NULL)
1754 return;
1755
1756 newskb->link3=NULL;
1757 newskb->sk=NULL;
1758 newskb->dev=dev;
1759 newskb->saddr=skb->saddr;
1760 newskb->daddr=skb->daddr;
1761 newskb->raddr=skb->raddr;
1762 newskb->free=1;
1763 newskb->lock=0;
1764 newskb->users=0;
1765 newskb->pkt_type=skb->pkt_type;
1766
1767
1768
1769
1770 ip_send(newskb, skb->ip_hdr->daddr, len, dev, skb->ip_hdr->saddr);
1771
1772
1773
1774 newskb->ip_hdr=(struct iphdr *)skb_put(newskb, len);
1775
1776
1777
1778 memcpy(newskb->ip_hdr,skb->ip_hdr,len);
1779
1780
1781
1782
1783 ip_queue_xmit(NULL, dev, newskb, 1);
1784 }
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796 void ip_queue_xmit(struct sock *sk, struct device *dev,
1797 struct sk_buff *skb, int free)
1798 {
1799 struct iphdr *iph;
1800
1801
1802
1803 if (dev == NULL)
1804 {
1805 NETDEBUG(printk("IP: ip_queue_xmit dev = NULL\n"));
1806 return;
1807 }
1808
1809 IS_SKB(skb);
1810
1811
1812
1813
1814
1815
1816 skb->dev = dev;
1817 skb->when = jiffies;
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827 #if 0
1828 ptr = skb->data;
1829 ptr += dev->hard_header_len;
1830 iph = (struct iphdr *)ptr;
1831 skb->ip_hdr = iph;
1832 #else
1833 iph = skb->ip_hdr;
1834 #endif
1835 iph->tot_len = ntohs(skb->len-(((unsigned char *)iph)-skb->data));
1836
1837 #ifdef CONFIG_IP_FIREWALL
1838 if(ip_fw_chk(iph, dev, ip_fw_blk_chain, ip_fw_blk_policy, 0) < 1)
1839
1840 return;
1841 #endif
1842
1843
1844
1845
1846
1847 if(free!=2)
1848 iph->id = htons(ip_id_count++);
1849 else
1850 free=1;
1851
1852
1853 if (sk == NULL)
1854 free = 1;
1855
1856 skb->free = free;
1857
1858
1859
1860
1861
1862
1863
1864 if(ntohs(iph->tot_len)> dev->mtu)
1865 {
1866 ip_fragment(sk,skb,dev,0);
1867 IS_SKB(skb);
1868 kfree_skb(skb,FREE_WRITE);
1869 return;
1870 }
1871
1872
1873
1874
1875
1876 ip_send_check(iph);
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886 if (skb->next != NULL)
1887 {
1888 NETDEBUG(printk("ip_queue_xmit: next != NULL\n"));
1889 skb_unlink(skb);
1890 }
1891
1892
1893
1894
1895
1896
1897
1898
1899 if (!free)
1900 {
1901 unsigned long flags;
1902
1903
1904 sk->packets_out++;
1905
1906
1907 save_flags(flags);
1908 cli();
1909
1910 if (skb->link3 != NULL)
1911 {
1912 NETDEBUG(printk("ip.c: link3 != NULL\n"));
1913 skb->link3 = NULL;
1914 }
1915 if (sk->send_head == NULL)
1916 {
1917 sk->send_tail = skb;
1918 sk->send_head = skb;
1919 }
1920 else
1921 {
1922 sk->send_tail->link3 = skb;
1923 sk->send_tail = skb;
1924 }
1925
1926
1927
1928 restore_flags(flags);
1929 }
1930 else
1931
1932 skb->sk = sk;
1933
1934
1935
1936
1937
1938 ip_statistics.IpOutRequests++;
1939 #ifdef CONFIG_IP_ACCT
1940 ip_fw_chk(iph,dev,ip_acct_chain,IP_FW_F_ACCEPT,1);
1941 #endif
1942
1943 #ifdef CONFIG_IP_MULTICAST
1944
1945
1946
1947
1948
1949 if (MULTICAST(iph->daddr) && !(dev->flags&IFF_LOOPBACK))
1950 {
1951 if(sk==NULL || sk->ip_mc_loop)
1952 {
1953 if(iph->daddr==IGMP_ALL_HOSTS || (dev->flags&IFF_ALLMULTI))
1954 {
1955 ip_loopback(dev,skb);
1956 }
1957 else
1958 {
1959 struct ip_mc_list *imc=dev->ip_mc_list;
1960 while(imc!=NULL)
1961 {
1962 if(imc->multiaddr==iph->daddr)
1963 {
1964 ip_loopback(dev,skb);
1965 break;
1966 }
1967 imc=imc->next;
1968 }
1969 }
1970 }
1971
1972
1973 if(skb->ip_hdr->ttl==0)
1974 {
1975 kfree_skb(skb, FREE_READ);
1976 return;
1977 }
1978 }
1979 #endif
1980 if((dev->flags&IFF_BROADCAST) && (iph->daddr==dev->pa_brdaddr||iph->daddr==0xFFFFFFFF) && !(dev->flags&IFF_LOOPBACK))
1981 ip_loopback(dev,skb);
1982
1983 if (dev->flags & IFF_UP)
1984 {
1985
1986
1987
1988
1989
1990 if (sk != NULL)
1991 {
1992 dev_queue_xmit(skb, dev, sk->priority);
1993 }
1994 else
1995 {
1996 dev_queue_xmit(skb, dev, SOPRI_NORMAL);
1997 }
1998 }
1999 else
2000 {
2001 if(sk)
2002 sk->err = ENETDOWN;
2003 ip_statistics.IpOutDiscards++;
2004 if (free)
2005 kfree_skb(skb, FREE_WRITE);
2006 }
2007 }
2008
2009
2010
2011 #ifdef CONFIG_IP_MULTICAST
2012
2013
2014
2015
2016
2017
2018 int ip_mc_procinfo(char *buffer, char **start, off_t offset, int length, int dummy)
2019 {
2020 off_t pos=0, begin=0;
2021 struct ip_mc_list *im;
2022 unsigned long flags;
2023 int len=0;
2024 struct device *dev;
2025
2026 len=sprintf(buffer,"Device : Count\tGroup Users Timer\n");
2027 save_flags(flags);
2028 cli();
2029
2030 for(dev = dev_base; dev; dev = dev->next)
2031 {
2032 if((dev->flags&IFF_UP)&&(dev->flags&IFF_MULTICAST))
2033 {
2034 len+=sprintf(buffer+len,"%-10s: %5d\n",
2035 dev->name, dev->mc_count);
2036 for(im = dev->ip_mc_list; im; im = im->next)
2037 {
2038 len+=sprintf(buffer+len,
2039 "\t\t\t%08lX %5d %d:%08lX\n",
2040 im->multiaddr, im->users,
2041 im->tm_running, im->timer.expires-jiffies);
2042 pos=begin+len;
2043 if(pos<offset)
2044 {
2045 len=0;
2046 begin=pos;
2047 }
2048 if(pos>offset+length)
2049 break;
2050 }
2051 }
2052 }
2053 restore_flags(flags);
2054 *start=buffer+(offset-begin);
2055 len-=(offset-begin);
2056 if(len>length)
2057 len=length;
2058 return len;
2059 }
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071 static struct device *ip_mc_find_devfor(unsigned long addr)
2072 {
2073 struct device *dev;
2074 for(dev = dev_base; dev; dev = dev->next)
2075 {
2076 if((dev->flags&IFF_UP)&&(dev->flags&IFF_MULTICAST)&&
2077 (dev->pa_addr==addr))
2078 return dev;
2079 }
2080
2081 return NULL;
2082 }
2083
2084 #endif
2085
2086 int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen)
2087 {
2088 int val,err;
2089 unsigned char ucval;
2090 #if defined(CONFIG_IP_FIREWALL) || defined(CONFIG_IP_ACCT)
2091 struct ip_fw tmp_fw;
2092 #endif
2093 if (optval == NULL)
2094 {
2095 val=0;
2096 ucval=0;
2097 }
2098 else
2099 {
2100 err=verify_area(VERIFY_READ, optval, sizeof(int));
2101 if(err)
2102 return err;
2103 val = get_user((int *) optval);
2104 ucval=get_user((unsigned char *) optval);
2105 }
2106
2107 if(level!=SOL_IP)
2108 return -EOPNOTSUPP;
2109 #ifdef CONFIG_IP_MROUTE
2110 if(optname>=MRT_BASE && optname <=MRT_BASE+10)
2111 {
2112 return ip_mroute_setsockopt(sk,optname,optval,optlen);
2113 }
2114 #endif
2115
2116 switch(optname)
2117 {
2118 case IP_TOS:
2119 if(val<0||val>255)
2120 return -EINVAL;
2121 sk->ip_tos=val;
2122 if(val==IPTOS_LOWDELAY)
2123 sk->priority=SOPRI_INTERACTIVE;
2124 if(val==IPTOS_THROUGHPUT)
2125 sk->priority=SOPRI_BACKGROUND;
2126 return 0;
2127 case IP_TTL:
2128 if(val<1||val>255)
2129 return -EINVAL;
2130 sk->ip_ttl=val;
2131 return 0;
2132 case IP_HDRINCL:
2133 if(sk->type!=SOCK_RAW)
2134 return -ENOPROTOOPT;
2135 sk->ip_hdrincl=val?1:0;
2136 return 0;
2137 #ifdef CONFIG_IP_MULTICAST
2138 case IP_MULTICAST_TTL:
2139 {
2140 sk->ip_mc_ttl=(int)ucval;
2141 return 0;
2142 }
2143 case IP_MULTICAST_LOOP:
2144 {
2145 if(ucval!=0 && ucval!=1)
2146 return -EINVAL;
2147 sk->ip_mc_loop=(int)ucval;
2148 return 0;
2149 }
2150 case IP_MULTICAST_IF:
2151 {
2152 struct in_addr addr;
2153 struct device *dev=NULL;
2154
2155
2156
2157
2158
2159 err=verify_area(VERIFY_READ, optval, sizeof(addr));
2160 if(err)
2161 return err;
2162
2163 memcpy_fromfs(&addr,optval,sizeof(addr));
2164
2165
2166
2167
2168
2169
2170 if(addr.s_addr==INADDR_ANY)
2171 {
2172 sk->ip_mc_name[0]=0;
2173 return 0;
2174 }
2175
2176
2177
2178
2179
2180 dev=ip_mc_find_devfor(addr.s_addr);
2181
2182
2183
2184
2185
2186 if(dev)
2187 {
2188 strcpy(sk->ip_mc_name,dev->name);
2189 return 0;
2190 }
2191 return -EADDRNOTAVAIL;
2192 }
2193
2194 case IP_ADD_MEMBERSHIP:
2195 {
2196
2197
2198
2199
2200 struct ip_mreq mreq;
2201 unsigned long route_src;
2202 struct rtable *rt;
2203 struct device *dev=NULL;
2204
2205
2206
2207
2208
2209 err=verify_area(VERIFY_READ, optval, sizeof(mreq));
2210 if(err)
2211 return err;
2212
2213 memcpy_fromfs(&mreq,optval,sizeof(mreq));
2214
2215
2216
2217
2218
2219 if(mreq.imr_interface.s_addr==INADDR_ANY)
2220 {
2221
2222
2223
2224 if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,NULL, &route_src))!=NULL)
2225 {
2226 dev=rt->rt_dev;
2227 rt->rt_use--;
2228 }
2229 }
2230 else
2231 {
2232
2233
2234
2235
2236 dev=ip_mc_find_devfor(mreq.imr_interface.s_addr);
2237 }
2238
2239
2240
2241
2242
2243 if(!dev)
2244 return -ENODEV;
2245
2246
2247
2248
2249
2250 return ip_mc_join_group(sk,dev,mreq.imr_multiaddr.s_addr);
2251 }
2252
2253 case IP_DROP_MEMBERSHIP:
2254 {
2255 struct ip_mreq mreq;
2256 struct rtable *rt;
2257 unsigned long route_src;
2258 struct device *dev=NULL;
2259
2260
2261
2262
2263
2264 err=verify_area(VERIFY_READ, optval, sizeof(mreq));
2265 if(err)
2266 return err;
2267
2268 memcpy_fromfs(&mreq,optval,sizeof(mreq));
2269
2270
2271
2272
2273
2274 if(mreq.imr_interface.s_addr==INADDR_ANY)
2275 {
2276 if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,NULL, &route_src))!=NULL)
2277 {
2278 dev=rt->rt_dev;
2279 rt->rt_use--;
2280 }
2281 }
2282 else
2283 {
2284
2285 dev=ip_mc_find_devfor(mreq.imr_interface.s_addr);
2286 }
2287
2288
2289
2290
2291
2292 if(!dev)
2293 return -ENODEV;
2294
2295
2296
2297
2298
2299 return ip_mc_leave_group(sk,dev,mreq.imr_multiaddr.s_addr);
2300 }
2301 #endif
2302 #ifdef CONFIG_IP_FIREWALL
2303 case IP_FW_ADD_BLK:
2304 case IP_FW_DEL_BLK:
2305 case IP_FW_ADD_FWD:
2306 case IP_FW_DEL_FWD:
2307 case IP_FW_CHK_BLK:
2308 case IP_FW_CHK_FWD:
2309 case IP_FW_FLUSH_BLK:
2310 case IP_FW_FLUSH_FWD:
2311 case IP_FW_ZERO_BLK:
2312 case IP_FW_ZERO_FWD:
2313 case IP_FW_POLICY_BLK:
2314 case IP_FW_POLICY_FWD:
2315 if(!suser())
2316 return -EPERM;
2317 if(optlen>sizeof(tmp_fw) || optlen<1)
2318 return -EINVAL;
2319 err=verify_area(VERIFY_READ,optval,optlen);
2320 if(err)
2321 return err;
2322 memcpy_fromfs(&tmp_fw,optval,optlen);
2323 err=ip_fw_ctl(optname, &tmp_fw,optlen);
2324 return -err;
2325
2326 #endif
2327 #ifdef CONFIG_IP_ACCT
2328 case IP_ACCT_DEL:
2329 case IP_ACCT_ADD:
2330 case IP_ACCT_FLUSH:
2331 case IP_ACCT_ZERO:
2332 if(!suser())
2333 return -EPERM;
2334 if(optlen>sizeof(tmp_fw) || optlen<1)
2335 return -EINVAL;
2336 err=verify_area(VERIFY_READ,optval,optlen);
2337 if(err)
2338 return err;
2339 memcpy_fromfs(&tmp_fw, optval,optlen);
2340 err=ip_acct_ctl(optname, &tmp_fw,optlen);
2341 return -err;
2342 #endif
2343
2344 default:
2345 return(-ENOPROTOOPT);
2346 }
2347 }
2348
2349
2350
2351
2352
2353
2354 int ip_getsockopt(struct sock *sk, int level, int optname, char *optval, int *optlen)
2355 {
2356 int val,err;
2357 #ifdef CONFIG_IP_MULTICAST
2358 int len;
2359 #endif
2360
2361 if(level!=SOL_IP)
2362 return -EOPNOTSUPP;
2363
2364 #ifdef CONFIG_IP_MROUTE
2365 if(optname>=MRT_BASE && optname <=MRT_BASE+10)
2366 {
2367 return ip_mroute_getsockopt(sk,optname,optval,optlen);
2368 }
2369 #endif
2370
2371 switch(optname)
2372 {
2373 case IP_TOS:
2374 val=sk->ip_tos;
2375 break;
2376 case IP_TTL:
2377 val=sk->ip_ttl;
2378 break;
2379 case IP_HDRINCL:
2380 val=sk->ip_hdrincl;
2381 break;
2382 #ifdef CONFIG_IP_MULTICAST
2383 case IP_MULTICAST_TTL:
2384 val=sk->ip_mc_ttl;
2385 break;
2386 case IP_MULTICAST_LOOP:
2387 val=sk->ip_mc_loop;
2388 break;
2389 case IP_MULTICAST_IF:
2390 err=verify_area(VERIFY_WRITE, optlen, sizeof(int));
2391 if(err)
2392 return err;
2393 len=strlen(sk->ip_mc_name);
2394 err=verify_area(VERIFY_WRITE, optval, len);
2395 if(err)
2396 return err;
2397 put_user(len,(int *) optlen);
2398 memcpy_tofs((void *)optval,sk->ip_mc_name, len);
2399 return 0;
2400 #endif
2401 default:
2402 return(-ENOPROTOOPT);
2403 }
2404 err=verify_area(VERIFY_WRITE, optlen, sizeof(int));
2405 if(err)
2406 return err;
2407 put_user(sizeof(int),(int *) optlen);
2408
2409 err=verify_area(VERIFY_WRITE, optval, sizeof(int));
2410 if(err)
2411 return err;
2412 put_user(val,(int *) optval);
2413
2414 return(0);
2415 }
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437 int ip_build_xmit(struct sock *sk,
2438 void getfrag (const void *,
2439 int,
2440 char *,
2441 unsigned int,
2442 unsigned int),
2443 const void *frag,
2444 unsigned short int length,
2445 int daddr,
2446 int flags,
2447 int type)
2448 {
2449 struct rtable *rt;
2450 unsigned int fraglen, maxfraglen, fragheaderlen;
2451 int offset, mf;
2452 unsigned long saddr;
2453 unsigned short id;
2454 struct iphdr *iph;
2455 int local=0;
2456 struct device *dev;
2457 int nfrags=0;
2458
2459 ip_statistics.IpOutRequests++;
2460
2461
2462 #ifdef CONFIG_IP_MULTICAST
2463 if(sk && MULTICAST(daddr) && *sk->ip_mc_name)
2464 {
2465 dev=dev_get(sk->ip_mc_name);
2466 if(!dev)
2467 return -ENODEV;
2468 rt=NULL;
2469 if (sk->saddr && (!LOOPBACK(sk->saddr) || LOOPBACK(daddr)))
2470 saddr = sk->saddr;
2471 else
2472 saddr = dev->pa_addr;
2473 }
2474 else
2475 {
2476 #endif
2477
2478
2479
2480
2481 if(sk->localroute || flags&MSG_DONTROUTE)
2482 local=1;
2483
2484 rt = sk->ip_route_cache;
2485
2486
2487
2488
2489
2490
2491 saddr=sk->ip_route_saddr;
2492 if(!rt || sk->ip_route_stamp != rt_stamp || daddr!=sk->ip_route_daddr || sk->ip_route_local!=local || sk->saddr!=sk->ip_route_saddr)
2493 {
2494 if(local)
2495 rt = ip_rt_local(daddr, NULL, &saddr);
2496 else
2497 rt = ip_rt_route(daddr, NULL, &saddr);
2498 sk->ip_route_local=local;
2499 sk->ip_route_daddr=daddr;
2500 sk->ip_route_saddr=saddr;
2501 sk->ip_route_stamp=rt_stamp;
2502 sk->ip_route_cache=rt;
2503 sk->ip_hcache_ver=NULL;
2504 sk->ip_hcache_state= 0;
2505 }
2506 else if(rt)
2507 {
2508
2509
2510
2511
2512
2513
2514 if(rt->rt_dev->header_cache && sk->ip_hcache_state!= -1)
2515 {
2516 if(sk->ip_hcache_ver==NULL || sk->ip_hcache_stamp!=*sk->ip_hcache_ver)
2517 rt->rt_dev->header_cache(rt->rt_dev,sk,saddr,daddr);
2518 else
2519
2520 sk->ip_hcache_state= -1;
2521 }
2522 }
2523
2524 if (rt == NULL)
2525 {
2526 ip_statistics.IpOutNoRoutes++;
2527 return(-ENETUNREACH);
2528 }
2529
2530 if (sk->saddr && (!LOOPBACK(sk->saddr) || LOOPBACK(daddr)))
2531 saddr = sk->saddr;
2532
2533 dev=rt->rt_dev;
2534 #ifdef CONFIG_IP_MULTICAST
2535 }
2536 #endif
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547 if(length+20 <= dev->mtu && !MULTICAST(daddr) && daddr!=0xFFFFFFFF && daddr!=dev->pa_brdaddr)
2548 {
2549 int error;
2550 struct sk_buff *skb=sock_alloc_send_skb(sk, length+20+15+dev->hard_header_len,0, 0,&error);
2551 if(skb==NULL)
2552 {
2553 ip_statistics.IpOutDiscards++;
2554 return error;
2555 }
2556 skb->dev=dev;
2557 skb->free=1;
2558 skb->when=jiffies;
2559 skb->sk=sk;
2560 skb->arp=0;
2561 skb->saddr=saddr;
2562 length+=20;
2563 skb->raddr=(rt&&rt->rt_gateway)?rt->rt_gateway:daddr;
2564 skb_reserve(skb,(dev->hard_header_len+15)&~15);
2565 if(sk->ip_hcache_state>0)
2566 {
2567 memcpy(skb_push(skb,dev->hard_header_len),sk->ip_hcache_data,dev->hard_header_len);
2568 skb->arp=1;
2569 }
2570 else if(dev->hard_header)
2571 {
2572 if(dev->hard_header(skb,dev,ETH_P_IP,NULL,NULL,0)>0)
2573 skb->arp=1;
2574 }
2575 else
2576 skb->arp=1;
2577 skb->ip_hdr=iph=(struct iphdr *)skb_put(skb,length);
2578 dev_lock_list();
2579 if(!sk->ip_hdrincl)
2580 {
2581 iph->version=4;
2582 iph->ihl=5;
2583 iph->tos=sk->ip_tos;
2584 iph->tot_len = htons(length);
2585 iph->id=htons(ip_id_count++);
2586 iph->frag_off = 0;
2587 iph->ttl=sk->ip_ttl;
2588 iph->protocol=type;
2589 iph->saddr=saddr;
2590 iph->daddr=daddr;
2591 iph->check=0;
2592 iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
2593 getfrag(frag,saddr,(void *)(iph+1),0, length-20);
2594 }
2595 else
2596 getfrag(frag,saddr,(void *)iph,0,length);
2597 dev_unlock_list();
2598 #ifdef CONFIG_IP_ACCT
2599 ip_fw_chk((void *)skb->data,dev,ip_acct_chain, IP_FW_F_ACCEPT,1);
2600 #endif
2601 if(dev->flags&IFF_UP)
2602 dev_queue_xmit(skb,dev,sk->priority);
2603 else
2604 {
2605 ip_statistics.IpOutDiscards++;
2606 kfree_skb(skb, FREE_WRITE);
2607 }
2608 return 0;
2609 }
2610
2611
2612 fragheaderlen = dev->hard_header_len;
2613 if(!sk->ip_hdrincl)
2614 fragheaderlen += 20;
2615
2616
2617
2618
2619
2620
2621 maxfraglen = ((dev->mtu-20) & ~7) + fragheaderlen;
2622
2623
2624
2625
2626
2627 offset = length - (length % (maxfraglen - fragheaderlen));
2628
2629
2630
2631
2632
2633 fraglen = length - offset + fragheaderlen;
2634
2635 if(length-offset==0)
2636 {
2637 fraglen = maxfraglen;
2638 offset -= maxfraglen-fragheaderlen;
2639 }
2640
2641
2642
2643
2644
2645
2646 mf = 0;
2647
2648
2649
2650
2651
2652 if (sk->ip_hdrincl && offset > 0)
2653 return(-EMSGSIZE);
2654
2655
2656
2657
2658
2659 dev_lock_list();
2660
2661
2662
2663
2664
2665 id = htons(ip_id_count++);
2666
2667
2668
2669
2670
2671 do
2672 {
2673 struct sk_buff * skb;
2674 int error;
2675 char *data;
2676
2677
2678
2679
2680
2681 skb = sock_alloc_send_skb(sk, fraglen+15, 0, 0, &error);
2682 if (skb == NULL)
2683 {
2684 ip_statistics.IpOutDiscards++;
2685 if(nfrags>1)
2686 ip_statistics.IpFragCreates++;
2687 dev_unlock_list();
2688 return(error);
2689 }
2690
2691
2692
2693
2694
2695 skb->next = skb->prev = NULL;
2696 skb->dev = dev;
2697 skb->when = jiffies;
2698 skb->free = 1;
2699 skb->sk = sk;
2700 skb->arp = 0;
2701 skb->saddr = saddr;
2702 skb->raddr = (rt&&rt->rt_gateway) ? rt->rt_gateway : daddr;
2703 skb_reserve(skb,(dev->hard_header_len+15)&~15);
2704 data = skb_put(skb, fraglen-dev->hard_header_len);
2705
2706
2707
2708
2709
2710
2711
2712
2713 if(sk->ip_hcache_state>0)
2714 {
2715 memcpy(skb_push(skb,dev->hard_header_len),sk->ip_hcache_data, dev->hard_header_len);
2716 skb->arp=1;
2717 }
2718 else if (dev->hard_header)
2719 {
2720 if(dev->hard_header(skb, dev, ETH_P_IP,
2721 NULL, NULL, 0)>0)
2722 skb->arp=1;
2723 }
2724
2725
2726
2727
2728
2729 skb->ip_hdr = iph = (struct iphdr *)data;
2730
2731
2732
2733
2734
2735 if(!sk->ip_hdrincl)
2736 {
2737
2738 iph->version = 4;
2739 iph->ihl = 5;
2740 iph->tos = sk->ip_tos;
2741 iph->tot_len = htons(fraglen - fragheaderlen + iph->ihl*4);
2742 iph->id = id;
2743 iph->frag_off = htons(offset>>3);
2744 iph->frag_off |= mf;
2745 #ifdef CONFIG_IP_MULTICAST
2746 if (MULTICAST(daddr))
2747 iph->ttl = sk->ip_mc_ttl;
2748 else
2749 #endif
2750 iph->ttl = sk->ip_ttl;
2751 iph->protocol = type;
2752 iph->check = 0;
2753 iph->saddr = saddr;
2754 iph->daddr = daddr;
2755 iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
2756 data += iph->ihl*4;
2757
2758
2759
2760
2761
2762 mf = htons(IP_MF);
2763 }
2764
2765
2766
2767
2768
2769 getfrag(frag, saddr, data, offset, fraglen-fragheaderlen);
2770
2771
2772
2773
2774
2775 #ifdef CONFIG_IP_ACCT
2776 if(!offset)
2777 ip_fw_chk(iph, dev, ip_acct_chain, IP_FW_F_ACCEPT, 1);
2778 #endif
2779 offset -= (maxfraglen-fragheaderlen);
2780 fraglen = maxfraglen;
2781
2782 #ifdef CONFIG_IP_MULTICAST
2783
2784
2785
2786
2787
2788 if (MULTICAST(daddr) && !(dev->flags&IFF_LOOPBACK))
2789 {
2790
2791
2792
2793
2794
2795
2796
2797 if(sk==NULL || sk->ip_mc_loop)
2798 {
2799 if(skb->daddr==IGMP_ALL_HOSTS || (dev->flags&IFF_ALLMULTI))
2800 ip_loopback(rt?rt->rt_dev:dev,skb);
2801 else
2802 {
2803 struct ip_mc_list *imc=rt?rt->rt_dev->ip_mc_list:dev->ip_mc_list;
2804 while(imc!=NULL)
2805 {
2806 if(imc->multiaddr==daddr)
2807 {
2808 ip_loopback(rt?rt->rt_dev:dev,skb);
2809 break;
2810 }
2811 imc=imc->next;
2812 }
2813 }
2814 }
2815
2816
2817
2818
2819
2820
2821 if(skb->ip_hdr->ttl==0)
2822 kfree_skb(skb, FREE_READ);
2823 }
2824 #endif
2825
2826 nfrags++;
2827
2828
2829
2830
2831
2832 if((dev->flags&IFF_BROADCAST) && (daddr==0xFFFFFFFF || daddr==dev->pa_brdaddr) && !(dev->flags&IFF_LOOPBACK))
2833 ip_loopback(dev,skb);
2834
2835
2836
2837
2838
2839 if (dev->flags & IFF_UP)
2840 {
2841 dev_queue_xmit(skb, dev, sk->priority);
2842 }
2843 else
2844 {
2845
2846
2847
2848
2849 ip_statistics.IpOutDiscards++;
2850 if(nfrags>1)
2851 ip_statistics.IpFragCreates+=nfrags;
2852 kfree_skb(skb, FREE_WRITE);
2853 dev_unlock_list();
2854
2855
2856
2857 if(sk!=NULL)
2858 sk->err=ENETDOWN;
2859 return(0);
2860 }
2861 }
2862 while (offset >= 0);
2863 if(nfrags>1)
2864 ip_statistics.IpFragCreates+=nfrags;
2865 dev_unlock_list();
2866 return(0);
2867 }
2868
2869
2870
2871
2872
2873
2874 static struct packet_type ip_packet_type =
2875 {
2876 0,
2877 NULL,
2878 ip_rcv,
2879 NULL,
2880 NULL,
2881 };
2882
2883
2884
2885
2886
2887 static int ip_rt_event(unsigned long event, void *ptr)
2888 {
2889 if(event==NETDEV_DOWN)
2890 ip_rt_flush(ptr);
2891 return NOTIFY_DONE;
2892 }
2893
2894 struct notifier_block ip_rt_notifier={
2895 ip_rt_event,
2896 NULL,
2897 0
2898 };
2899
2900
2901
2902
2903
2904 void ip_init(void)
2905 {
2906 ip_packet_type.type=htons(ETH_P_IP);
2907 dev_add_pack(&ip_packet_type);
2908
2909
2910 register_netdevice_notifier(&ip_rt_notifier);
2911
2912
2913
2914
2915
2916
2917 #ifdef CONFIG_IP_MULTICAST
2918 proc_net_register(&(struct proc_dir_entry) {
2919 PROC_NET_IGMP, 4, "igmp",
2920 S_IFREG | S_IRUGO, 1, 0, 0,
2921 0, &proc_net_inode_operations,
2922 ip_mc_procinfo
2923 });
2924 #endif
2925 }
2926