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