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#include <asm/uaccess.h>
71#include <asm/system.h>
72#include <asm/bitops.h>
73#include <linux/config.h>
74#include <linux/types.h>
75#include <linux/kernel.h>
76#include <linux/sched.h>
77#include <linux/string.h>
78#include <linux/mm.h>
79#include <linux/socket.h>
80#include <linux/sockios.h>
81#include <linux/errno.h>
82#include <linux/interrupt.h>
83#include <linux/if_ether.h>
84#include <linux/netdevice.h>
85#include <linux/etherdevice.h>
86#include <linux/notifier.h>
87#include <linux/skbuff.h>
88#include <linux/brlock.h>
89#include <net/sock.h>
90#include <linux/rtnetlink.h>
91#include <linux/proc_fs.h>
92#include <linux/stat.h>
93#include <linux/if_bridge.h>
94#include <linux/divert.h>
95#include <net/dst.h>
96#include <net/pkt_sched.h>
97#include <net/profile.h>
98#include <net/checksum.h>
99#include <linux/highmem.h>
100#include <linux/init.h>
101#include <linux/kmod.h>
102#include <linux/module.h>
103#if defined(CONFIG_NET_RADIO) || defined(CONFIG_NET_PCMCIA_RADIO)
104#include <linux/wireless.h>
105#include <net/iw_handler.h>
106#endif
107#ifdef CONFIG_PLIP
108extern int plip_init(void);
109#endif
110
111
112
113
114
115
116
117#undef RAND_LIE
118
119
120
121
122#undef OFFLINE_SAMPLE
123
124NET_PROFILE_DEFINE(dev_queue_xmit)
125NET_PROFILE_DEFINE(softnet_process)
126
127const char *if_port_text[] = {
128 "unknown",
129 "BNC",
130 "10baseT",
131 "AUI",
132 "100baseT",
133 "100baseTX",
134 "100baseFX"
135};
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165static struct packet_type *ptype_base[16];
166static struct packet_type *ptype_all = NULL;
167
168#ifdef OFFLINE_SAMPLE
169static void sample_queue(unsigned long dummy);
170static struct timer_list samp_timer = { function: sample_queue };
171#endif
172
173#ifdef CONFIG_HOTPLUG
174static int net_run_sbin_hotplug(struct net_device *dev, char *action);
175#else
176#define net_run_sbin_hotplug(dev, action) ({ 0; })
177#endif
178
179
180
181
182
183static struct notifier_block *netdev_chain=NULL;
184
185
186
187
188
189struct softnet_data softnet_data[NR_CPUS] __cacheline_aligned;
190
191#ifdef CONFIG_NET_FASTROUTE
192int netdev_fastroute;
193int netdev_fastroute_obstacles;
194#endif
195
196
197
198
199
200
201
202
203
204
205
206
207int netdev_nit=0;
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234void dev_add_pack(struct packet_type *pt)
235{
236 int hash;
237
238 br_write_lock_bh(BR_NETPROTO_LOCK);
239
240#ifdef CONFIG_NET_FASTROUTE
241
242 if ((pt->data) && ((int)(pt->data)!=1)) {
243 netdev_fastroute_obstacles++;
244 dev_clear_fastroute(pt->dev);
245 }
246#endif
247 if (pt->type == htons(ETH_P_ALL)) {
248 netdev_nit++;
249 pt->next=ptype_all;
250 ptype_all=pt;
251 } else {
252 hash=ntohs(pt->type)&15;
253 pt->next = ptype_base[hash];
254 ptype_base[hash] = pt;
255 }
256 br_write_unlock_bh(BR_NETPROTO_LOCK);
257}
258
259
260
261
262
263
264
265
266
267
268
269
270void dev_remove_pack(struct packet_type *pt)
271{
272 struct packet_type **pt1;
273
274 br_write_lock_bh(BR_NETPROTO_LOCK);
275
276 if (pt->type == htons(ETH_P_ALL)) {
277 netdev_nit--;
278 pt1=&ptype_all;
279 } else {
280 pt1=&ptype_base[ntohs(pt->type)&15];
281 }
282
283 for (; (*pt1) != NULL; pt1 = &((*pt1)->next)) {
284 if (pt == (*pt1)) {
285 *pt1 = pt->next;
286#ifdef CONFIG_NET_FASTROUTE
287 if (pt->data)
288 netdev_fastroute_obstacles--;
289#endif
290 br_write_unlock_bh(BR_NETPROTO_LOCK);
291 return;
292 }
293 }
294 br_write_unlock_bh(BR_NETPROTO_LOCK);
295 printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt);
296}
297
298
299
300
301
302
303
304
305static struct netdev_boot_setup dev_boot_setup[NETDEV_BOOT_SETUP_MAX];
306
307
308
309
310
311
312
313
314
315
316int netdev_boot_setup_add(char *name, struct ifmap *map)
317{
318 struct netdev_boot_setup *s;
319 int i;
320
321 s = dev_boot_setup;
322 for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) {
323 if (s[i].name[0] == '\0' || s[i].name[0] == ' ') {
324 memset(s[i].name, 0, sizeof(s[i].name));
325 strcpy(s[i].name, name);
326 memcpy(&s[i].map, map, sizeof(s[i].map));
327 break;
328 }
329 }
330
331 if (i >= NETDEV_BOOT_SETUP_MAX)
332 return 0;
333
334 return 1;
335}
336
337
338
339
340
341
342
343
344
345
346int netdev_boot_setup_check(struct net_device *dev)
347{
348 struct netdev_boot_setup *s;
349 int i;
350
351 s = dev_boot_setup;
352 for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) {
353 if (s[i].name[0] != '\0' && s[i].name[0] != ' ' &&
354 !strncmp(dev->name, s[i].name, strlen(s[i].name))) {
355 dev->irq = s[i].map.irq;
356 dev->base_addr = s[i].map.base_addr;
357 dev->mem_start = s[i].map.mem_start;
358 dev->mem_end = s[i].map.mem_end;
359 return 1;
360 }
361 }
362 return 0;
363}
364
365
366
367
368int __init netdev_boot_setup(char *str)
369{
370 int ints[5];
371 struct ifmap map;
372
373 str = get_options(str, ARRAY_SIZE(ints), ints);
374 if (!str || !*str)
375 return 0;
376
377
378 memset(&map, 0, sizeof(map));
379 if (ints[0] > 0)
380 map.irq = ints[1];
381 if (ints[0] > 1)
382 map.base_addr = ints[2];
383 if (ints[0] > 2)
384 map.mem_start = ints[3];
385 if (ints[0] > 3)
386 map.mem_end = ints[4];
387
388
389 return netdev_boot_setup_add(str, &map);
390}
391
392__setup("netdev=", netdev_boot_setup);
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412struct net_device *__dev_get_by_name(const char *name)
413{
414 struct net_device *dev;
415
416 for (dev = dev_base; dev != NULL; dev = dev->next) {
417 if (strncmp(dev->name, name, IFNAMSIZ) == 0)
418 return dev;
419 }
420 return NULL;
421}
422
423
424
425
426
427
428
429
430
431
432
433
434struct net_device *dev_get_by_name(const char *name)
435{
436 struct net_device *dev;
437
438 read_lock(&dev_base_lock);
439 dev = __dev_get_by_name(name);
440 if (dev)
441 dev_hold(dev);
442 read_unlock(&dev_base_lock);
443 return dev;
444}
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466int dev_get(const char *name)
467{
468 struct net_device *dev;
469
470 read_lock(&dev_base_lock);
471 dev = __dev_get_by_name(name);
472 read_unlock(&dev_base_lock);
473 return dev != NULL;
474}
475
476
477
478
479
480
481
482
483
484
485
486
487struct net_device * __dev_get_by_index(int ifindex)
488{
489 struct net_device *dev;
490
491 for (dev = dev_base; dev != NULL; dev = dev->next) {
492 if (dev->ifindex == ifindex)
493 return dev;
494 }
495 return NULL;
496}
497
498
499
500
501
502
503
504
505
506
507
508
509struct net_device * dev_get_by_index(int ifindex)
510{
511 struct net_device *dev;
512
513 read_lock(&dev_base_lock);
514 dev = __dev_get_by_index(ifindex);
515 if (dev)
516 dev_hold(dev);
517 read_unlock(&dev_base_lock);
518 return dev;
519}
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535struct net_device *dev_getbyhwaddr(unsigned short type, char *ha)
536{
537 struct net_device *dev;
538
539 ASSERT_RTNL();
540
541 for (dev = dev_base; dev != NULL; dev = dev->next) {
542 if (dev->type == type &&
543 memcmp(dev->dev_addr, ha, dev->addr_len) == 0)
544 return dev;
545 }
546 return NULL;
547}
548
549
550
551
552
553
554
555
556
557
558
559
560struct net_device * dev_get_by_flags(unsigned short if_flags, unsigned short mask)
561{
562 struct net_device *dev;
563
564 read_lock(&dev_base_lock);
565 dev = __dev_get_by_flags(if_flags, mask);
566 if (dev)
567 dev_hold(dev);
568 read_unlock(&dev_base_lock);
569 return dev;
570}
571
572
573
574
575
576
577
578
579
580
581
582struct net_device *__dev_get_by_flags(unsigned short if_flags, unsigned short mask)
583{
584 struct net_device *dev;
585
586 for (dev = dev_base; dev != NULL; dev = dev->next) {
587 if (((dev->flags ^ if_flags) & mask) == 0)
588 return dev;
589 }
590 return NULL;
591}
592
593
594
595
596
597
598
599
600
601
602
603
604
605int dev_alloc_name(struct net_device *dev, const char *name)
606{
607 int i;
608 char buf[32];
609 char *p;
610
611
612
613
614
615
616 p = strchr(name, '%');
617 if (p && (p[1] != 'd' || strchr(p+2, '%')))
618 return -EINVAL;
619
620
621
622
623 for (i = 0; i < 100; i++) {
624 snprintf(buf,sizeof(buf),name,i);
625 if (__dev_get_by_name(buf) == NULL) {
626 strcpy(dev->name, buf);
627 return i;
628 }
629 }
630 return -ENFILE;
631}
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649struct net_device *dev_alloc(const char *name, int *err)
650{
651 struct net_device *dev=kmalloc(sizeof(struct net_device), GFP_KERNEL);
652 if (dev == NULL) {
653 *err = -ENOBUFS;
654 return NULL;
655 }
656 memset(dev, 0, sizeof(struct net_device));
657 *err = dev_alloc_name(dev, name);
658 if (*err < 0) {
659 kfree(dev);
660 return NULL;
661 }
662 return dev;
663}
664
665
666
667
668
669
670
671
672
673
674void netdev_state_change(struct net_device *dev)
675{
676 if (dev->flags&IFF_UP) {
677 notifier_call_chain(&netdev_chain, NETDEV_CHANGE, dev);
678 rtmsg_ifinfo(RTM_NEWLINK, dev, 0);
679 }
680}
681
682
683#ifdef CONFIG_KMOD
684
685
686
687
688
689
690
691
692
693
694void dev_load(const char *name)
695{
696 if (!dev_get(name) && capable(CAP_SYS_MODULE))
697 request_module(name);
698}
699
700#else
701
702extern inline void dev_load(const char *unused){;}
703
704#endif
705
706static int default_rebuild_header(struct sk_buff *skb)
707{
708 printk(KERN_DEBUG "%s: default_rebuild_header called -- BUG!\n", skb->dev ? skb->dev->name : "NULL!!!");
709 kfree_skb(skb);
710 return 1;
711}
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726int dev_open(struct net_device *dev)
727{
728 int ret = 0;
729
730
731
732
733
734 if (dev->flags&IFF_UP)
735 return 0;
736
737
738
739
740 if (!netif_device_present(dev))
741 return -ENODEV;
742
743
744
745
746 if (try_inc_mod_count(dev->owner)) {
747 set_bit(__LINK_STATE_START, &dev->state);
748 if (dev->open) {
749 ret = dev->open(dev);
750 if (ret != 0) {
751 clear_bit(__LINK_STATE_START, &dev->state);
752 if (dev->owner)
753 __MOD_DEC_USE_COUNT(dev->owner);
754 }
755 }
756 } else {
757 ret = -ENODEV;
758 }
759
760
761
762
763
764 if (ret == 0)
765 {
766
767
768
769 dev->flags |= IFF_UP;
770
771
772
773
774 dev_mc_upload(dev);
775
776
777
778
779 dev_activate(dev);
780
781
782
783
784 notifier_call_chain(&netdev_chain, NETDEV_UP, dev);
785 }
786 return(ret);
787}
788
789#ifdef CONFIG_NET_FASTROUTE
790
791static void dev_do_clear_fastroute(struct net_device *dev)
792{
793 if (dev->accept_fastpath) {
794 int i;
795
796 for (i=0; i<=NETDEV_FASTROUTE_HMASK; i++) {
797 struct dst_entry *dst;
798
799 write_lock_irq(&dev->fastpath_lock);
800 dst = dev->fastpath[i];
801 dev->fastpath[i] = NULL;
802 write_unlock_irq(&dev->fastpath_lock);
803
804 dst_release(dst);
805 }
806 }
807}
808
809void dev_clear_fastroute(struct net_device *dev)
810{
811 if (dev) {
812 dev_do_clear_fastroute(dev);
813 } else {
814 read_lock(&dev_base_lock);
815 for (dev = dev_base; dev; dev = dev->next)
816 dev_do_clear_fastroute(dev);
817 read_unlock(&dev_base_lock);
818 }
819}
820#endif
821
822
823
824
825
826
827
828
829
830
831
832int dev_close(struct net_device *dev)
833{
834 if (!(dev->flags&IFF_UP))
835 return 0;
836
837
838
839
840
841 notifier_call_chain(&netdev_chain, NETDEV_GOING_DOWN, dev);
842
843 dev_deactivate(dev);
844
845 clear_bit(__LINK_STATE_START, &dev->state);
846
847
848
849
850
851
852
853 smp_mb__after_clear_bit();
854 while (test_bit(__LINK_STATE_RX_SCHED, &dev->state)) {
855
856 current->state = TASK_INTERRUPTIBLE;
857 schedule_timeout(1);
858 }
859
860
861
862
863
864
865
866
867
868 if (dev->stop)
869 dev->stop(dev);
870
871
872
873
874
875 dev->flags &= ~IFF_UP;
876#ifdef CONFIG_NET_FASTROUTE
877 dev_clear_fastroute(dev);
878#endif
879
880
881
882
883 notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev);
884
885
886
887
888 if (dev->owner)
889 __MOD_DEC_USE_COUNT(dev->owner);
890
891 return(0);
892}
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910int register_netdevice_notifier(struct notifier_block *nb)
911{
912 return notifier_chain_register(&netdev_chain, nb);
913}
914
915
916
917
918
919
920
921
922
923
924
925int unregister_netdevice_notifier(struct notifier_block *nb)
926{
927 return notifier_chain_unregister(&netdev_chain,nb);
928}
929
930
931
932
933
934
935void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
936{
937 struct packet_type *ptype;
938 do_gettimeofday(&skb->stamp);
939
940 br_read_lock(BR_NETPROTO_LOCK);
941 for (ptype = ptype_all; ptype!=NULL; ptype = ptype->next)
942 {
943
944
945
946 if ((ptype->dev == dev || !ptype->dev) &&
947 ((struct sock *)ptype->data != skb->sk))
948 {
949 struct sk_buff *skb2;
950 if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL)
951 break;
952
953
954
955
956
957 skb2->mac.raw = skb2->data;
958
959 if (skb2->nh.raw < skb2->data || skb2->nh.raw > skb2->tail) {
960 if (net_ratelimit())
961 printk(KERN_CRIT "protocol %04x is buggy, dev %s\n", skb2->protocol, dev->name);
962 skb2->nh.raw = skb2->data;
963 }
964
965 skb2->h.raw = skb2->nh.raw;
966 skb2->pkt_type = PACKET_OUTGOING;
967 ptype->func(skb2, skb->dev, ptype);
968 }
969 }
970 br_read_unlock(BR_NETPROTO_LOCK);
971}
972
973
974
975
976
977struct sk_buff * skb_checksum_help(struct sk_buff *skb)
978{
979 int offset;
980 unsigned int csum;
981
982 offset = skb->h.raw - skb->data;
983 if (offset > (int)skb->len)
984 BUG();
985 csum = skb_checksum(skb, offset, skb->len-offset, 0);
986
987 offset = skb->tail - skb->h.raw;
988 if (offset <= 0)
989 BUG();
990 if (skb->csum+2 > offset)
991 BUG();
992
993 *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum);
994 skb->ip_summed = CHECKSUM_NONE;
995 return skb;
996}
997
998#ifdef CONFIG_HIGHMEM
999
1000
1001
1002
1003
1004static inline int
1005illegal_highdma(struct net_device *dev, struct sk_buff *skb)
1006{
1007 int i;
1008
1009 if (dev->features&NETIF_F_HIGHDMA)
1010 return 0;
1011
1012 for (i=0; i<skb_shinfo(skb)->nr_frags; i++)
1013 if (skb_shinfo(skb)->frags[i].page >= highmem_start_page)
1014 return 1;
1015
1016 return 0;
1017}
1018#else
1019#define illegal_highdma(dev, skb) (0)
1020#endif
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035int dev_queue_xmit(struct sk_buff *skb)
1036{
1037 struct net_device *dev = skb->dev;
1038 struct Qdisc *q;
1039
1040 if (skb_shinfo(skb)->frag_list &&
1041 !(dev->features&NETIF_F_FRAGLIST) &&
1042 skb_linearize(skb, GFP_ATOMIC) != 0) {
1043 kfree_skb(skb);
1044 return -ENOMEM;
1045 }
1046
1047
1048
1049
1050
1051 if (skb_shinfo(skb)->nr_frags &&
1052 (!(dev->features&NETIF_F_SG) || illegal_highdma(dev, skb)) &&
1053 skb_linearize(skb, GFP_ATOMIC) != 0) {
1054 kfree_skb(skb);
1055 return -ENOMEM;
1056 }
1057
1058
1059
1060
1061 if (skb->ip_summed == CHECKSUM_HW &&
1062 (!(dev->features&(NETIF_F_HW_CSUM|NETIF_F_NO_CSUM)) &&
1063 (!(dev->features&NETIF_F_IP_CSUM) ||
1064 skb->protocol != htons(ETH_P_IP)))) {
1065 if ((skb = skb_checksum_help(skb)) == NULL)
1066 return -ENOMEM;
1067 }
1068
1069
1070 spin_lock_bh(&dev->queue_lock);
1071 q = dev->qdisc;
1072 if (q->enqueue) {
1073 int ret = q->enqueue(skb, q);
1074
1075 qdisc_run(dev);
1076
1077 spin_unlock_bh(&dev->queue_lock);
1078 return ret == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : ret;
1079 }
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092 if (dev->flags&IFF_UP) {
1093 int cpu = smp_processor_id();
1094
1095 if (dev->xmit_lock_owner != cpu) {
1096 spin_unlock(&dev->queue_lock);
1097 spin_lock(&dev->xmit_lock);
1098 dev->xmit_lock_owner = cpu;
1099
1100 if (!netif_queue_stopped(dev)) {
1101 if (netdev_nit)
1102 dev_queue_xmit_nit(skb,dev);
1103
1104 if (dev->hard_start_xmit(skb, dev) == 0) {
1105 dev->xmit_lock_owner = -1;
1106 spin_unlock_bh(&dev->xmit_lock);
1107 return 0;
1108 }
1109 }
1110 dev->xmit_lock_owner = -1;
1111 spin_unlock_bh(&dev->xmit_lock);
1112 if (net_ratelimit())
1113 printk(KERN_CRIT "Virtual device %s asks to queue packet!\n", dev->name);
1114 kfree_skb(skb);
1115 return -ENETDOWN;
1116 } else {
1117
1118 if (net_ratelimit())
1119 printk(KERN_CRIT "Dead loop on virtual device %s, fix it urgently!\n", dev->name);
1120 }
1121 }
1122 spin_unlock_bh(&dev->queue_lock);
1123
1124 kfree_skb(skb);
1125 return -ENETDOWN;
1126}
1127
1128
1129
1130
1131
1132
1133int netdev_max_backlog = 300;
1134int weight_p = 64;
1135
1136
1137
1138
1139int no_cong_thresh = 10;
1140int no_cong = 20;
1141int lo_cong = 100;
1142int mod_cong = 290;
1143
1144struct netif_rx_stats netdev_rx_stat[NR_CPUS];
1145
1146
1147#ifdef CONFIG_NET_HW_FLOWCONTROL
1148atomic_t netdev_dropping = ATOMIC_INIT(0);
1149static unsigned long netdev_fc_mask = 1;
1150unsigned long netdev_fc_xoff = 0;
1151spinlock_t netdev_fc_lock = SPIN_LOCK_UNLOCKED;
1152
1153static struct
1154{
1155 void (*stimul)(struct net_device *);
1156 struct net_device *dev;
1157} netdev_fc_slots[BITS_PER_LONG];
1158
1159int netdev_register_fc(struct net_device *dev, void (*stimul)(struct net_device *dev))
1160{
1161 int bit = 0;
1162 unsigned long flags;
1163
1164 spin_lock_irqsave(&netdev_fc_lock, flags);
1165 if (netdev_fc_mask != ~0UL) {
1166 bit = ffz(netdev_fc_mask);
1167 netdev_fc_slots[bit].stimul = stimul;
1168 netdev_fc_slots[bit].dev = dev;
1169 set_bit(bit, &netdev_fc_mask);
1170 clear_bit(bit, &netdev_fc_xoff);
1171 }
1172 spin_unlock_irqrestore(&netdev_fc_lock, flags);
1173 return bit;
1174}
1175
1176void netdev_unregister_fc(int bit)
1177{
1178 unsigned long flags;
1179
1180 spin_lock_irqsave(&netdev_fc_lock, flags);
1181 if (bit > 0) {
1182 netdev_fc_slots[bit].stimul = NULL;
1183 netdev_fc_slots[bit].dev = NULL;
1184 clear_bit(bit, &netdev_fc_mask);
1185 clear_bit(bit, &netdev_fc_xoff);
1186 }
1187 spin_unlock_irqrestore(&netdev_fc_lock, flags);
1188}
1189
1190static void netdev_wakeup(void)
1191{
1192 unsigned long xoff;
1193
1194 spin_lock(&netdev_fc_lock);
1195 xoff = netdev_fc_xoff;
1196 netdev_fc_xoff = 0;
1197 while (xoff) {
1198 int i = ffz(~xoff);
1199 xoff &= ~(1<<i);
1200 netdev_fc_slots[i].stimul(netdev_fc_slots[i].dev);
1201 }
1202 spin_unlock(&netdev_fc_lock);
1203}
1204#endif
1205
1206static void get_sample_stats(int cpu)
1207{
1208#ifdef RAND_LIE
1209 unsigned long rd;
1210 int rq;
1211#endif
1212 int blog = softnet_data[cpu].input_pkt_queue.qlen;
1213 int avg_blog = softnet_data[cpu].avg_blog;
1214
1215 avg_blog = (avg_blog >> 1)+ (blog >> 1);
1216
1217 if (avg_blog > mod_cong) {
1218
1219 softnet_data[cpu].cng_level = NET_RX_CN_HIGH;
1220#ifdef RAND_LIE
1221 rd = net_random();
1222 rq = rd % netdev_max_backlog;
1223 if (rq < avg_blog)
1224 softnet_data[cpu].cng_level = NET_RX_DROP;
1225#endif
1226 } else if (avg_blog > lo_cong) {
1227 softnet_data[cpu].cng_level = NET_RX_CN_MOD;
1228#ifdef RAND_LIE
1229 rd = net_random();
1230 rq = rd % netdev_max_backlog;
1231 if (rq < avg_blog)
1232 softnet_data[cpu].cng_level = NET_RX_CN_HIGH;
1233#endif
1234 } else if (avg_blog > no_cong)
1235 softnet_data[cpu].cng_level = NET_RX_CN_LOW;
1236 else
1237 softnet_data[cpu].cng_level = NET_RX_SUCCESS;
1238
1239 softnet_data[cpu].avg_blog = avg_blog;
1240}
1241
1242#ifdef OFFLINE_SAMPLE
1243static void sample_queue(unsigned long dummy)
1244{
1245
1246 int next_tick = 1;
1247 int cpu = smp_processor_id();
1248
1249 get_sample_stats(cpu);
1250 next_tick += jiffies;
1251 mod_timer(&samp_timer, next_tick);
1252}
1253#endif
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275int netif_rx(struct sk_buff *skb)
1276{
1277 int this_cpu = smp_processor_id();
1278 struct softnet_data *queue;
1279 unsigned long flags;
1280
1281 if (skb->stamp.tv_sec == 0)
1282 do_gettimeofday(&skb->stamp);
1283
1284
1285
1286
1287 queue = &softnet_data[this_cpu];
1288
1289 local_irq_save(flags);
1290
1291 netdev_rx_stat[this_cpu].total++;
1292 if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
1293 if (queue->input_pkt_queue.qlen) {
1294 if (queue->throttle)
1295 goto drop;
1296
1297enqueue:
1298 dev_hold(skb->dev);
1299 __skb_queue_tail(&queue->input_pkt_queue,skb);
1300 local_irq_restore(flags);
1301#ifndef OFFLINE_SAMPLE
1302 get_sample_stats(this_cpu);
1303#endif
1304 return queue->cng_level;
1305 }
1306
1307 if (queue->throttle) {
1308 queue->throttle = 0;
1309#ifdef CONFIG_NET_HW_FLOWCONTROL
1310 if (atomic_dec_and_test(&netdev_dropping))
1311 netdev_wakeup();
1312#endif
1313 }
1314
1315 netif_rx_schedule(&queue->blog_dev);
1316 goto enqueue;
1317 }
1318
1319 if (queue->throttle == 0) {
1320 queue->throttle = 1;
1321 netdev_rx_stat[this_cpu].throttled++;
1322#ifdef CONFIG_NET_HW_FLOWCONTROL
1323 atomic_inc(&netdev_dropping);
1324#endif
1325 }
1326
1327drop:
1328 netdev_rx_stat[this_cpu].dropped++;
1329 local_irq_restore(flags);
1330
1331 kfree_skb(skb);
1332 return NET_RX_DROP;
1333}
1334
1335
1336
1337
1338static int deliver_to_old_ones(struct packet_type *pt, struct sk_buff *skb, int last)
1339{
1340 static spinlock_t net_bh_lock = SPIN_LOCK_UNLOCKED;
1341 int ret = NET_RX_DROP;
1342
1343
1344 if (!last) {
1345 skb = skb_clone(skb, GFP_ATOMIC);
1346 if (skb == NULL)
1347 return ret;
1348 }
1349 if (skb_is_nonlinear(skb) && skb_linearize(skb, GFP_ATOMIC) != 0) {
1350 kfree_skb(skb);
1351 return ret;
1352 }
1353
1354
1355
1356
1357
1358
1359 spin_lock(&net_bh_lock);
1360
1361
1362 tasklet_disable(bh_task_vec+TIMER_BH);
1363
1364 ret = pt->func(skb, skb->dev, pt);
1365
1366 tasklet_hi_enable(bh_task_vec+TIMER_BH);
1367 spin_unlock(&net_bh_lock);
1368 return ret;
1369}
1370
1371static __inline__ void skb_bond(struct sk_buff *skb)
1372{
1373 struct net_device *dev = skb->dev;
1374
1375 if (dev->master)
1376 skb->dev = dev->master;
1377}
1378
1379static void net_tx_action(struct softirq_action *h)
1380{
1381 int cpu = smp_processor_id();
1382
1383 if (softnet_data[cpu].completion_queue) {
1384 struct sk_buff *clist;
1385
1386 local_irq_disable();
1387 clist = softnet_data[cpu].completion_queue;
1388 softnet_data[cpu].completion_queue = NULL;
1389 local_irq_enable();
1390
1391 while (clist != NULL) {
1392 struct sk_buff *skb = clist;
1393 clist = clist->next;
1394
1395 BUG_TRAP(atomic_read(&skb->users) == 0);
1396 __kfree_skb(skb);
1397 }
1398 }
1399
1400 if (softnet_data[cpu].output_queue) {
1401 struct net_device *head;
1402
1403 local_irq_disable();
1404 head = softnet_data[cpu].output_queue;
1405 softnet_data[cpu].output_queue = NULL;
1406 local_irq_enable();
1407
1408 while (head != NULL) {
1409 struct net_device *dev = head;
1410 head = head->next_sched;
1411
1412 smp_mb__before_clear_bit();
1413 clear_bit(__LINK_STATE_SCHED, &dev->state);
1414
1415 if (spin_trylock(&dev->queue_lock)) {
1416 qdisc_run(dev);
1417 spin_unlock(&dev->queue_lock);
1418 } else {
1419 netif_schedule(dev);
1420 }
1421 }
1422 }
1423}
1424
1425
1426#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
1427void (*br_handle_frame_hook)(struct sk_buff *skb) = NULL;
1428#endif
1429
1430static __inline__ int handle_bridge(struct sk_buff *skb,
1431 struct packet_type *pt_prev)
1432{
1433 int ret = NET_RX_DROP;
1434
1435 if (pt_prev) {
1436 if (!pt_prev->data)
1437 ret = deliver_to_old_ones(pt_prev, skb, 0);
1438 else {
1439 atomic_inc(&skb->users);
1440 ret = pt_prev->func(skb, skb->dev, pt_prev);
1441 }
1442 }
1443
1444 br_handle_frame_hook(skb);
1445 return ret;
1446}
1447
1448
1449#ifdef CONFIG_NET_DIVERT
1450static inline int handle_diverter(struct sk_buff *skb)
1451{
1452
1453 if (skb->dev->divert && skb->dev->divert->divert)
1454 divert_frame(skb);
1455 return 0;
1456}
1457#endif
1458
1459int netif_receive_skb(struct sk_buff *skb)
1460{
1461 struct packet_type *ptype, *pt_prev;
1462 int ret = NET_RX_DROP;
1463 unsigned short type = skb->protocol;
1464
1465 if (skb->stamp.tv_sec == 0)
1466 do_gettimeofday(&skb->stamp);
1467
1468 skb_bond(skb);
1469
1470 netdev_rx_stat[smp_processor_id()].total++;
1471
1472#ifdef CONFIG_NET_FASTROUTE
1473 if (skb->pkt_type == PACKET_FASTROUTE) {
1474 netdev_rx_stat[smp_processor_id()].fastroute_deferred_out++;
1475 return dev_queue_xmit(skb);
1476 }
1477#endif
1478
1479 skb->h.raw = skb->nh.raw = skb->data;
1480
1481 pt_prev = NULL;
1482 for (ptype = ptype_all; ptype; ptype = ptype->next) {
1483 if (!ptype->dev || ptype->dev == skb->dev) {
1484 if (pt_prev) {
1485 if (!pt_prev->data) {
1486 ret = deliver_to_old_ones(pt_prev, skb, 0);
1487 } else {
1488 atomic_inc(&skb->users);
1489 ret = pt_prev->func(skb, skb->dev, pt_prev);
1490 }
1491 }
1492 pt_prev = ptype;
1493 }
1494 }
1495
1496#ifdef CONFIG_NET_DIVERT
1497 if (skb->dev->divert && skb->dev->divert->divert)
1498 ret = handle_diverter(skb);
1499#endif
1500
1501#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
1502 if (skb->dev->br_port != NULL &&
1503 br_handle_frame_hook != NULL) {
1504 return handle_bridge(skb, pt_prev);
1505 }
1506#endif
1507
1508 for (ptype=ptype_base[ntohs(type)&15];ptype;ptype=ptype->next) {
1509 if (ptype->type == type &&
1510 (!ptype->dev || ptype->dev == skb->dev)) {
1511 if (pt_prev) {
1512 if (!pt_prev->data) {
1513 ret = deliver_to_old_ones(pt_prev, skb, 0);
1514 } else {
1515 atomic_inc(&skb->users);
1516 ret = pt_prev->func(skb, skb->dev, pt_prev);
1517 }
1518 }
1519 pt_prev = ptype;
1520 }
1521 }
1522
1523 if (pt_prev) {
1524 if (!pt_prev->data) {
1525 ret = deliver_to_old_ones(pt_prev, skb, 1);
1526 } else {
1527 ret = pt_prev->func(skb, skb->dev, pt_prev);
1528 }
1529 } else {
1530 kfree_skb(skb);
1531
1532
1533
1534 ret = NET_RX_DROP;
1535 }
1536
1537 return ret;
1538}
1539
1540static int process_backlog(struct net_device *blog_dev, int *budget)
1541{
1542 int work = 0;
1543 int quota = min(blog_dev->quota, *budget);
1544 int this_cpu = smp_processor_id();
1545 struct softnet_data *queue = &softnet_data[this_cpu];
1546 unsigned long start_time = jiffies;
1547
1548 for (;;) {
1549 struct sk_buff *skb;
1550 struct net_device *dev;
1551
1552 local_irq_disable();
1553 skb = __skb_dequeue(&queue->input_pkt_queue);
1554 if (skb == NULL)
1555 goto job_done;
1556 local_irq_enable();
1557
1558 dev = skb->dev;
1559
1560 netif_receive_skb(skb);
1561
1562 dev_put(dev);
1563
1564 work++;
1565
1566 if (work >= quota || jiffies - start_time > 1)
1567 break;
1568
1569#ifdef CONFIG_NET_HW_FLOWCONTROL
1570 if (queue->throttle && queue->input_pkt_queue.qlen < no_cong_thresh ) {
1571 if (atomic_dec_and_test(&netdev_dropping)) {
1572 queue->throttle = 0;
1573 netdev_wakeup();
1574 break;
1575 }
1576 }
1577#endif
1578 }
1579
1580 blog_dev->quota -= work;
1581 *budget -= work;
1582 return -1;
1583
1584job_done:
1585 blog_dev->quota -= work;
1586 *budget -= work;
1587
1588 list_del(&blog_dev->poll_list);
1589 clear_bit(__LINK_STATE_RX_SCHED, &blog_dev->state);
1590
1591 if (queue->throttle) {
1592 queue->throttle = 0;
1593#ifdef CONFIG_NET_HW_FLOWCONTROL
1594 if (atomic_dec_and_test(&netdev_dropping))
1595 netdev_wakeup();
1596#endif
1597 }
1598 local_irq_enable();
1599 return 0;
1600}
1601
1602static void net_rx_action(struct softirq_action *h)
1603{
1604 int this_cpu = smp_processor_id();
1605 struct softnet_data *queue = &softnet_data[this_cpu];
1606 unsigned long start_time = jiffies;
1607 int budget = netdev_max_backlog;
1608
1609 br_read_lock(BR_NETPROTO_LOCK);
1610 local_irq_disable();
1611
1612 while (!list_empty(&queue->poll_list)) {
1613 struct net_device *dev;
1614
1615 if (budget <= 0 || jiffies - start_time > 1)
1616 goto softnet_break;
1617
1618 local_irq_enable();
1619
1620 dev = list_entry(queue->poll_list.next, struct net_device, poll_list);
1621
1622 if (dev->quota <= 0 || dev->poll(dev, &budget)) {
1623 local_irq_disable();
1624 list_del(&dev->poll_list);
1625 list_add_tail(&dev->poll_list, &queue->poll_list);
1626 if (dev->quota < 0)
1627 dev->quota += dev->weight;
1628 else
1629 dev->quota = dev->weight;
1630 } else {
1631 dev_put(dev);
1632 local_irq_disable();
1633 }
1634 }
1635
1636 local_irq_enable();
1637 br_read_unlock(BR_NETPROTO_LOCK);
1638 return;
1639
1640softnet_break:
1641 netdev_rx_stat[this_cpu].time_squeeze++;
1642 __cpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ);
1643
1644 local_irq_enable();
1645 br_read_unlock(BR_NETPROTO_LOCK);
1646}
1647
1648static gifconf_func_t * gifconf_list [NPROTO];
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660int register_gifconf(unsigned int family, gifconf_func_t * gifconf)
1661{
1662 if (family>=NPROTO)
1663 return -EINVAL;
1664 gifconf_list[family] = gifconf;
1665 return 0;
1666}
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680static int dev_ifname(struct ifreq *arg)
1681{
1682 struct net_device *dev;
1683 struct ifreq ifr;
1684
1685
1686
1687
1688
1689 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
1690 return -EFAULT;
1691
1692 read_lock(&dev_base_lock);
1693 dev = __dev_get_by_index(ifr.ifr_ifindex);
1694 if (!dev) {
1695 read_unlock(&dev_base_lock);
1696 return -ENODEV;
1697 }
1698
1699 strcpy(ifr.ifr_name, dev->name);
1700 read_unlock(&dev_base_lock);
1701
1702 if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
1703 return -EFAULT;
1704 return 0;
1705}
1706
1707
1708
1709
1710
1711
1712
1713static int dev_ifconf(char *arg)
1714{
1715 struct ifconf ifc;
1716 struct net_device *dev;
1717 char *pos;
1718 int len;
1719 int total;
1720 int i;
1721
1722
1723
1724
1725
1726 if (copy_from_user(&ifc, arg, sizeof(struct ifconf)))
1727 return -EFAULT;
1728
1729 pos = ifc.ifc_buf;
1730 len = ifc.ifc_len;
1731
1732
1733
1734
1735
1736 total = 0;
1737 for (dev = dev_base; dev != NULL; dev = dev->next) {
1738 for (i=0; i<NPROTO; i++) {
1739 if (gifconf_list[i]) {
1740 int done;
1741 if (pos==NULL) {
1742 done = gifconf_list[i](dev, NULL, 0);
1743 } else {
1744 done = gifconf_list[i](dev, pos+total, len-total);
1745 }
1746 if (done<0) {
1747 return -EFAULT;
1748 }
1749 total += done;
1750 }
1751 }
1752 }
1753
1754
1755
1756
1757 ifc.ifc_len = total;
1758
1759 if (copy_to_user(arg, &ifc, sizeof(struct ifconf)))
1760 return -EFAULT;
1761
1762
1763
1764
1765 return 0;
1766}
1767
1768
1769
1770
1771
1772
1773#ifdef CONFIG_PROC_FS
1774
1775static int sprintf_stats(char *buffer, struct net_device *dev)
1776{
1777 struct net_device_stats *stats = (dev->get_stats ? dev->get_stats(dev): NULL);
1778 int size;
1779
1780 if (stats)
1781 size = sprintf(buffer, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu %8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n",
1782 dev->name,
1783 stats->rx_bytes,
1784 stats->rx_packets, stats->rx_errors,
1785 stats->rx_dropped + stats->rx_missed_errors,
1786 stats->rx_fifo_errors,
1787 stats->rx_length_errors + stats->rx_over_errors
1788 + stats->rx_crc_errors + stats->rx_frame_errors,
1789 stats->rx_compressed, stats->multicast,
1790 stats->tx_bytes,
1791 stats->tx_packets, stats->tx_errors, stats->tx_dropped,
1792 stats->tx_fifo_errors, stats->collisions,
1793 stats->tx_carrier_errors + stats->tx_aborted_errors
1794 + stats->tx_window_errors + stats->tx_heartbeat_errors,
1795 stats->tx_compressed);
1796 else
1797 size = sprintf(buffer, "%6s: No statistics available.\n", dev->name);
1798
1799 return size;
1800}
1801
1802
1803
1804
1805
1806
1807static int dev_get_info(char *buffer, char **start, off_t offset, int length)
1808{
1809 int len = 0;
1810 off_t begin = 0;
1811 off_t pos = 0;
1812 int size;
1813 struct net_device *dev;
1814
1815
1816 size = sprintf(buffer,
1817 "Inter-| Receive | Transmit\n"
1818 " face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed\n");
1819
1820 pos += size;
1821 len += size;
1822
1823
1824 read_lock(&dev_base_lock);
1825 for (dev = dev_base; dev != NULL; dev = dev->next) {
1826 size = sprintf_stats(buffer+len, dev);
1827 len += size;
1828 pos = begin + len;
1829
1830 if (pos < offset) {
1831 len = 0;
1832 begin = pos;
1833 }
1834 if (pos > offset + length)
1835 break;
1836 }
1837 read_unlock(&dev_base_lock);
1838
1839 *start = buffer + (offset - begin);
1840 len -= (offset - begin);
1841 if (len > length)
1842 len = length;
1843 if (len < 0)
1844 len = 0;
1845 return len;
1846}
1847
1848static int dev_proc_stats(char *buffer, char **start, off_t offset,
1849 int length, int *eof, void *data)
1850{
1851 int i, lcpu;
1852 int len=0;
1853
1854 for (lcpu=0; lcpu<smp_num_cpus; lcpu++) {
1855 i = cpu_logical_map(lcpu);
1856 len += sprintf(buffer+len, "%08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
1857 netdev_rx_stat[i].total,
1858 netdev_rx_stat[i].dropped,
1859 netdev_rx_stat[i].time_squeeze,
1860 netdev_rx_stat[i].throttled,
1861 netdev_rx_stat[i].fastroute_hit,
1862 netdev_rx_stat[i].fastroute_success,
1863 netdev_rx_stat[i].fastroute_defer,
1864 netdev_rx_stat[i].fastroute_deferred_out,
1865#if 0
1866 netdev_rx_stat[i].fastroute_latency_reduction
1867#else
1868 netdev_rx_stat[i].cpu_collision
1869#endif
1870 );
1871 }
1872
1873 len -= offset;
1874
1875 if (len > length)
1876 len = length;
1877 if (len < 0)
1878 len = 0;
1879
1880 *start = buffer + offset;
1881 *eof = 1;
1882
1883 return len;
1884}
1885
1886#endif
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901int netdev_set_master(struct net_device *slave, struct net_device *master)
1902{
1903 struct net_device *old = slave->master;
1904
1905 ASSERT_RTNL();
1906
1907 if (master) {
1908 if (old)
1909 return -EBUSY;
1910 dev_hold(master);
1911 }
1912
1913 br_write_lock_bh(BR_NETPROTO_LOCK);
1914 slave->master = master;
1915 br_write_unlock_bh(BR_NETPROTO_LOCK);
1916
1917 if (old)
1918 dev_put(old);
1919
1920 if (master)
1921 slave->flags |= IFF_SLAVE;
1922 else
1923 slave->flags &= ~IFF_SLAVE;
1924
1925 rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE);
1926 return 0;
1927}
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940void dev_set_promiscuity(struct net_device *dev, int inc)
1941{
1942 unsigned short old_flags = dev->flags;
1943
1944 dev->flags |= IFF_PROMISC;
1945 if ((dev->promiscuity += inc) == 0)
1946 dev->flags &= ~IFF_PROMISC;
1947 if (dev->flags^old_flags) {
1948#ifdef CONFIG_NET_FASTROUTE
1949 if (dev->flags&IFF_PROMISC) {
1950 netdev_fastroute_obstacles++;
1951 dev_clear_fastroute(dev);
1952 } else
1953 netdev_fastroute_obstacles--;
1954#endif
1955 dev_mc_upload(dev);
1956 printk(KERN_INFO "device %s %s promiscuous mode\n",
1957 dev->name, (dev->flags&IFF_PROMISC) ? "entered" : "left");
1958 }
1959}
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973void dev_set_allmulti(struct net_device *dev, int inc)
1974{
1975 unsigned short old_flags = dev->flags;
1976
1977 dev->flags |= IFF_ALLMULTI;
1978 if ((dev->allmulti += inc) == 0)
1979 dev->flags &= ~IFF_ALLMULTI;
1980 if (dev->flags^old_flags)
1981 dev_mc_upload(dev);
1982}
1983
1984int dev_change_flags(struct net_device *dev, unsigned flags)
1985{
1986 int ret;
1987 int old_flags = dev->flags;
1988
1989
1990
1991
1992
1993 dev->flags = (flags & (IFF_DEBUG|IFF_NOTRAILERS|IFF_NOARP|IFF_DYNAMIC|
1994 IFF_MULTICAST|IFF_PORTSEL|IFF_AUTOMEDIA)) |
1995 (dev->flags & (IFF_UP|IFF_VOLATILE|IFF_PROMISC|IFF_ALLMULTI));
1996
1997
1998
1999
2000
2001 dev_mc_upload(dev);
2002
2003
2004
2005
2006
2007
2008
2009 ret = 0;
2010 if ((old_flags^flags)&IFF_UP)
2011 {
2012 ret = ((old_flags & IFF_UP) ? dev_close : dev_open)(dev);
2013
2014 if (ret == 0)
2015 dev_mc_upload(dev);
2016 }
2017
2018 if (dev->flags&IFF_UP &&
2019 ((old_flags^dev->flags)&~(IFF_UP|IFF_PROMISC|IFF_ALLMULTI|IFF_VOLATILE)))
2020 notifier_call_chain(&netdev_chain, NETDEV_CHANGE, dev);
2021
2022 if ((flags^dev->gflags)&IFF_PROMISC) {
2023 int inc = (flags&IFF_PROMISC) ? +1 : -1;
2024 dev->gflags ^= IFF_PROMISC;
2025 dev_set_promiscuity(dev, inc);
2026 }
2027
2028
2029
2030
2031
2032 if ((flags^dev->gflags)&IFF_ALLMULTI) {
2033 int inc = (flags&IFF_ALLMULTI) ? +1 : -1;
2034 dev->gflags ^= IFF_ALLMULTI;
2035 dev_set_allmulti(dev, inc);
2036 }
2037
2038 if (old_flags^dev->flags)
2039 rtmsg_ifinfo(RTM_NEWLINK, dev, old_flags^dev->flags);
2040
2041 return ret;
2042}
2043
2044
2045
2046
2047
2048static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd)
2049{
2050 struct net_device *dev;
2051 int err;
2052
2053 if ((dev = __dev_get_by_name(ifr->ifr_name)) == NULL)
2054 return -ENODEV;
2055
2056 switch(cmd)
2057 {
2058 case SIOCGIFFLAGS:
2059 ifr->ifr_flags = (dev->flags&~(IFF_PROMISC|IFF_ALLMULTI|IFF_RUNNING))
2060 |(dev->gflags&(IFF_PROMISC|IFF_ALLMULTI));
2061 if (netif_running(dev) && netif_carrier_ok(dev))
2062 ifr->ifr_flags |= IFF_RUNNING;
2063 return 0;
2064
2065 case SIOCSIFFLAGS:
2066 return dev_change_flags(dev, ifr->ifr_flags);
2067
2068 case SIOCGIFMETRIC:
2069 ifr->ifr_metric = 0;
2070 return 0;
2071
2072 case SIOCSIFMETRIC:
2073 return -EOPNOTSUPP;
2074
2075 case SIOCGIFMTU:
2076 ifr->ifr_mtu = dev->mtu;
2077 return 0;
2078
2079 case SIOCSIFMTU:
2080 if (ifr->ifr_mtu == dev->mtu)
2081 return 0;
2082
2083
2084
2085
2086
2087 if (ifr->ifr_mtu<0)
2088 return -EINVAL;
2089
2090 if (!netif_device_present(dev))
2091 return -ENODEV;
2092
2093 if (dev->change_mtu)
2094 err = dev->change_mtu(dev, ifr->ifr_mtu);
2095 else {
2096 dev->mtu = ifr->ifr_mtu;
2097 err = 0;
2098 }
2099 if (!err && dev->flags&IFF_UP)
2100 notifier_call_chain(&netdev_chain, NETDEV_CHANGEMTU, dev);
2101 return err;
2102
2103 case SIOCGIFHWADDR:
2104 memcpy(ifr->ifr_hwaddr.sa_data,dev->dev_addr, MAX_ADDR_LEN);
2105 ifr->ifr_hwaddr.sa_family=dev->type;
2106 return 0;
2107
2108 case SIOCSIFHWADDR:
2109 if (dev->set_mac_address == NULL)
2110 return -EOPNOTSUPP;
2111 if (ifr->ifr_hwaddr.sa_family!=dev->type)
2112 return -EINVAL;
2113 if (!netif_device_present(dev))
2114 return -ENODEV;
2115 err = dev->set_mac_address(dev, &ifr->ifr_hwaddr);
2116 if (!err)
2117 notifier_call_chain(&netdev_chain, NETDEV_CHANGEADDR, dev);
2118 return err;
2119
2120 case SIOCSIFHWBROADCAST:
2121 if (ifr->ifr_hwaddr.sa_family!=dev->type)
2122 return -EINVAL;
2123 memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data, MAX_ADDR_LEN);
2124 notifier_call_chain(&netdev_chain, NETDEV_CHANGEADDR, dev);
2125 return 0;
2126
2127 case SIOCGIFMAP:
2128 ifr->ifr_map.mem_start=dev->mem_start;
2129 ifr->ifr_map.mem_end=dev->mem_end;
2130 ifr->ifr_map.base_addr=dev->base_addr;
2131 ifr->ifr_map.irq=dev->irq;
2132 ifr->ifr_map.dma=dev->dma;
2133 ifr->ifr_map.port=dev->if_port;
2134 return 0;
2135
2136 case SIOCSIFMAP:
2137 if (dev->set_config) {
2138 if (!netif_device_present(dev))
2139 return -ENODEV;
2140 return dev->set_config(dev,&ifr->ifr_map);
2141 }
2142 return -EOPNOTSUPP;
2143
2144 case SIOCADDMULTI:
2145 if (dev->set_multicast_list == NULL ||
2146 ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
2147 return -EINVAL;
2148 if (!netif_device_present(dev))
2149 return -ENODEV;
2150 dev_mc_add(dev,ifr->ifr_hwaddr.sa_data, dev->addr_len, 1);
2151 return 0;
2152
2153 case SIOCDELMULTI:
2154 if (dev->set_multicast_list == NULL ||
2155 ifr->ifr_hwaddr.sa_family!=AF_UNSPEC)
2156 return -EINVAL;
2157 if (!netif_device_present(dev))
2158 return -ENODEV;
2159 dev_mc_delete(dev,ifr->ifr_hwaddr.sa_data,dev->addr_len, 1);
2160 return 0;
2161
2162 case SIOCGIFINDEX:
2163 ifr->ifr_ifindex = dev->ifindex;
2164 return 0;
2165
2166 case SIOCGIFTXQLEN:
2167 ifr->ifr_qlen = dev->tx_queue_len;
2168 return 0;
2169
2170 case SIOCSIFTXQLEN:
2171 if (ifr->ifr_qlen<0)
2172 return -EINVAL;
2173 dev->tx_queue_len = ifr->ifr_qlen;
2174 return 0;
2175
2176 case SIOCSIFNAME:
2177 if (dev->flags&IFF_UP)
2178 return -EBUSY;
2179 if (__dev_get_by_name(ifr->ifr_newname))
2180 return -EEXIST;
2181 memcpy(dev->name, ifr->ifr_newname, IFNAMSIZ);
2182 dev->name[IFNAMSIZ-1] = 0;
2183 notifier_call_chain(&netdev_chain, NETDEV_CHANGENAME, dev);
2184 return 0;
2185
2186
2187
2188
2189
2190 default:
2191 if ((cmd >= SIOCDEVPRIVATE &&
2192 cmd <= SIOCDEVPRIVATE + 15) ||
2193 cmd == SIOCBONDENSLAVE ||
2194 cmd == SIOCBONDRELEASE ||
2195 cmd == SIOCBONDSETHWADDR ||
2196 cmd == SIOCBONDSLAVEINFOQUERY ||
2197 cmd == SIOCBONDINFOQUERY ||
2198 cmd == SIOCBONDCHANGEACTIVE ||
2199 cmd == SIOCETHTOOL ||
2200 cmd == SIOCGMIIPHY ||
2201 cmd == SIOCGMIIREG ||
2202 cmd == SIOCSMIIREG ||
2203 cmd == SIOCWANDEV) {
2204 if (dev->do_ioctl) {
2205 if (!netif_device_present(dev))
2206 return -ENODEV;
2207 return dev->do_ioctl(dev, ifr, cmd);
2208 }
2209 return -EOPNOTSUPP;
2210 }
2211
2212 }
2213 return -EINVAL;
2214}
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232int dev_ioctl(unsigned int cmd, void *arg)
2233{
2234 struct ifreq ifr;
2235 int ret;
2236 char *colon;
2237
2238
2239
2240
2241
2242
2243 if (cmd == SIOCGIFCONF) {
2244 rtnl_shlock();
2245 ret = dev_ifconf((char *) arg);
2246 rtnl_shunlock();
2247 return ret;
2248 }
2249 if (cmd == SIOCGIFNAME) {
2250 return dev_ifname((struct ifreq *)arg);
2251 }
2252
2253 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
2254 return -EFAULT;
2255
2256 ifr.ifr_name[IFNAMSIZ-1] = 0;
2257
2258 colon = strchr(ifr.ifr_name, ':');
2259 if (colon)
2260 *colon = 0;
2261
2262
2263
2264
2265
2266 switch(cmd)
2267 {
2268
2269
2270
2271
2272
2273
2274
2275 case SIOCGIFFLAGS:
2276 case SIOCGIFMETRIC:
2277 case SIOCGIFMTU:
2278 case SIOCGIFHWADDR:
2279 case SIOCGIFSLAVE:
2280 case SIOCGIFMAP:
2281 case SIOCGIFINDEX:
2282 case SIOCGIFTXQLEN:
2283 dev_load(ifr.ifr_name);
2284 read_lock(&dev_base_lock);
2285 ret = dev_ifsioc(&ifr, cmd);
2286 read_unlock(&dev_base_lock);
2287 if (!ret) {
2288 if (colon)
2289 *colon = ':';
2290 if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
2291 return -EFAULT;
2292 }
2293 return ret;
2294
2295
2296
2297
2298
2299
2300
2301
2302 case SIOCETHTOOL:
2303 case SIOCGMIIPHY:
2304 case SIOCGMIIREG:
2305 if (!capable(CAP_NET_ADMIN))
2306 return -EPERM;
2307 dev_load(ifr.ifr_name);
2308 dev_probe_lock();
2309 rtnl_lock();
2310 ret = dev_ifsioc(&ifr, cmd);
2311 rtnl_unlock();
2312 dev_probe_unlock();
2313 if (!ret) {
2314 if (colon)
2315 *colon = ':';
2316 if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
2317 return -EFAULT;
2318 }
2319 return ret;
2320
2321
2322
2323
2324
2325
2326
2327
2328 case SIOCSIFFLAGS:
2329 case SIOCSIFMETRIC:
2330 case SIOCSIFMTU:
2331 case SIOCSIFMAP:
2332 case SIOCSIFHWADDR:
2333 case SIOCSIFSLAVE:
2334 case SIOCADDMULTI:
2335 case SIOCDELMULTI:
2336 case SIOCSIFHWBROADCAST:
2337 case SIOCSIFTXQLEN:
2338 case SIOCSIFNAME:
2339 case SIOCSMIIREG:
2340 case SIOCBONDENSLAVE:
2341 case SIOCBONDRELEASE:
2342 case SIOCBONDSETHWADDR:
2343 case SIOCBONDSLAVEINFOQUERY:
2344 case SIOCBONDINFOQUERY:
2345 case SIOCBONDCHANGEACTIVE:
2346 if (!capable(CAP_NET_ADMIN))
2347 return -EPERM;
2348 dev_load(ifr.ifr_name);
2349 dev_probe_lock();
2350 rtnl_lock();
2351 ret = dev_ifsioc(&ifr, cmd);
2352 rtnl_unlock();
2353 dev_probe_unlock();
2354 return ret;
2355
2356 case SIOCGIFMEM:
2357
2358
2359 case SIOCSIFMEM:
2360
2361 case SIOCSIFLINK:
2362 return -EINVAL;
2363
2364
2365
2366
2367
2368 default:
2369 if (cmd == SIOCWANDEV ||
2370 (cmd >= SIOCDEVPRIVATE &&
2371 cmd <= SIOCDEVPRIVATE + 15)) {
2372 dev_load(ifr.ifr_name);
2373 dev_probe_lock();
2374 rtnl_lock();
2375 ret = dev_ifsioc(&ifr, cmd);
2376 rtnl_unlock();
2377 dev_probe_unlock();
2378 if (!ret && copy_to_user(arg, &ifr, sizeof(struct ifreq)))
2379 return -EFAULT;
2380 return ret;
2381 }
2382#ifdef WIRELESS_EXT
2383
2384 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
2385
2386
2387
2388 if (IW_IS_SET(cmd) || (cmd == SIOCGIWENCODE)) {
2389 if(!capable(CAP_NET_ADMIN))
2390 return -EPERM;
2391 }
2392 dev_load(ifr.ifr_name);
2393 rtnl_lock();
2394
2395 ret = wireless_process_ioctl(&ifr, cmd);
2396 rtnl_unlock();
2397 if (!ret && IW_IS_GET(cmd) &&
2398 copy_to_user(arg, &ifr, sizeof(struct ifreq)))
2399 return -EFAULT;
2400 return ret;
2401 }
2402#endif
2403 return -EINVAL;
2404 }
2405}
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416int dev_new_index(void)
2417{
2418 static int ifindex;
2419 for (;;) {
2420 if (++ifindex <= 0)
2421 ifindex=1;
2422 if (__dev_get_by_index(ifindex) == NULL)
2423 return ifindex;
2424 }
2425}
2426
2427static int dev_boot_phase = 1;
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447int net_dev_init(void);
2448
2449int register_netdevice(struct net_device *dev)
2450{
2451 struct net_device *d, **dp;
2452#ifdef CONFIG_NET_DIVERT
2453 int ret;
2454#endif
2455
2456 spin_lock_init(&dev->queue_lock);
2457 spin_lock_init(&dev->xmit_lock);
2458 dev->xmit_lock_owner = -1;
2459#ifdef CONFIG_NET_FASTROUTE
2460 dev->fastpath_lock=RW_LOCK_UNLOCKED;
2461#endif
2462
2463 if (dev_boot_phase)
2464 net_dev_init();
2465
2466#ifdef CONFIG_NET_DIVERT
2467 ret = alloc_divert_blk(dev);
2468 if (ret)
2469 return ret;
2470#endif
2471
2472 dev->iflink = -1;
2473
2474
2475 if (dev->init && dev->init(dev) != 0) {
2476#ifdef CONFIG_NET_DIVERT
2477 free_divert_blk(dev);
2478#endif
2479 return -EIO;
2480 }
2481
2482 dev->ifindex = dev_new_index();
2483 if (dev->iflink == -1)
2484 dev->iflink = dev->ifindex;
2485
2486
2487 for (dp=&dev_base; (d=*dp) != NULL; dp=&d->next) {
2488 if (d == dev || strcmp(d->name, dev->name) == 0) {
2489#ifdef CONFIG_NET_DIVERT
2490 free_divert_blk(dev);
2491#endif
2492 return -EEXIST;
2493 }
2494 }
2495
2496
2497 if ((dev->features & NETIF_F_SG) &&
2498 !(dev->features & (NETIF_F_IP_CSUM |
2499 NETIF_F_NO_CSUM |
2500 NETIF_F_HW_CSUM))) {
2501 printk("%s: Dropping NETIF_F_SG since no checksum feature.\n",
2502 dev->name);
2503 dev->features &= ~NETIF_F_SG;
2504 }
2505
2506
2507
2508
2509
2510
2511 if (dev->rebuild_header == NULL)
2512 dev->rebuild_header = default_rebuild_header;
2513
2514
2515
2516
2517
2518
2519 set_bit(__LINK_STATE_PRESENT, &dev->state);
2520
2521 dev->next = NULL;
2522 dev_init_scheduler(dev);
2523 write_lock_bh(&dev_base_lock);
2524 *dp = dev;
2525 dev_hold(dev);
2526 dev->deadbeaf = 0;
2527 write_unlock_bh(&dev_base_lock);
2528
2529
2530 notifier_call_chain(&netdev_chain, NETDEV_REGISTER, dev);
2531
2532 net_run_sbin_hotplug(dev, "register");
2533
2534 return 0;
2535}
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545int netdev_finish_unregister(struct net_device *dev)
2546{
2547 BUG_TRAP(dev->ip_ptr==NULL);
2548 BUG_TRAP(dev->ip6_ptr==NULL);
2549 BUG_TRAP(dev->dn_ptr==NULL);
2550
2551 if (!dev->deadbeaf) {
2552 printk(KERN_ERR "Freeing alive device %p, %s\n", dev, dev->name);
2553 return 0;
2554 }
2555#ifdef NET_REFCNT_DEBUG
2556 printk(KERN_DEBUG "netdev_finish_unregister: %s%s.\n", dev->name,
2557 (dev->features & NETIF_F_DYNALLOC)?"":", old style");
2558#endif
2559 if (dev->destructor)
2560 dev->destructor(dev);
2561 if (dev->features & NETIF_F_DYNALLOC)
2562 kfree(dev);
2563 return 0;
2564}
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579int unregister_netdevice(struct net_device *dev)
2580{
2581 unsigned long now, warning_time;
2582 struct net_device *d, **dp;
2583
2584
2585 if (dev->flags & IFF_UP)
2586 dev_close(dev);
2587
2588 BUG_TRAP(dev->deadbeaf==0);
2589 dev->deadbeaf = 1;
2590
2591
2592 for (dp = &dev_base; (d=*dp) != NULL; dp=&d->next) {
2593 if (d == dev) {
2594 write_lock_bh(&dev_base_lock);
2595 *dp = d->next;
2596 write_unlock_bh(&dev_base_lock);
2597 break;
2598 }
2599 }
2600 if (d == NULL) {
2601 printk(KERN_DEBUG "unregister_netdevice: device %s/%p never was registered\n", dev->name, dev);
2602 return -ENODEV;
2603 }
2604
2605
2606 br_write_lock_bh(BR_NETPROTO_LOCK);
2607 br_write_unlock_bh(BR_NETPROTO_LOCK);
2608
2609 if (dev_boot_phase == 0) {
2610#ifdef CONFIG_NET_FASTROUTE
2611 dev_clear_fastroute(dev);
2612#endif
2613
2614
2615 dev_shutdown(dev);
2616
2617 net_run_sbin_hotplug(dev, "unregister");
2618
2619
2620
2621
2622 notifier_call_chain(&netdev_chain, NETDEV_UNREGISTER, dev);
2623
2624
2625
2626
2627 dev_mc_discard(dev);
2628 }
2629
2630 if (dev->uninit)
2631 dev->uninit(dev);
2632
2633
2634 BUG_TRAP(dev->master==NULL);
2635
2636#ifdef CONFIG_NET_DIVERT
2637 free_divert_blk(dev);
2638#endif
2639
2640 if (dev->features & NETIF_F_DYNALLOC) {
2641#ifdef NET_REFCNT_DEBUG
2642 if (atomic_read(&dev->refcnt) != 1)
2643 printk(KERN_DEBUG "unregister_netdevice: holding %s refcnt=%d\n", dev->name, atomic_read(&dev->refcnt)-1);
2644#endif
2645 dev_put(dev);
2646 return 0;
2647 }
2648
2649
2650 if (atomic_read(&dev->refcnt) == 1) {
2651 dev_put(dev);
2652 return 0;
2653 }
2654
2655#ifdef NET_REFCNT_DEBUG
2656 printk("unregister_netdevice: waiting %s refcnt=%d\n", dev->name, atomic_read(&dev->refcnt));
2657#endif
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682 now = warning_time = jiffies;
2683 while (atomic_read(&dev->refcnt) != 1) {
2684 if ((jiffies - now) > 1*HZ) {
2685
2686 notifier_call_chain(&netdev_chain, NETDEV_UNREGISTER, dev);
2687 }
2688 current->state = TASK_INTERRUPTIBLE;
2689 schedule_timeout(HZ/4);
2690 current->state = TASK_RUNNING;
2691 if ((jiffies - warning_time) > 10*HZ) {
2692 printk(KERN_EMERG "unregister_netdevice: waiting for %s to "
2693 "become free. Usage count = %d\n",
2694 dev->name, atomic_read(&dev->refcnt));
2695 warning_time = jiffies;
2696 }
2697 }
2698 dev_put(dev);
2699 return 0;
2700}
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710extern void net_device_init(void);
2711extern void ip_auto_config(void);
2712struct proc_dir_entry *proc_net_drivers;
2713#ifdef CONFIG_NET_DIVERT
2714extern void dv_init(void);
2715#endif
2716
2717
2718
2719
2720
2721
2722int __init net_dev_init(void)
2723{
2724 struct net_device *dev, **dp;
2725 int i;
2726
2727 if (!dev_boot_phase)
2728 return 0;
2729
2730
2731#ifdef CONFIG_NET_DIVERT
2732 dv_init();
2733#endif
2734
2735
2736
2737
2738
2739 for (i = 0; i < NR_CPUS; i++) {
2740 struct softnet_data *queue;
2741
2742 queue = &softnet_data[i];
2743 skb_queue_head_init(&queue->input_pkt_queue);
2744 queue->throttle = 0;
2745 queue->cng_level = 0;
2746 queue->avg_blog = 10;
2747 queue->completion_queue = NULL;
2748 INIT_LIST_HEAD(&queue->poll_list);
2749 set_bit(__LINK_STATE_START, &queue->blog_dev.state);
2750 queue->blog_dev.weight = weight_p;
2751 queue->blog_dev.poll = process_backlog;
2752 atomic_set(&queue->blog_dev.refcnt, 1);
2753 }
2754
2755#ifdef CONFIG_NET_PROFILE
2756 net_profile_init();
2757 NET_PROFILE_REGISTER(dev_queue_xmit);
2758 NET_PROFILE_REGISTER(softnet_process);
2759#endif
2760
2761#ifdef OFFLINE_SAMPLE
2762 samp_timer.expires = jiffies + (10 * HZ);
2763 add_timer(&samp_timer);
2764#endif
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776 dp = &dev_base;
2777 while ((dev = *dp) != NULL) {
2778 spin_lock_init(&dev->queue_lock);
2779 spin_lock_init(&dev->xmit_lock);
2780#ifdef CONFIG_NET_FASTROUTE
2781 dev->fastpath_lock = RW_LOCK_UNLOCKED;
2782#endif
2783 dev->xmit_lock_owner = -1;
2784 dev->iflink = -1;
2785 dev_hold(dev);
2786
2787
2788
2789
2790
2791 if (strchr(dev->name, '%'))
2792 dev_alloc_name(dev, dev->name);
2793
2794
2795
2796
2797 netdev_boot_setup_check(dev);
2798
2799 if (dev->init && dev->init(dev)) {
2800
2801
2802
2803
2804
2805 dev->deadbeaf = 1;
2806 dp = &dev->next;
2807 } else {
2808 dp = &dev->next;
2809 dev->ifindex = dev_new_index();
2810 if (dev->iflink == -1)
2811 dev->iflink = dev->ifindex;
2812 if (dev->rebuild_header == NULL)
2813 dev->rebuild_header = default_rebuild_header;
2814 dev_init_scheduler(dev);
2815 set_bit(__LINK_STATE_PRESENT, &dev->state);
2816 }
2817 }
2818
2819
2820
2821
2822 dp = &dev_base;
2823 while ((dev = *dp) != NULL) {
2824 if (dev->deadbeaf) {
2825 write_lock_bh(&dev_base_lock);
2826 *dp = dev->next;
2827 write_unlock_bh(&dev_base_lock);
2828 dev_put(dev);
2829 } else {
2830 dp = &dev->next;
2831 }
2832 }
2833
2834#ifdef CONFIG_PROC_FS
2835 proc_net_create("dev", 0, dev_get_info);
2836 create_proc_read_entry("net/softnet_stat", 0, 0, dev_proc_stats, NULL);
2837 proc_net_drivers = proc_mkdir("net/drivers", 0);
2838#ifdef WIRELESS_EXT
2839
2840 proc_net_create("wireless", 0, dev_get_wireless_info);
2841#endif
2842#endif
2843
2844 dev_boot_phase = 0;
2845
2846 open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
2847 open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
2848
2849 dst_init();
2850 dev_mcast_init();
2851
2852#ifdef CONFIG_NET_SCHED
2853 pktsched_init();
2854#endif
2855
2856
2857
2858
2859 net_device_init();
2860
2861 return 0;
2862}
2863
2864#ifdef CONFIG_HOTPLUG
2865
2866
2867
2868
2869
2870
2871static int net_run_sbin_hotplug(struct net_device *dev, char *action)
2872{
2873 char *argv[3], *envp[5], ifname[12 + IFNAMSIZ], action_str[32];
2874 int i;
2875
2876 sprintf(ifname, "INTERFACE=%s", dev->name);
2877 sprintf(action_str, "ACTION=%s", action);
2878
2879 i = 0;
2880 argv[i++] = hotplug_path;
2881 argv[i++] = "net";
2882 argv[i] = 0;
2883
2884 i = 0;
2885
2886 envp [i++] = "HOME=/";
2887 envp [i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
2888 envp [i++] = ifname;
2889 envp [i++] = action_str;
2890 envp [i] = 0;
2891
2892 return call_usermodehelper(argv [0], argv, envp);
2893}
2894#endif
2895