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
869
870
871
872
873
874
875
876int dev_open(struct net_device *dev)
877{
878 int ret = 0;
879
880
881
882
883
884 if (dev->flags & IFF_UP)
885 return 0;
886
887
888
889
890 if (!netif_device_present(dev))
891 return -ENODEV;
892
893
894
895
896 set_bit(__LINK_STATE_START, &dev->state);
897 if (dev->open) {
898 ret = dev->open(dev);
899 if (ret)
900 clear_bit(__LINK_STATE_START, &dev->state);
901 }
902
903
904
905
906
907 if (!ret) {
908
909
910
911 dev->flags |= IFF_UP;
912
913
914
915
916 dev_mc_upload(dev);
917
918
919
920
921 dev_activate(dev);
922
923
924
925
926 notifier_call_chain(&netdev_chain, NETDEV_UP, dev);
927 }
928 return ret;
929}
930
931
932
933
934
935
936
937
938
939
940int dev_close(struct net_device *dev)
941{
942 if (!(dev->flags & IFF_UP))
943 return 0;
944
945
946
947
948
949 notifier_call_chain(&netdev_chain, NETDEV_GOING_DOWN, dev);
950
951 dev_deactivate(dev);
952
953 clear_bit(__LINK_STATE_START, &dev->state);
954
955
956
957
958
959
960
961 smp_mb__after_clear_bit();
962 while (test_bit(__LINK_STATE_RX_SCHED, &dev->state)) {
963
964 current->state = TASK_INTERRUPTIBLE;
965 schedule_timeout(1);
966 }
967
968
969
970
971
972
973
974
975 if (dev->stop)
976 dev->stop(dev);
977
978
979
980
981
982 dev->flags &= ~IFF_UP;
983
984
985
986
987 notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev);
988
989 return 0;
990}
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012int register_netdevice_notifier(struct notifier_block *nb)
1013{
1014 struct net_device *dev;
1015 int err;
1016
1017 rtnl_lock();
1018 err = notifier_chain_register(&netdev_chain, nb);
1019 if (!err) {
1020 for (dev = dev_base; dev; dev = dev->next) {
1021 nb->notifier_call(nb, NETDEV_REGISTER, dev);
1022
1023 if (dev->flags & IFF_UP)
1024 nb->notifier_call(nb, NETDEV_UP, dev);
1025 }
1026 }
1027 rtnl_unlock();
1028 return err;
1029}
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041int unregister_netdevice_notifier(struct notifier_block *nb)
1042{
1043 return notifier_chain_unregister(&netdev_chain, nb);
1044}
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055int call_netdevice_notifiers(unsigned long val, void *v)
1056{
1057 return notifier_call_chain(&netdev_chain, val, v);
1058}
1059
1060
1061
1062
1063
1064
1065void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
1066{
1067 struct packet_type *ptype;
1068 net_timestamp(&skb->stamp);
1069
1070 rcu_read_lock();
1071 list_for_each_entry_rcu(ptype, &ptype_all, list) {
1072
1073
1074
1075 if ((ptype->dev == dev || !ptype->dev) &&
1076 (ptype->af_packet_priv == NULL ||
1077 (struct sock *)ptype->af_packet_priv != skb->sk)) {
1078 struct sk_buff *skb2= skb_clone(skb, GFP_ATOMIC);
1079 if (!skb2)
1080 break;
1081
1082
1083
1084
1085
1086 skb2->mac.raw = skb2->data;
1087
1088 if (skb2->nh.raw < skb2->data ||
1089 skb2->nh.raw > skb2->tail) {
1090 if (net_ratelimit())
1091 printk(KERN_CRIT "protocol %04x is "
1092 "buggy, dev %s\n",
1093 skb2->protocol, dev->name);
1094 skb2->nh.raw = skb2->data;
1095 }
1096
1097 skb2->h.raw = skb2->nh.raw;
1098 skb2->pkt_type = PACKET_OUTGOING;
1099 ptype->func(skb2, skb->dev, ptype);
1100 }
1101 }
1102 rcu_read_unlock();
1103}
1104
1105
1106
1107
1108
1109int skb_checksum_help(struct sk_buff **pskb, int inward)
1110{
1111 unsigned int csum;
1112 int ret = 0, offset = (*pskb)->h.raw - (*pskb)->data;
1113
1114 if (inward) {
1115 (*pskb)->ip_summed = CHECKSUM_NONE;
1116 goto out;
1117 }
1118
1119 if (skb_cloned(*pskb)) {
1120 ret = pskb_expand_head(*pskb, 0, 0, GFP_ATOMIC);
1121 if (ret)
1122 goto out;
1123 }
1124
1125 if (offset > (int)(*pskb)->len)
1126 BUG();
1127 csum = skb_checksum(*pskb, offset, (*pskb)->len-offset, 0);
1128
1129 offset = (*pskb)->tail - (*pskb)->h.raw;
1130 if (offset <= 0)
1131 BUG();
1132 if ((*pskb)->csum + 2 > offset)
1133 BUG();
1134
1135 *(u16*)((*pskb)->h.raw + (*pskb)->csum) = csum_fold(csum);
1136 (*pskb)->ip_summed = CHECKSUM_NONE;
1137out:
1138 return ret;
1139}
1140
1141#ifdef CONFIG_HIGHMEM
1142
1143
1144
1145
1146
1147static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
1148{
1149 int i;
1150
1151 if (dev->features & NETIF_F_HIGHDMA)
1152 return 0;
1153
1154 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
1155 if (skb_shinfo(skb)->frags[i].page >= highmem_start_page)
1156 return 1;
1157
1158 return 0;
1159}
1160#else
1161#define illegal_highdma(dev, skb) (0)
1162#endif
1163
1164extern void skb_release_data(struct sk_buff *);
1165
1166
1167int __skb_linearize(struct sk_buff *skb, int gfp_mask)
1168{
1169 unsigned int size;
1170 u8 *data;
1171 long offset;
1172 struct skb_shared_info *ninfo;
1173 int headerlen = skb->data - skb->head;
1174 int expand = (skb->tail + skb->data_len) - skb->end;
1175
1176 if (skb_shared(skb))
1177 BUG();
1178
1179 if (expand <= 0)
1180 expand = 0;
1181
1182 size = skb->end - skb->head + expand;
1183 size = SKB_DATA_ALIGN(size);
1184 data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
1185 if (!data)
1186 return -ENOMEM;
1187
1188
1189 if (skb_copy_bits(skb, -headerlen, data, headerlen + skb->len))
1190 BUG();
1191
1192
1193 ninfo = (struct skb_shared_info*)(data + size);
1194 atomic_set(&ninfo->dataref, 1);
1195 ninfo->tso_size = skb_shinfo(skb)->tso_size;
1196 ninfo->tso_segs = skb_shinfo(skb)->tso_segs;
1197 ninfo->nr_frags = 0;
1198 ninfo->frag_list = NULL;
1199
1200
1201 offset = data - skb->head;
1202
1203
1204 skb_release_data(skb);
1205
1206 skb->head = data;
1207 skb->end = data + size;
1208
1209
1210 skb->h.raw += offset;
1211 skb->nh.raw += offset;
1212 skb->mac.raw += offset;
1213 skb->tail += offset;
1214 skb->data += offset;
1215
1216
1217 skb->cloned = 0;
1218
1219 skb->tail += skb->data_len;
1220 skb->data_len = 0;
1221 return 0;
1222}
1223
1224#define HARD_TX_LOCK(dev, cpu) { \
1225 if ((dev->features & NETIF_F_LLTX) == 0) { \
1226 spin_lock(&dev->xmit_lock); \
1227 dev->xmit_lock_owner = cpu; \
1228 } \
1229}
1230
1231#define HARD_TX_UNLOCK(dev) { \
1232 if ((dev->features & NETIF_F_LLTX) == 0) { \
1233 dev->xmit_lock_owner = -1; \
1234 spin_unlock(&dev->xmit_lock); \
1235 } \
1236}
1237
1238static inline void qdisc_run(struct net_device *dev)
1239{
1240 while (!netif_queue_stopped(dev) &&
1241 qdisc_restart(dev)<0)
1242 ;
1243}
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258int dev_queue_xmit(struct sk_buff *skb)
1259{
1260 struct net_device *dev = skb->dev;
1261 struct Qdisc *q;
1262 int rc = -ENOMEM;
1263
1264 if (skb_shinfo(skb)->frag_list &&
1265 !(dev->features & NETIF_F_FRAGLIST) &&
1266 __skb_linearize(skb, GFP_ATOMIC))
1267 goto out_kfree_skb;
1268
1269
1270
1271
1272
1273 if (skb_shinfo(skb)->nr_frags &&
1274 (!(dev->features & NETIF_F_SG) || illegal_highdma(dev, skb)) &&
1275 __skb_linearize(skb, GFP_ATOMIC))
1276 goto out_kfree_skb;
1277
1278
1279
1280
1281 if (skb->ip_summed == CHECKSUM_HW &&
1282 (!(dev->features & (NETIF_F_HW_CSUM | NETIF_F_NO_CSUM)) &&
1283 (!(dev->features & NETIF_F_IP_CSUM) ||
1284 skb->protocol != htons(ETH_P_IP))))
1285 if (skb_checksum_help(&skb, 0))
1286 goto out_kfree_skb;
1287
1288
1289
1290
1291
1292 local_bh_disable();
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306 q = rcu_dereference(dev->qdisc);
1307#ifdef CONFIG_NET_CLS_ACT
1308 skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_EGRESS);
1309#endif
1310 if (q->enqueue) {
1311
1312 spin_lock(&dev->queue_lock);
1313
1314 rc = q->enqueue(skb, q);
1315
1316 qdisc_run(dev);
1317
1318 spin_unlock(&dev->queue_lock);
1319 rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc;
1320 goto out;
1321 }
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335 if (dev->flags & IFF_UP) {
1336 int cpu = smp_processor_id();
1337
1338 if (dev->xmit_lock_owner != cpu) {
1339
1340 HARD_TX_LOCK(dev, cpu);
1341
1342 if (!netif_queue_stopped(dev)) {
1343 if (netdev_nit)
1344 dev_queue_xmit_nit(skb, dev);
1345
1346 rc = 0;
1347 if (!dev->hard_start_xmit(skb, dev)) {
1348 HARD_TX_UNLOCK(dev);
1349 goto out;
1350 }
1351 }
1352 HARD_TX_UNLOCK(dev);
1353 if (net_ratelimit())
1354 printk(KERN_CRIT "Virtual device %s asks to "
1355 "queue packet!\n", dev->name);
1356 goto out_enetdown;
1357 } else {
1358
1359
1360 if (net_ratelimit())
1361 printk(KERN_CRIT "Dead loop on virtual device "
1362 "%s, fix it urgently!\n", dev->name);
1363 }
1364 }
1365out_enetdown:
1366 rc = -ENETDOWN;
1367out_kfree_skb:
1368 kfree_skb(skb);
1369out:
1370 local_bh_enable();
1371 return rc;
1372}
1373
1374
1375
1376
1377
1378
1379int netdev_max_backlog = 300;
1380int weight_p = 64;
1381
1382
1383
1384
1385int no_cong_thresh = 10;
1386int no_cong = 20;
1387int lo_cong = 100;
1388int mod_cong = 290;
1389
1390DEFINE_PER_CPU(struct netif_rx_stats, netdev_rx_stat) = { 0, };
1391
1392
1393#ifdef CONFIG_NET_HW_FLOWCONTROL
1394atomic_t netdev_dropping = ATOMIC_INIT(0);
1395static unsigned long netdev_fc_mask = 1;
1396unsigned long netdev_fc_xoff;
1397spinlock_t netdev_fc_lock = SPIN_LOCK_UNLOCKED;
1398
1399static struct
1400{
1401 void (*stimul)(struct net_device *);
1402 struct net_device *dev;
1403} netdev_fc_slots[BITS_PER_LONG];
1404
1405int netdev_register_fc(struct net_device *dev,
1406 void (*stimul)(struct net_device *dev))
1407{
1408 int bit = 0;
1409 unsigned long flags;
1410
1411 spin_lock_irqsave(&netdev_fc_lock, flags);
1412 if (netdev_fc_mask != ~0UL) {
1413 bit = ffz(netdev_fc_mask);
1414 netdev_fc_slots[bit].stimul = stimul;
1415 netdev_fc_slots[bit].dev = dev;
1416 set_bit(bit, &netdev_fc_mask);
1417 clear_bit(bit, &netdev_fc_xoff);
1418 }
1419 spin_unlock_irqrestore(&netdev_fc_lock, flags);
1420 return bit;
1421}
1422
1423void netdev_unregister_fc(int bit)
1424{
1425 unsigned long flags;
1426
1427 spin_lock_irqsave(&netdev_fc_lock, flags);
1428 if (bit > 0) {
1429 netdev_fc_slots[bit].stimul = NULL;
1430 netdev_fc_slots[bit].dev = NULL;
1431 clear_bit(bit, &netdev_fc_mask);
1432 clear_bit(bit, &netdev_fc_xoff);
1433 }
1434 spin_unlock_irqrestore(&netdev_fc_lock, flags);
1435}
1436
1437static void netdev_wakeup(void)
1438{
1439 unsigned long xoff;
1440
1441 spin_lock(&netdev_fc_lock);
1442 xoff = netdev_fc_xoff;
1443 netdev_fc_xoff = 0;
1444 while (xoff) {
1445 int i = ffz(~xoff);
1446 xoff &= ~(1 << i);
1447 netdev_fc_slots[i].stimul(netdev_fc_slots[i].dev);
1448 }
1449 spin_unlock(&netdev_fc_lock);
1450}
1451#endif
1452
1453static void get_sample_stats(int cpu)
1454{
1455#ifdef RAND_LIE
1456 unsigned long rd;
1457 int rq;
1458#endif
1459 struct softnet_data *sd = &per_cpu(softnet_data, cpu);
1460 int blog = sd->input_pkt_queue.qlen;
1461 int avg_blog = sd->avg_blog;
1462
1463 avg_blog = (avg_blog >> 1) + (blog >> 1);
1464
1465 if (avg_blog > mod_cong) {
1466
1467 sd->cng_level = NET_RX_CN_HIGH;
1468#ifdef RAND_LIE
1469 rd = net_random();
1470 rq = rd % netdev_max_backlog;
1471 if (rq < avg_blog)
1472 sd->cng_level = NET_RX_DROP;
1473#endif
1474 } else if (avg_blog > lo_cong) {
1475 sd->cng_level = NET_RX_CN_MOD;
1476#ifdef RAND_LIE
1477 rd = net_random();
1478 rq = rd % netdev_max_backlog;
1479 if (rq < avg_blog)
1480 sd->cng_level = NET_RX_CN_HIGH;
1481#endif
1482 } else if (avg_blog > no_cong)
1483 sd->cng_level = NET_RX_CN_LOW;
1484 else
1485 sd->cng_level = NET_RX_SUCCESS;
1486
1487 sd->avg_blog = avg_blog;
1488}
1489
1490#ifdef OFFLINE_SAMPLE
1491static void sample_queue(unsigned long dummy)
1492{
1493
1494 int next_tick = 1;
1495 int cpu = smp_processor_id();
1496
1497 get_sample_stats(cpu);
1498 next_tick += jiffies;
1499 mod_timer(&samp_timer, next_tick);
1500}
1501#endif
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522int netif_rx(struct sk_buff *skb)
1523{
1524 int this_cpu;
1525 struct softnet_data *queue;
1526 unsigned long flags;
1527
1528#ifdef CONFIG_NETPOLL
1529 if (skb->dev->netpoll_rx && netpoll_rx(skb)) {
1530 kfree_skb(skb);
1531 return NET_RX_DROP;
1532 }
1533#endif
1534
1535 if (!skb->stamp.tv_sec)
1536 net_timestamp(&skb->stamp);
1537
1538
1539
1540
1541
1542 local_irq_save(flags);
1543 this_cpu = smp_processor_id();
1544 queue = &__get_cpu_var(softnet_data);
1545
1546 __get_cpu_var(netdev_rx_stat).total++;
1547 if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
1548 if (queue->input_pkt_queue.qlen) {
1549 if (queue->throttle)
1550 goto drop;
1551
1552enqueue:
1553 dev_hold(skb->dev);
1554 __skb_queue_tail(&queue->input_pkt_queue, skb);
1555#ifndef OFFLINE_SAMPLE
1556 get_sample_stats(this_cpu);
1557#endif
1558 local_irq_restore(flags);
1559 return queue->cng_level;
1560 }
1561
1562 if (queue->throttle) {
1563 queue->throttle = 0;
1564#ifdef CONFIG_NET_HW_FLOWCONTROL
1565 if (atomic_dec_and_test(&netdev_dropping))
1566 netdev_wakeup();
1567#endif
1568 }
1569
1570 netif_rx_schedule(&queue->backlog_dev);
1571 goto enqueue;
1572 }
1573
1574 if (!queue->throttle) {
1575 queue->throttle = 1;
1576 __get_cpu_var(netdev_rx_stat).throttled++;
1577#ifdef CONFIG_NET_HW_FLOWCONTROL
1578 atomic_inc(&netdev_dropping);
1579#endif
1580 }
1581
1582drop:
1583 __get_cpu_var(netdev_rx_stat).dropped++;
1584 local_irq_restore(flags);
1585
1586 kfree_skb(skb);
1587 return NET_RX_DROP;
1588}
1589
1590static __inline__ void skb_bond(struct sk_buff *skb)
1591{
1592 struct net_device *dev = skb->dev;
1593
1594 if (dev->master) {
1595 skb->real_dev = skb->dev;
1596 skb->dev = dev->master;
1597 }
1598}
1599
1600static void net_tx_action(struct softirq_action *h)
1601{
1602 struct softnet_data *sd = &__get_cpu_var(softnet_data);
1603
1604 if (sd->completion_queue) {
1605 struct sk_buff *clist;
1606
1607 local_irq_disable();
1608 clist = sd->completion_queue;
1609 sd->completion_queue = NULL;
1610 local_irq_enable();
1611
1612 while (clist) {
1613 struct sk_buff *skb = clist;
1614 clist = clist->next;
1615
1616 BUG_TRAP(!atomic_read(&skb->users));
1617 __kfree_skb(skb);
1618 }
1619 }
1620
1621 if (sd->output_queue) {
1622 struct net_device *head;
1623
1624 local_irq_disable();
1625 head = sd->output_queue;
1626 sd->output_queue = NULL;
1627 local_irq_enable();
1628
1629 while (head) {
1630 struct net_device *dev = head;
1631 head = head->next_sched;
1632
1633 smp_mb__before_clear_bit();
1634 clear_bit(__LINK_STATE_SCHED, &dev->state);
1635
1636 if (spin_trylock(&dev->queue_lock)) {
1637 qdisc_run(dev);
1638 spin_unlock(&dev->queue_lock);
1639 } else {
1640 netif_schedule(dev);
1641 }
1642 }
1643 }
1644}
1645
1646static __inline__ int deliver_skb(struct sk_buff *skb,
1647 struct packet_type *pt_prev)
1648{
1649 atomic_inc(&skb->users);
1650 return pt_prev->func(skb, skb->dev, pt_prev);
1651}
1652
1653#if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE)
1654int (*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff **pskb);
1655
1656static __inline__ int handle_bridge(struct sk_buff **pskb,
1657 struct packet_type **pt_prev, int *ret)
1658{
1659 struct net_bridge_port *port;
1660
1661 if ((*pskb)->pkt_type == PACKET_LOOPBACK ||
1662 (port = rcu_dereference((*pskb)->dev->br_port)) == NULL)
1663 return 0;
1664
1665 if (*pt_prev) {
1666 *ret = deliver_skb(*pskb, *pt_prev);
1667 *pt_prev = NULL;
1668 }
1669
1670 return br_handle_frame_hook(port, pskb);
1671}
1672#else
1673#define handle_bridge(skb, pt_prev, ret) (0)
1674#endif
1675
1676#ifdef CONFIG_NET_CLS_ACT
1677
1678
1679
1680
1681
1682
1683
1684
1685int ing_filter(struct sk_buff *skb)
1686{
1687 struct Qdisc *q;
1688 struct net_device *dev = skb->dev;
1689 int result = TC_ACT_OK;
1690
1691 if (dev->qdisc_ingress) {
1692 __u32 ttl = (__u32) G_TC_RTTL(skb->tc_verd);
1693 if (MAX_RED_LOOP < ttl++) {
1694 printk("Redir loop detected Dropping packet (%s->%s)\n",
1695 skb->input_dev?skb->input_dev->name:"??",skb->dev->name);
1696 return TC_ACT_SHOT;
1697 }
1698
1699 skb->tc_verd = SET_TC_RTTL(skb->tc_verd,ttl);
1700
1701 skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_INGRESS);
1702 if (NULL == skb->input_dev) {
1703 skb->input_dev = skb->dev;
1704 printk("ing_filter: fixed %s out %s\n",skb->input_dev->name,skb->dev->name);
1705 }
1706 spin_lock(&dev->ingress_lock);
1707 if ((q = dev->qdisc_ingress) != NULL)
1708 result = q->enqueue(skb, q);
1709 spin_unlock(&dev->ingress_lock);
1710
1711 }
1712
1713 return result;
1714}
1715#endif
1716
1717int netif_receive_skb(struct sk_buff *skb)
1718{
1719 struct packet_type *ptype, *pt_prev;
1720 int ret = NET_RX_DROP;
1721 unsigned short type;
1722
1723#ifdef CONFIG_NETPOLL
1724 if (skb->dev->netpoll_rx && skb->dev->poll && netpoll_rx(skb)) {
1725 kfree_skb(skb);
1726 return NET_RX_DROP;
1727 }
1728#endif
1729
1730 if (!skb->stamp.tv_sec)
1731 net_timestamp(&skb->stamp);
1732
1733 skb_bond(skb);
1734
1735 __get_cpu_var(netdev_rx_stat).total++;
1736
1737 skb->h.raw = skb->nh.raw = skb->data;
1738 skb->mac_len = skb->nh.raw - skb->mac.raw;
1739
1740 pt_prev = NULL;
1741
1742 rcu_read_lock();
1743
1744#ifdef CONFIG_NET_CLS_ACT
1745 if (skb->tc_verd & TC_NCLS) {
1746 skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
1747 goto ncls;
1748 }
1749#endif
1750
1751 list_for_each_entry_rcu(ptype, &ptype_all, list) {
1752 if (!ptype->dev || ptype->dev == skb->dev) {
1753 if (pt_prev)
1754 ret = deliver_skb(skb, pt_prev);
1755 pt_prev = ptype;
1756 }
1757 }
1758
1759#ifdef CONFIG_NET_CLS_ACT
1760 if (pt_prev) {
1761 ret = deliver_skb(skb, pt_prev);
1762 pt_prev = NULL;
1763 } else {
1764 skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd);
1765 }
1766
1767 ret = ing_filter(skb);
1768
1769 if (ret == TC_ACT_SHOT || (ret == TC_ACT_STOLEN)) {
1770 kfree_skb(skb);
1771 goto out;
1772 }
1773
1774 skb->tc_verd = 0;
1775ncls:
1776#endif
1777
1778 handle_diverter(skb);
1779
1780 if (handle_bridge(&skb, &pt_prev, &ret))
1781 goto out;
1782
1783 type = skb->protocol;
1784 list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
1785 if (ptype->type == type &&
1786 (!ptype->dev || ptype->dev == skb->dev)) {
1787 if (pt_prev)
1788 ret = deliver_skb(skb, pt_prev);
1789 pt_prev = ptype;
1790 }
1791 }
1792
1793 if (pt_prev) {
1794 ret = pt_prev->func(skb, skb->dev, pt_prev);
1795 } else {
1796 kfree_skb(skb);
1797
1798
1799
1800 ret = NET_RX_DROP;
1801 }
1802
1803out:
1804 rcu_read_unlock();
1805 return ret;
1806}
1807
1808static int process_backlog(struct net_device *backlog_dev, int *budget)
1809{
1810 int work = 0;
1811 int quota = min(backlog_dev->quota, *budget);
1812 struct softnet_data *queue = &__get_cpu_var(softnet_data);
1813 unsigned long start_time = jiffies;
1814
1815 for (;;) {
1816 struct sk_buff *skb;
1817 struct net_device *dev;
1818
1819 local_irq_disable();
1820 skb = __skb_dequeue(&queue->input_pkt_queue);
1821 if (!skb)
1822 goto job_done;
1823 local_irq_enable();
1824
1825 dev = skb->dev;
1826
1827 netif_receive_skb(skb);
1828
1829 dev_put(dev);
1830
1831 work++;
1832
1833 if (work >= quota || jiffies - start_time > 1)
1834 break;
1835
1836#ifdef CONFIG_NET_HW_FLOWCONTROL
1837 if (queue->throttle &&
1838 queue->input_pkt_queue.qlen < no_cong_thresh ) {
1839 queue->throttle = 0;
1840 if (atomic_dec_and_test(&netdev_dropping)) {
1841 netdev_wakeup();
1842 break;
1843 }
1844 }
1845#endif
1846 }
1847
1848 backlog_dev->quota -= work;
1849 *budget -= work;
1850 return -1;
1851
1852job_done:
1853 backlog_dev->quota -= work;
1854 *budget -= work;
1855
1856 list_del(&backlog_dev->poll_list);
1857 smp_mb__before_clear_bit();
1858 netif_poll_enable(backlog_dev);
1859
1860 if (queue->throttle) {
1861 queue->throttle = 0;
1862#ifdef CONFIG_NET_HW_FLOWCONTROL
1863 if (atomic_dec_and_test(&netdev_dropping))
1864 netdev_wakeup();
1865#endif
1866 }
1867 local_irq_enable();
1868 return 0;
1869}
1870
1871static void net_rx_action(struct softirq_action *h)
1872{
1873 struct softnet_data *queue = &__get_cpu_var(softnet_data);
1874 unsigned long start_time = jiffies;
1875 int budget = netdev_max_backlog;
1876
1877
1878 local_irq_disable();
1879
1880 while (!list_empty(&queue->poll_list)) {
1881 struct net_device *dev;
1882
1883 if (budget <= 0 || jiffies - start_time > 1)
1884 goto softnet_break;
1885
1886 local_irq_enable();
1887
1888 dev = list_entry(queue->poll_list.next,
1889 struct net_device, poll_list);
1890
1891 if (dev->quota <= 0 || dev->poll(dev, &budget)) {
1892 local_irq_disable();
1893 list_del(&dev->poll_list);
1894 list_add_tail(&dev->poll_list, &queue->poll_list);
1895 if (dev->quota < 0)
1896 dev->quota += dev->weight;
1897 else
1898 dev->quota = dev->weight;
1899 } else {
1900 dev_put(dev);
1901 local_irq_disable();
1902 }
1903 }
1904out:
1905 local_irq_enable();
1906 return;
1907
1908softnet_break:
1909 __get_cpu_var(netdev_rx_stat).time_squeeze++;
1910 __raise_softirq_irqoff(NET_RX_SOFTIRQ);
1911 goto out;
1912}
1913
1914static gifconf_func_t * gifconf_list [NPROTO];
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925int register_gifconf(unsigned int family, gifconf_func_t * gifconf)
1926{
1927 if (family >= NPROTO)
1928 return -EINVAL;
1929 gifconf_list[family] = gifconf;
1930 return 0;
1931}
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945static int dev_ifname(struct ifreq __user *arg)
1946{
1947 struct net_device *dev;
1948 struct ifreq ifr;
1949
1950
1951
1952
1953
1954 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
1955 return -EFAULT;
1956
1957 read_lock(&dev_base_lock);
1958 dev = __dev_get_by_index(ifr.ifr_ifindex);
1959 if (!dev) {
1960 read_unlock(&dev_base_lock);
1961 return -ENODEV;
1962 }
1963
1964 strcpy(ifr.ifr_name, dev->name);
1965 read_unlock(&dev_base_lock);
1966
1967 if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
1968 return -EFAULT;
1969 return 0;
1970}
1971
1972
1973
1974
1975
1976
1977
1978static int dev_ifconf(char __user *arg)
1979{
1980 struct ifconf ifc;
1981 struct net_device *dev;
1982 char __user *pos;
1983 int len;
1984 int total;
1985 int i;
1986
1987
1988
1989
1990
1991 if (copy_from_user(&ifc, arg, sizeof(struct ifconf)))
1992 return -EFAULT;
1993
1994 pos = ifc.ifc_buf;
1995 len = ifc.ifc_len;
1996
1997
1998
1999
2000
2001 total = 0;
2002 for (dev = dev_base; dev; dev = dev->next) {
2003 for (i = 0; i < NPROTO; i++) {
2004 if (gifconf_list[i]) {
2005 int done;
2006 if (!pos)
2007 done = gifconf_list[i](dev, NULL, 0);
2008 else
2009 done = gifconf_list[i](dev, pos + total,
2010 len - total);
2011 if (done < 0)
2012 return -EFAULT;
2013 total += done;
2014 }
2015 }
2016 }
2017
2018
2019
2020
2021 ifc.ifc_len = total;
2022
2023
2024
2025
2026 return copy_to_user(arg, &ifc, sizeof(struct ifconf)) ? -EFAULT : 0;
2027}
2028
2029#ifdef CONFIG_PROC_FS
2030
2031
2032
2033
2034static __inline__ struct net_device *dev_get_idx(loff_t pos)
2035{
2036 struct net_device *dev;
2037 loff_t i;
2038
2039 for (i = 0, dev = dev_base; dev && i < pos; ++i, dev = dev->next);
2040
2041 return i == pos ? dev : NULL;
2042}
2043
2044void *dev_seq_start(struct seq_file *seq, loff_t *pos)
2045{
2046 read_lock(&dev_base_lock);
2047 return *pos ? dev_get_idx(*pos - 1) : SEQ_START_TOKEN;
2048}
2049
2050void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2051{
2052 ++*pos;
2053 return v == SEQ_START_TOKEN ? dev_base : ((struct net_device *)v)->next;
2054}
2055
2056void dev_seq_stop(struct seq_file *seq, void *v)
2057{
2058 read_unlock(&dev_base_lock);
2059}
2060
2061static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
2062{
2063 if (dev->get_stats) {
2064 struct net_device_stats *stats = dev->get_stats(dev);
2065
2066 seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu "
2067 "%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n",
2068 dev->name, stats->rx_bytes, stats->rx_packets,
2069 stats->rx_errors,
2070 stats->rx_dropped + stats->rx_missed_errors,
2071 stats->rx_fifo_errors,
2072 stats->rx_length_errors + stats->rx_over_errors +
2073 stats->rx_crc_errors + stats->rx_frame_errors,
2074 stats->rx_compressed, stats->multicast,
2075 stats->tx_bytes, stats->tx_packets,
2076 stats->tx_errors, stats->tx_dropped,
2077 stats->tx_fifo_errors, stats->collisions,
2078 stats->tx_carrier_errors +
2079 stats->tx_aborted_errors +
2080 stats->tx_window_errors +
2081 stats->tx_heartbeat_errors,
2082 stats->tx_compressed);
2083 } else
2084 seq_printf(seq, "%6s: No statistics available.\n", dev->name);
2085}
2086
2087
2088
2089
2090
2091static int dev_seq_show(struct seq_file *seq, void *v)
2092{
2093 if (v == SEQ_START_TOKEN)
2094 seq_puts(seq, "Inter-| Receive "
2095 " | Transmit\n"
2096 " face |bytes packets errs drop fifo frame "
2097 "compressed multicast|bytes packets errs "
2098 "drop fifo colls carrier compressed\n");
2099 else
2100 dev_seq_printf_stats(seq, v);
2101 return 0;
2102}
2103
2104static struct netif_rx_stats *softnet_get_online(loff_t *pos)
2105{
2106 struct netif_rx_stats *rc = NULL;
2107
2108 while (*pos < NR_CPUS)
2109 if (cpu_online(*pos)) {
2110 rc = &per_cpu(netdev_rx_stat, *pos);
2111 break;
2112 } else
2113 ++*pos;
2114 return rc;
2115}
2116
2117static void *softnet_seq_start(struct seq_file *seq, loff_t *pos)
2118{
2119 return softnet_get_online(pos);
2120}
2121
2122static void *softnet_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2123{
2124 ++*pos;
2125 return softnet_get_online(pos);
2126}
2127
2128static void softnet_seq_stop(struct seq_file *seq, void *v)
2129{
2130}
2131
2132static int softnet_seq_show(struct seq_file *seq, void *v)
2133{
2134 struct netif_rx_stats *s = v;
2135
2136 seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
2137 s->total, s->dropped, s->time_squeeze, s->throttled,
2138 s->fastroute_hit, s->fastroute_success, s->fastroute_defer,
2139 s->fastroute_deferred_out,
2140#if 0
2141 s->fastroute_latency_reduction
2142#else
2143 s->cpu_collision
2144#endif
2145 );
2146 return 0;
2147}
2148
2149static struct seq_operations dev_seq_ops = {
2150 .start = dev_seq_start,
2151 .next = dev_seq_next,
2152 .stop = dev_seq_stop,
2153 .show = dev_seq_show,
2154};
2155
2156static int dev_seq_open(struct inode *inode, struct file *file)
2157{
2158 return seq_open(file, &dev_seq_ops);
2159}
2160
2161static struct file_operations dev_seq_fops = {
2162 .owner = THIS_MODULE,
2163 .open = dev_seq_open,
2164 .read = seq_read,
2165 .llseek = seq_lseek,
2166 .release = seq_release,
2167};
2168
2169static struct seq_operations softnet_seq_ops = {
2170 .start = softnet_seq_start,
2171 .next = softnet_seq_next,
2172 .stop = softnet_seq_stop,
2173 .show = softnet_seq_show,
2174};
2175
2176static int softnet_seq_open(struct inode *inode, struct file *file)
2177{
2178 return seq_open(file, &softnet_seq_ops);
2179}
2180
2181static struct file_operations softnet_seq_fops = {
2182 .owner = THIS_MODULE,
2183 .open = softnet_seq_open,
2184 .read = seq_read,
2185 .llseek = seq_lseek,
2186 .release = seq_release,
2187};
2188
2189#ifdef WIRELESS_EXT
2190extern int wireless_proc_init(void);
2191#else
2192#define wireless_proc_init() 0
2193#endif
2194
2195static int __init dev_proc_init(void)
2196{
2197 int rc = -ENOMEM;
2198
2199 if (!proc_net_fops_create("dev", S_IRUGO, &dev_seq_fops))
2200 goto out;
2201 if (!proc_net_fops_create("softnet_stat", S_IRUGO, &softnet_seq_fops))
2202 goto out_dev;
2203 if (wireless_proc_init())
2204 goto out_softnet;
2205 rc = 0;
2206out:
2207 return rc;
2208out_softnet:
2209 proc_net_remove("softnet_stat");
2210out_dev:
2211 proc_net_remove("dev");
2212 goto out;
2213}
2214#else
2215#define dev_proc_init() 0
2216#endif
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230int netdev_set_master(struct net_device *slave, struct net_device *master)
2231{
2232 struct net_device *old = slave->master;
2233
2234 ASSERT_RTNL();
2235
2236 if (master) {
2237 if (old)
2238 return -EBUSY;
2239 dev_hold(master);
2240 }
2241
2242 slave->master = master;
2243
2244 synchronize_net();
2245
2246 if (old)
2247 dev_put(old);
2248
2249 if (master)
2250 slave->flags |= IFF_SLAVE;
2251 else
2252 slave->flags &= ~IFF_SLAVE;
2253
2254 rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE);
2255 return 0;
2256}
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268void dev_set_promiscuity(struct net_device *dev, int inc)
2269{
2270 unsigned short old_flags = dev->flags;
2271
2272 dev->flags |= IFF_PROMISC;
2273 if ((dev->promiscuity += inc) == 0)
2274 dev->flags &= ~IFF_PROMISC;
2275 if (dev->flags ^ old_flags) {
2276 dev_mc_upload(dev);
2277 printk(KERN_INFO "device %s %s promiscuous mode\n",
2278 dev->name, (dev->flags & IFF_PROMISC) ? "entered" :
2279 "left");
2280 }
2281}
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295void dev_set_allmulti(struct net_device *dev, int inc)
2296{
2297 unsigned short old_flags = dev->flags;
2298
2299 dev->flags |= IFF_ALLMULTI;
2300 if ((dev->allmulti += inc) == 0)
2301 dev->flags &= ~IFF_ALLMULTI;
2302 if (dev->flags ^ old_flags)
2303 dev_mc_upload(dev);
2304}
2305
2306unsigned dev_get_flags(const struct net_device *dev)
2307{
2308 unsigned flags;
2309
2310 flags = (dev->flags & ~(IFF_PROMISC |
2311 IFF_ALLMULTI |
2312 IFF_RUNNING)) |
2313 (dev->gflags & (IFF_PROMISC |
2314 IFF_ALLMULTI));
2315
2316 if (netif_running(dev) && netif_carrier_ok(dev))
2317 flags |= IFF_RUNNING;
2318
2319 return flags;
2320}
2321
2322int dev_change_flags(struct net_device *dev, unsigned flags)
2323{
2324 int ret;
2325 int old_flags = dev->flags;
2326
2327
2328
2329
2330
2331 dev->flags = (flags & (IFF_DEBUG | IFF_NOTRAILERS | IFF_NOARP |
2332 IFF_DYNAMIC | IFF_MULTICAST | IFF_PORTSEL |
2333 IFF_AUTOMEDIA)) |
2334 (dev->flags & (IFF_UP | IFF_VOLATILE | IFF_PROMISC |
2335 IFF_ALLMULTI));
2336
2337
2338
2339
2340
2341 dev_mc_upload(dev);
2342
2343
2344
2345
2346
2347
2348
2349 ret = 0;
2350 if ((old_flags ^ flags) & IFF_UP) {
2351 ret = ((old_flags & IFF_UP) ? dev_close : dev_open)(dev);
2352
2353 if (!ret)
2354 dev_mc_upload(dev);
2355 }
2356
2357 if (dev->flags & IFF_UP &&
2358 ((old_flags ^ dev->flags) &~ (IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
2359 IFF_VOLATILE)))
2360 notifier_call_chain(&netdev_chain, NETDEV_CHANGE, dev);
2361
2362 if ((flags ^ dev->gflags) & IFF_PROMISC) {
2363 int inc = (flags & IFF_PROMISC) ? +1 : -1;
2364 dev->gflags ^= IFF_PROMISC;
2365 dev_set_promiscuity(dev, inc);
2366 }
2367
2368
2369
2370
2371
2372 if ((flags ^ dev->gflags) & IFF_ALLMULTI) {
2373 int inc = (flags & IFF_ALLMULTI) ? +1 : -1;
2374 dev->gflags ^= IFF_ALLMULTI;
2375 dev_set_allmulti(dev, inc);
2376 }
2377
2378 if (old_flags ^ dev->flags)
2379 rtmsg_ifinfo(RTM_NEWLINK, dev, old_flags ^ dev->flags);
2380
2381 return ret;
2382}
2383
2384int dev_set_mtu(struct net_device *dev, int new_mtu)
2385{
2386 int err;
2387
2388 if (new_mtu == dev->mtu)
2389 return 0;
2390
2391
2392 if (new_mtu < 0)
2393 return -EINVAL;
2394
2395 if (!netif_device_present(dev))
2396 return -ENODEV;
2397
2398 err = 0;
2399 if (dev->change_mtu)
2400 err = dev->change_mtu(dev, new_mtu);
2401 else
2402 dev->mtu = new_mtu;
2403 if (!err && dev->flags & IFF_UP)
2404 notifier_call_chain(&netdev_chain,
2405 NETDEV_CHANGEMTU, dev);
2406 return err;
2407}
2408
2409
2410
2411
2412
2413static int dev_ifsioc(struct ifreq *ifr, unsigned int cmd)
2414{
2415 int err;
2416 struct net_device *dev = __dev_get_by_name(ifr->ifr_name);
2417
2418 if (!dev)
2419 return -ENODEV;
2420
2421 switch (cmd) {
2422 case SIOCGIFFLAGS:
2423 ifr->ifr_flags = dev_get_flags(dev);
2424 return 0;
2425
2426 case SIOCSIFFLAGS:
2427 return dev_change_flags(dev, ifr->ifr_flags);
2428
2429 case SIOCGIFMETRIC:
2430
2431 ifr->ifr_metric = 0;
2432 return 0;
2433
2434 case SIOCSIFMETRIC:
2435
2436 return -EOPNOTSUPP;
2437
2438 case SIOCGIFMTU:
2439 ifr->ifr_mtu = dev->mtu;
2440 return 0;
2441
2442 case SIOCSIFMTU:
2443 return dev_set_mtu(dev, ifr->ifr_mtu);
2444
2445 case SIOCGIFHWADDR:
2446 memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
2447 min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
2448 ifr->ifr_hwaddr.sa_family = dev->type;
2449 return 0;
2450
2451 case SIOCSIFHWADDR:
2452 if (!dev->set_mac_address)
2453 return -EOPNOTSUPP;
2454 if (ifr->ifr_hwaddr.sa_family != dev->type)
2455 return -EINVAL;
2456 if (!netif_device_present(dev))
2457 return -ENODEV;
2458 err = dev->set_mac_address(dev, &ifr->ifr_hwaddr);
2459 if (!err)
2460 notifier_call_chain(&netdev_chain,
2461 NETDEV_CHANGEADDR, dev);
2462 return err;
2463
2464 case SIOCSIFHWBROADCAST:
2465 if (ifr->ifr_hwaddr.sa_family != dev->type)
2466 return -EINVAL;
2467 memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data,
2468 min(sizeof ifr->ifr_hwaddr.sa_data, (size_t) dev->addr_len));
2469 notifier_call_chain(&netdev_chain,
2470 NETDEV_CHANGEADDR, dev);
2471 return 0;
2472
2473 case SIOCGIFMAP:
2474 ifr->ifr_map.mem_start = dev->mem_start;
2475 ifr->ifr_map.mem_end = dev->mem_end;
2476 ifr->ifr_map.base_addr = dev->base_addr;
2477 ifr->ifr_map.irq = dev->irq;
2478 ifr->ifr_map.dma = dev->dma;
2479 ifr->ifr_map.port = dev->if_port;
2480 return 0;
2481
2482 case SIOCSIFMAP:
2483 if (dev->set_config) {
2484 if (!netif_device_present(dev))
2485 return -ENODEV;
2486 return dev->set_config(dev, &ifr->ifr_map);
2487 }
2488 return -EOPNOTSUPP;
2489
2490 case SIOCADDMULTI:
2491 if (!dev->set_multicast_list ||
2492 ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
2493 return -EINVAL;
2494 if (!netif_device_present(dev))
2495 return -ENODEV;
2496 return dev_mc_add(dev, ifr->ifr_hwaddr.sa_data,
2497 dev->addr_len, 1);
2498
2499 case SIOCDELMULTI:
2500 if (!dev->set_multicast_list ||
2501 ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
2502 return -EINVAL;
2503 if (!netif_device_present(dev))
2504 return -ENODEV;
2505 return dev_mc_delete(dev, ifr->ifr_hwaddr.sa_data,
2506 dev->addr_len, 1);
2507
2508 case SIOCGIFINDEX:
2509 ifr->ifr_ifindex = dev->ifindex;
2510 return 0;
2511
2512 case SIOCGIFTXQLEN:
2513 ifr->ifr_qlen = dev->tx_queue_len;
2514 return 0;
2515
2516 case SIOCSIFTXQLEN:
2517 if (ifr->ifr_qlen < 0)
2518 return -EINVAL;
2519 dev->tx_queue_len = ifr->ifr_qlen;
2520 return 0;
2521
2522 case SIOCSIFNAME:
2523 ifr->ifr_newname[IFNAMSIZ-1] = '\0';
2524 return dev_change_name(dev, ifr->ifr_newname);
2525
2526
2527
2528
2529
2530 default:
2531 if ((cmd >= SIOCDEVPRIVATE &&
2532 cmd <= SIOCDEVPRIVATE + 15) ||
2533 cmd == SIOCBONDENSLAVE ||
2534 cmd == SIOCBONDRELEASE ||
2535 cmd == SIOCBONDSETHWADDR ||
2536 cmd == SIOCBONDSLAVEINFOQUERY ||
2537 cmd == SIOCBONDINFOQUERY ||
2538 cmd == SIOCBONDCHANGEACTIVE ||
2539 cmd == SIOCGMIIPHY ||
2540 cmd == SIOCGMIIREG ||
2541 cmd == SIOCSMIIREG ||
2542 cmd == SIOCBRADDIF ||
2543 cmd == SIOCBRDELIF ||
2544 cmd == SIOCWANDEV) {
2545 err = -EOPNOTSUPP;
2546 if (dev->do_ioctl) {
2547 if (netif_device_present(dev))
2548 err = dev->do_ioctl(dev, ifr,
2549 cmd);
2550 else
2551 err = -ENODEV;
2552 }
2553 } else
2554 err = -EINVAL;
2555
2556 }
2557 return err;
2558}
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576int dev_ioctl(unsigned int cmd, void __user *arg)
2577{
2578 struct ifreq ifr;
2579 int ret;
2580 char *colon;
2581
2582
2583
2584
2585
2586
2587 if (cmd == SIOCGIFCONF) {
2588 rtnl_shlock();
2589 ret = dev_ifconf((char __user *) arg);
2590 rtnl_shunlock();
2591 return ret;
2592 }
2593 if (cmd == SIOCGIFNAME)
2594 return dev_ifname((struct ifreq __user *)arg);
2595
2596 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
2597 return -EFAULT;
2598
2599 ifr.ifr_name[IFNAMSIZ-1] = 0;
2600
2601 colon = strchr(ifr.ifr_name, ':');
2602 if (colon)
2603 *colon = 0;
2604
2605
2606
2607
2608
2609 switch (cmd) {
2610
2611
2612
2613
2614
2615
2616 case SIOCGIFFLAGS:
2617 case SIOCGIFMETRIC:
2618 case SIOCGIFMTU:
2619 case SIOCGIFHWADDR:
2620 case SIOCGIFSLAVE:
2621 case SIOCGIFMAP:
2622 case SIOCGIFINDEX:
2623 case SIOCGIFTXQLEN:
2624 dev_load(ifr.ifr_name);
2625 read_lock(&dev_base_lock);
2626 ret = dev_ifsioc(&ifr, cmd);
2627 read_unlock(&dev_base_lock);
2628 if (!ret) {
2629 if (colon)
2630 *colon = ':';
2631 if (copy_to_user(arg, &ifr,
2632 sizeof(struct ifreq)))
2633 ret = -EFAULT;
2634 }
2635 return ret;
2636
2637 case SIOCETHTOOL:
2638 dev_load(ifr.ifr_name);
2639 rtnl_lock();
2640 ret = dev_ethtool(&ifr);
2641 rtnl_unlock();
2642 if (!ret) {
2643 if (colon)
2644 *colon = ':';
2645 if (copy_to_user(arg, &ifr,
2646 sizeof(struct ifreq)))
2647 ret = -EFAULT;
2648 }
2649 return ret;
2650
2651
2652
2653
2654
2655
2656
2657 case SIOCGMIIPHY:
2658 case SIOCGMIIREG:
2659 case SIOCSIFNAME:
2660 if (!capable(CAP_NET_ADMIN))
2661 return -EPERM;
2662 dev_load(ifr.ifr_name);
2663 rtnl_lock();
2664 ret = dev_ifsioc(&ifr, cmd);
2665 rtnl_unlock();
2666 if (!ret) {
2667 if (colon)
2668 *colon = ':';
2669 if (copy_to_user(arg, &ifr,
2670 sizeof(struct ifreq)))
2671 ret = -EFAULT;
2672 }
2673 return ret;
2674
2675
2676
2677
2678
2679
2680
2681 case SIOCSIFFLAGS:
2682 case SIOCSIFMETRIC:
2683 case SIOCSIFMTU:
2684 case SIOCSIFMAP:
2685 case SIOCSIFHWADDR:
2686 case SIOCSIFSLAVE:
2687 case SIOCADDMULTI:
2688 case SIOCDELMULTI:
2689 case SIOCSIFHWBROADCAST:
2690 case SIOCSIFTXQLEN:
2691 case SIOCSMIIREG:
2692 case SIOCBONDENSLAVE:
2693 case SIOCBONDRELEASE:
2694 case SIOCBONDSETHWADDR:
2695 case SIOCBONDSLAVEINFOQUERY:
2696 case SIOCBONDINFOQUERY:
2697 case SIOCBONDCHANGEACTIVE:
2698 case SIOCBRADDIF:
2699 case SIOCBRDELIF:
2700 if (!capable(CAP_NET_ADMIN))
2701 return -EPERM;
2702 dev_load(ifr.ifr_name);
2703 rtnl_lock();
2704 ret = dev_ifsioc(&ifr, cmd);
2705 rtnl_unlock();
2706 return ret;
2707
2708 case SIOCGIFMEM:
2709
2710
2711 case SIOCSIFMEM:
2712
2713
2714 case SIOCSIFLINK:
2715 return -EINVAL;
2716
2717
2718
2719
2720 default:
2721 if (cmd == SIOCWANDEV ||
2722 (cmd >= SIOCDEVPRIVATE &&
2723 cmd <= SIOCDEVPRIVATE + 15)) {
2724 dev_load(ifr.ifr_name);
2725 rtnl_lock();
2726 ret = dev_ifsioc(&ifr, cmd);
2727 rtnl_unlock();
2728 if (!ret && copy_to_user(arg, &ifr,
2729 sizeof(struct ifreq)))
2730 ret = -EFAULT;
2731 return ret;
2732 }
2733#ifdef WIRELESS_EXT
2734
2735 if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
2736
2737
2738
2739 if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE) {
2740 if (!capable(CAP_NET_ADMIN))
2741 return -EPERM;
2742 }
2743 dev_load(ifr.ifr_name);
2744 rtnl_lock();
2745
2746 ret = wireless_process_ioctl(&ifr, cmd);
2747 rtnl_unlock();
2748 if (!ret && IW_IS_GET(cmd) &&
2749 copy_to_user(arg, &ifr,
2750 sizeof(struct ifreq)))
2751 ret = -EFAULT;
2752 return ret;
2753 }
2754#endif
2755 return -EINVAL;
2756 }
2757}
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767int dev_new_index(void)
2768{
2769 static int ifindex;
2770 for (;;) {
2771 if (++ifindex <= 0)
2772 ifindex = 1;
2773 if (!__dev_get_by_index(ifindex))
2774 return ifindex;
2775 }
2776}
2777
2778static int dev_boot_phase = 1;
2779
2780
2781static spinlock_t net_todo_list_lock = SPIN_LOCK_UNLOCKED;
2782static struct list_head net_todo_list = LIST_HEAD_INIT(net_todo_list);
2783
2784static inline void net_set_todo(struct net_device *dev)
2785{
2786 spin_lock(&net_todo_list_lock);
2787 list_add_tail(&dev->todo_list, &net_todo_list);
2788 spin_unlock(&net_todo_list_lock);
2789}
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809int register_netdevice(struct net_device *dev)
2810{
2811 struct hlist_head *head;
2812 struct hlist_node *p;
2813 int ret;
2814
2815 BUG_ON(dev_boot_phase);
2816 ASSERT_RTNL();
2817
2818
2819 BUG_ON(dev->reg_state != NETREG_UNINITIALIZED);
2820
2821 spin_lock_init(&dev->queue_lock);
2822 spin_lock_init(&dev->xmit_lock);
2823 dev->xmit_lock_owner = -1;
2824#ifdef CONFIG_NET_CLS_ACT
2825 spin_lock_init(&dev->ingress_lock);
2826#endif
2827
2828 ret = alloc_divert_blk(dev);
2829 if (ret)
2830 goto out;
2831
2832 dev->iflink = -1;
2833
2834
2835 if (dev->init) {
2836 ret = dev->init(dev);
2837 if (ret) {
2838 if (ret > 0)
2839 ret = -EIO;
2840 goto out_err;
2841 }
2842 }
2843
2844 if (!dev_valid_name(dev->name)) {
2845 ret = -EINVAL;
2846 goto out_err;
2847 }
2848
2849 dev->ifindex = dev_new_index();
2850 if (dev->iflink == -1)
2851 dev->iflink = dev->ifindex;
2852
2853
2854 head = dev_name_hash(dev->name);
2855 hlist_for_each(p, head) {
2856 struct net_device *d
2857 = hlist_entry(p, struct net_device, name_hlist);
2858 if (!strncmp(d->name, dev->name, IFNAMSIZ)) {
2859 ret = -EEXIST;
2860 goto out_err;
2861 }
2862 }
2863
2864
2865 if ((dev->features & NETIF_F_SG) &&
2866 !(dev->features & (NETIF_F_IP_CSUM |
2867 NETIF_F_NO_CSUM |
2868 NETIF_F_HW_CSUM))) {
2869 printk("%s: Dropping NETIF_F_SG since no checksum feature.\n",
2870 dev->name);
2871 dev->features &= ~NETIF_F_SG;
2872 }
2873
2874
2875
2876
2877
2878
2879 if (!dev->rebuild_header)
2880 dev->rebuild_header = default_rebuild_header;
2881
2882
2883
2884
2885
2886
2887 set_bit(__LINK_STATE_PRESENT, &dev->state);
2888
2889 dev->next = NULL;
2890 dev_init_scheduler(dev);
2891 write_lock_bh(&dev_base_lock);
2892 *dev_tail = dev;
2893 dev_tail = &dev->next;
2894 hlist_add_head(&dev->name_hlist, head);
2895 hlist_add_head(&dev->index_hlist, dev_index_hash(dev->ifindex));
2896 dev_hold(dev);
2897 dev->reg_state = NETREG_REGISTERING;
2898 write_unlock_bh(&dev_base_lock);
2899
2900
2901 notifier_call_chain(&netdev_chain, NETDEV_REGISTER, dev);
2902
2903
2904 net_set_todo(dev);
2905 ret = 0;
2906
2907out:
2908 return ret;
2909out_err:
2910 free_divert_blk(dev);
2911 goto out;
2912}
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925static void netdev_wait_allrefs(struct net_device *dev)
2926{
2927 unsigned long rebroadcast_time, warning_time;
2928
2929 rebroadcast_time = warning_time = jiffies;
2930 while (atomic_read(&dev->refcnt) != 0) {
2931 if (time_after(jiffies, rebroadcast_time + 1 * HZ)) {
2932 rtnl_shlock();
2933
2934
2935 notifier_call_chain(&netdev_chain,
2936 NETDEV_UNREGISTER, dev);
2937
2938 if (test_bit(__LINK_STATE_LINKWATCH_PENDING,
2939 &dev->state)) {
2940
2941
2942
2943
2944
2945
2946 linkwatch_run_queue();
2947 }
2948
2949 rtnl_shunlock();
2950
2951 rebroadcast_time = jiffies;
2952 }
2953
2954 current->state = TASK_INTERRUPTIBLE;
2955 schedule_timeout(HZ / 4);
2956
2957 if (time_after(jiffies, warning_time + 10 * HZ)) {
2958 printk(KERN_EMERG "unregister_netdevice: "
2959 "waiting for %s to become free. Usage "
2960 "count = %d\n",
2961 dev->name, atomic_read(&dev->refcnt));
2962 warning_time = jiffies;
2963 }
2964 }
2965}
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988static DECLARE_MUTEX(net_todo_run_mutex);
2989void netdev_run_todo(void)
2990{
2991 struct list_head list = LIST_HEAD_INIT(list);
2992 int err;
2993
2994
2995
2996 down(&net_todo_run_mutex);
2997
2998
2999
3000
3001
3002
3003 if (list_empty(&net_todo_list))
3004 goto out;
3005
3006
3007 spin_lock(&net_todo_list_lock);
3008 list_splice_init(&net_todo_list, &list);
3009 spin_unlock(&net_todo_list_lock);
3010
3011 while (!list_empty(&list)) {
3012 struct net_device *dev
3013 = list_entry(list.next, struct net_device, todo_list);
3014 list_del(&dev->todo_list);
3015
3016 switch(dev->reg_state) {
3017 case NETREG_REGISTERING:
3018 err = netdev_register_sysfs(dev);
3019 if (err)
3020 printk(KERN_ERR "%s: failed sysfs registration (%d)\n",
3021 dev->name, err);
3022 dev->reg_state = NETREG_REGISTERED;
3023 break;
3024
3025 case NETREG_UNREGISTERING:
3026 netdev_unregister_sysfs(dev);
3027 dev->reg_state = NETREG_UNREGISTERED;
3028
3029 netdev_wait_allrefs(dev);
3030
3031
3032 BUG_ON(atomic_read(&dev->refcnt));
3033 BUG_TRAP(!dev->ip_ptr);
3034 BUG_TRAP(!dev->ip6_ptr);
3035 BUG_TRAP(!dev->dn_ptr);
3036
3037
3038
3039
3040
3041 if (dev->destructor)
3042 dev->destructor(dev);
3043 break;
3044
3045 default:
3046 printk(KERN_ERR "network todo '%s' but state %d\n",
3047 dev->name, dev->reg_state);
3048 break;
3049 }
3050 }
3051
3052out:
3053 up(&net_todo_run_mutex);
3054}
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064void free_netdev(struct net_device *dev)
3065{
3066#ifdef CONFIG_SYSFS
3067
3068 if (dev->reg_state == NETREG_UNINITIALIZED) {
3069 kfree((char *)dev - dev->padded);
3070 return;
3071 }
3072
3073 BUG_ON(dev->reg_state != NETREG_UNREGISTERED);
3074 dev->reg_state = NETREG_RELEASED;
3075
3076
3077 class_device_put(&dev->class_dev);
3078#else
3079 kfree((char *)dev - dev->padded);
3080#endif
3081}
3082
3083
3084void synchronize_net(void)
3085{
3086 might_sleep();
3087 synchronize_kernel();
3088}
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103int unregister_netdevice(struct net_device *dev)
3104{
3105 struct net_device *d, **dp;
3106
3107 BUG_ON(dev_boot_phase);
3108 ASSERT_RTNL();
3109
3110
3111 if (dev->reg_state == NETREG_UNINITIALIZED) {
3112 printk(KERN_DEBUG "unregister_netdevice: device %s/%p never "
3113 "was registered\n", dev->name, dev);
3114 return -ENODEV;
3115 }
3116
3117 BUG_ON(dev->reg_state != NETREG_REGISTERED);
3118
3119
3120 if (dev->flags & IFF_UP)
3121 dev_close(dev);
3122
3123
3124 for (dp = &dev_base; (d = *dp) != NULL; dp = &d->next) {
3125 if (d == dev) {
3126 write_lock_bh(&dev_base_lock);
3127 hlist_del(&dev->name_hlist);
3128 hlist_del(&dev->index_hlist);
3129 if (dev_tail == &dev->next)
3130 dev_tail = dp;
3131 *dp = d->next;
3132 write_unlock_bh(&dev_base_lock);
3133 break;
3134 }
3135 }
3136 if (!d) {
3137 printk(KERN_ERR "unregister net_device: '%s' not found\n",
3138 dev->name);
3139 return -ENODEV;
3140 }
3141
3142 dev->reg_state = NETREG_UNREGISTERING;
3143
3144 synchronize_net();
3145
3146
3147 dev_shutdown(dev);
3148
3149
3150
3151
3152
3153 notifier_call_chain(&netdev_chain, NETDEV_UNREGISTER, dev);
3154
3155
3156
3157
3158 dev_mc_discard(dev);
3159
3160 if (dev->uninit)
3161 dev->uninit(dev);
3162
3163
3164 BUG_TRAP(!dev->master);
3165
3166 free_divert_blk(dev);
3167
3168
3169 net_set_todo(dev);
3170
3171 synchronize_net();
3172
3173 dev_put(dev);
3174 return 0;
3175}
3176
3177#ifdef CONFIG_HOTPLUG_CPU
3178static int dev_cpu_callback(struct notifier_block *nfb,
3179 unsigned long action,
3180 void *ocpu)
3181{
3182 struct sk_buff **list_skb;
3183 struct net_device **list_net;
3184 struct sk_buff *skb;
3185 unsigned int cpu, oldcpu = (unsigned long)ocpu;
3186 struct softnet_data *sd, *oldsd;
3187
3188 if (action != CPU_DEAD)
3189 return NOTIFY_OK;
3190
3191 local_irq_disable();
3192 cpu = smp_processor_id();
3193 sd = &per_cpu(softnet_data, cpu);
3194 oldsd = &per_cpu(softnet_data, oldcpu);
3195
3196
3197 list_skb = &sd->completion_queue;
3198 while (*list_skb)
3199 list_skb = &(*list_skb)->next;
3200
3201 *list_skb = oldsd->completion_queue;
3202 oldsd->completion_queue = NULL;
3203
3204
3205 list_net = &sd->output_queue;
3206 while (*list_net)
3207 list_net = &(*list_net)->next_sched;
3208
3209 *list_net = oldsd->output_queue;
3210 oldsd->output_queue = NULL;
3211
3212 raise_softirq_irqoff(NET_TX_SOFTIRQ);
3213 local_irq_enable();
3214
3215
3216 while ((skb = __skb_dequeue(&oldsd->input_pkt_queue)))
3217 netif_rx(skb);
3218
3219 return NOTIFY_OK;
3220}
3221#endif
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235static int __init net_dev_init(void)
3236{
3237 int i, rc = -ENOMEM;
3238
3239 BUG_ON(!dev_boot_phase);
3240
3241 net_random_init();
3242
3243 if (dev_proc_init())
3244 goto out;
3245
3246 if (netdev_sysfs_init())
3247 goto out;
3248
3249 INIT_LIST_HEAD(&ptype_all);
3250 for (i = 0; i < 16; i++)
3251 INIT_LIST_HEAD(&ptype_base[i]);
3252
3253 for (i = 0; i < ARRAY_SIZE(dev_name_head); i++)
3254 INIT_HLIST_HEAD(&dev_name_head[i]);
3255
3256 for (i = 0; i < ARRAY_SIZE(dev_index_head); i++)
3257 INIT_HLIST_HEAD(&dev_index_head[i]);
3258
3259
3260
3261
3262
3263 for (i = 0; i < NR_CPUS; i++) {
3264 struct softnet_data *queue;
3265
3266 queue = &per_cpu(softnet_data, i);
3267 skb_queue_head_init(&queue->input_pkt_queue);
3268 queue->throttle = 0;
3269 queue->cng_level = 0;
3270 queue->avg_blog = 10;
3271 queue->completion_queue = NULL;
3272 INIT_LIST_HEAD(&queue->poll_list);
3273 set_bit(__LINK_STATE_START, &queue->backlog_dev.state);
3274 queue->backlog_dev.weight = weight_p;
3275 queue->backlog_dev.poll = process_backlog;
3276 atomic_set(&queue->backlog_dev.refcnt, 1);
3277 }
3278
3279#ifdef OFFLINE_SAMPLE
3280 samp_timer.expires = jiffies + (10 * HZ);
3281 add_timer(&samp_timer);
3282#endif
3283
3284 dev_boot_phase = 0;
3285
3286 open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
3287 open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
3288
3289 hotcpu_notifier(dev_cpu_callback, 0);
3290 dst_init();
3291 dev_mcast_init();
3292 rc = 0;
3293out:
3294 return rc;
3295}
3296
3297subsys_initcall(net_dev_init);
3298
3299EXPORT_SYMBOL(__dev_get);
3300EXPORT_SYMBOL(__dev_get_by_flags);
3301EXPORT_SYMBOL(__dev_get_by_index);
3302EXPORT_SYMBOL(__dev_get_by_name);
3303EXPORT_SYMBOL(__dev_remove_pack);
3304EXPORT_SYMBOL(__skb_linearize);
3305EXPORT_SYMBOL(call_netdevice_notifiers);
3306EXPORT_SYMBOL(dev_add_pack);
3307EXPORT_SYMBOL(dev_alloc_name);
3308EXPORT_SYMBOL(dev_close);
3309EXPORT_SYMBOL(dev_get_by_flags);
3310EXPORT_SYMBOL(dev_get_by_index);
3311EXPORT_SYMBOL(dev_get_by_name);
3312EXPORT_SYMBOL(dev_getbyhwaddr);
3313EXPORT_SYMBOL(dev_ioctl);
3314EXPORT_SYMBOL(dev_new_index);
3315EXPORT_SYMBOL(dev_open);
3316EXPORT_SYMBOL(dev_queue_xmit);
3317EXPORT_SYMBOL(dev_queue_xmit_nit);
3318EXPORT_SYMBOL(dev_remove_pack);
3319EXPORT_SYMBOL(dev_set_allmulti);
3320EXPORT_SYMBOL(dev_set_promiscuity);
3321EXPORT_SYMBOL(dev_change_flags);
3322EXPORT_SYMBOL(dev_change_name);
3323EXPORT_SYMBOL(dev_set_mtu);
3324EXPORT_SYMBOL(free_netdev);
3325EXPORT_SYMBOL(netdev_boot_setup_check);
3326EXPORT_SYMBOL(netdev_set_master);
3327EXPORT_SYMBOL(netdev_state_change);
3328EXPORT_SYMBOL(netif_receive_skb);
3329EXPORT_SYMBOL(netif_rx);
3330EXPORT_SYMBOL(register_gifconf);
3331EXPORT_SYMBOL(register_netdevice);
3332EXPORT_SYMBOL(register_netdevice_notifier);
3333EXPORT_SYMBOL(skb_checksum_help);
3334EXPORT_SYMBOL(synchronize_net);
3335EXPORT_SYMBOL(unregister_netdevice);
3336EXPORT_SYMBOL(unregister_netdevice_notifier);
3337
3338#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
3339EXPORT_SYMBOL(br_handle_frame_hook);
3340#endif
3341
3342#ifdef CONFIG_KMOD
3343EXPORT_SYMBOL(dev_load);
3344#endif
3345#ifdef CONFIG_NET_HW_FLOWCONTROL
3346EXPORT_SYMBOL(netdev_dropping);
3347EXPORT_SYMBOL(netdev_fc_xoff);
3348EXPORT_SYMBOL(netdev_register_fc);
3349EXPORT_SYMBOL(netdev_unregister_fc);
3350#endif
3351
3352#ifdef CONFIG_NET_CLS_ACT
3353EXPORT_SYMBOL(ing_filter);
3354#endif
3355
3356
3357EXPORT_PER_CPU_SYMBOL(softnet_data);
3358