This source file includes following definitions.
- min
- dev_add_pack
- dev_remove_pack
- dev_get
- dev_open
- dev_close
- dev_queue_xmit
- netif_rx
- dev_rint
- dev_transmit
- in_net_bh
- net_bh
- dev_tint
- dev_ifconf
- sprintf_stats
- dev_get_info
- bad_mask
- dev_ifsioc
- dev_ioctl
- dev_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include <asm/segment.h>
40 #include <asm/system.h>
41 #include <asm/bitops.h>
42 #include <linux/config.h>
43 #include <linux/types.h>
44 #include <linux/kernel.h>
45 #include <linux/sched.h>
46 #include <linux/string.h>
47 #include <linux/mm.h>
48 #include <linux/socket.h>
49 #include <linux/sockios.h>
50 #include <linux/in.h>
51 #include <linux/errno.h>
52 #include <linux/interrupt.h>
53 #include <linux/if_ether.h>
54 #include <linux/inet.h>
55 #include <linux/netdevice.h>
56 #include <linux/etherdevice.h>
57 #include "ip.h"
58 #include "route.h"
59 #include <linux/skbuff.h>
60 #include "sock.h"
61 #include "arp.h"
62
63
64
65
66
67
68
69 struct packet_type *ptype_base = NULL;
70
71
72
73
74
75
76 static struct sk_buff_head backlog =
77 {
78 (struct sk_buff *)&backlog, (struct sk_buff *)&backlog
79 #ifdef CONFIG_SKB_CHECK
80 ,SK_HEAD_SKB
81 #endif
82 };
83
84
85
86
87
88 static int backlog_size = 0;
89
90
91
92
93
94
95 static int dev_nit=0;
96
97
98
99
100
101 static __inline__ unsigned long min(unsigned long a, unsigned long b)
102 {
103 return (a < b)? a : b;
104 }
105
106
107
108
109
110
111
112
113
114
115
116
117
118 void dev_add_pack(struct packet_type *pt)
119 {
120 struct packet_type *p1;
121 pt->next = ptype_base;
122
123
124
125
126
127
128
129 pt->copy=0;
130
131
132
133 if(pt->type == htons(ETH_P_ALL))
134 dev_nit++;
135 else
136 {
137
138
139
140
141 for (p1 = ptype_base; p1 != NULL; p1 = p1->next)
142 {
143 if (p1->type == pt->type)
144 {
145 pt->copy = 1;
146 break;
147 }
148 }
149 }
150
151
152
153
154
155 if (pt->type == htons(ETH_P_ALL))
156 {
157 pt->next=NULL;
158 if(ptype_base==NULL)
159 ptype_base=pt;
160 else
161 {
162
163
164
165 for(p1=ptype_base;p1->next!=NULL;p1=p1->next);
166
167
168
169 p1->next=pt;
170 }
171 }
172 else
173
174
175
176 ptype_base = pt;
177 }
178
179
180
181
182
183
184 void dev_remove_pack(struct packet_type *pt)
185 {
186 struct packet_type *lpt, *pt1;
187
188
189
190
191
192 if (pt->type == htons(ETH_P_ALL))
193 dev_nit--;
194
195
196
197
198
199 if (pt == ptype_base)
200 {
201 ptype_base = pt->next;
202 return;
203 }
204
205 lpt = NULL;
206
207
208
209
210
211
212
213
214 for (pt1 = ptype_base; pt1->next != NULL; pt1 = pt1->next)
215 {
216 if (pt1->next == pt )
217 {
218 cli();
219 if (!pt->copy && lpt)
220 lpt->copy = 0;
221 pt1->next = pt->next;
222 sti();
223 return;
224 }
225 if (pt1->next->type == pt->type && pt->type != htons(ETH_P_ALL))
226 lpt = pt1->next;
227 }
228 }
229
230
231
232
233
234
235
236
237
238
239
240 struct device *dev_get(char *name)
241 {
242 struct device *dev;
243
244 for (dev = dev_base; dev != NULL; dev = dev->next)
245 {
246 if (strcmp(dev->name, name) == 0)
247 return(dev);
248 }
249 return(NULL);
250 }
251
252
253
254
255
256
257 int dev_open(struct device *dev)
258 {
259 int ret = 0;
260
261
262
263
264 if (dev->open)
265 ret = dev->open(dev);
266
267
268
269
270
271 if (ret == 0)
272 {
273 dev->flags |= (IFF_UP | IFF_RUNNING);
274
275
276
277 #ifdef CONFIG_IP_MULTICAST
278
279
280
281 ip_mc_allhost(dev);
282 #endif
283 dev_mc_upload(dev);
284 }
285 return(ret);
286 }
287
288
289
290
291
292
293
294
295
296
297
298 int dev_close(struct device *dev)
299 {
300
301
302
303
304 if (dev->flags != 0)
305 {
306 int ct=0;
307 dev->flags = 0;
308
309
310
311 if (dev->stop)
312 dev->stop(dev);
313
314
315
316 #ifdef CONFIG_INET
317 ip_rt_flush(dev);
318 arp_device_down(dev);
319 #endif
320 #ifdef CONFIG_IPX
321 ipxrtr_device_down(dev);
322 #endif
323
324
325
326 dev_mc_discard(dev);
327
328
329
330 dev->pa_addr = 0;
331 dev->pa_dstaddr = 0;
332 dev->pa_brdaddr = 0;
333 dev->pa_mask = 0;
334
335
336
337 while(ct<DEV_NUMBUFFS)
338 {
339 struct sk_buff *skb;
340 while((skb=skb_dequeue(&dev->buffs[ct]))!=NULL)
341 if(skb->free)
342 kfree_skb(skb,FREE_WRITE);
343 ct++;
344 }
345 }
346 return(0);
347 }
348
349
350
351
352
353
354
355
356
357
358 void dev_queue_xmit(struct sk_buff *skb, struct device *dev, int pri)
359 {
360 unsigned long flags;
361 int nitcount;
362 struct packet_type *ptype;
363 int where = 0;
364
365
366
367 if (dev == NULL)
368 {
369 printk("dev.c: dev_queue_xmit: dev = NULL\n");
370 return;
371 }
372
373 if(pri>=0 && !skb_device_locked(skb))
374 skb_device_lock(skb);
375 #ifdef CONFIG_SLAVE_BALANCING
376 save_flags(flags);
377 cli();
378 if(dev->slave!=NULL && dev->slave->pkt_queue < dev->pkt_queue &&
379 (dev->slave->flags & IFF_UP))
380 dev=dev->slave;
381 restore_flags(flags);
382 #endif
383 #ifdef CONFIG_SKB_CHECK
384 IS_SKB(skb);
385 #endif
386 skb->dev = dev;
387
388
389
390
391
392 if (skb->next != NULL)
393 {
394
395
396
397 printk("dev_queue_xmit: worked around a missed interrupt\n");
398 dev->hard_start_xmit(NULL, dev);
399 return;
400 }
401
402
403
404
405
406
407
408 if (pri < 0)
409 {
410 pri = -pri-1;
411 where = 1;
412 }
413
414 if (pri >= DEV_NUMBUFFS)
415 {
416 printk("bad priority in dev_queue_xmit.\n");
417 pri = 1;
418 }
419
420
421
422
423
424
425 if (!skb->arp && dev->rebuild_header(skb->data, dev, skb->raddr, skb)) {
426 return;
427 }
428
429 save_flags(flags);
430 cli();
431 if (!where) {
432 #ifdef CONFIG_SLAVE_BALANCING
433 skb->in_dev_queue=1;
434 #endif
435 skb_queue_tail(dev->buffs + pri,skb);
436 skb_device_unlock(skb);
437 skb = skb_dequeue(dev->buffs + pri);
438 skb_device_lock(skb);
439 #ifdef CONFIG_SLAVE_BALANCING
440 skb->in_dev_queue=0;
441 #endif
442 }
443 restore_flags(flags);
444
445
446 if(!where)
447 {
448 for (nitcount = dev_nit, ptype = ptype_base; nitcount > 0 && ptype != NULL; ptype = ptype->next)
449 {
450 if (ptype->type == htons(ETH_P_ALL)) {
451 struct sk_buff *skb2;
452 if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL)
453 break;
454 ptype->func(skb2, skb->dev, ptype);
455 nitcount--;
456 }
457 }
458 }
459 if (dev->hard_start_xmit(skb, dev) == 0) {
460
461
462
463 return;
464 }
465
466
467
468
469
470 cli();
471 #ifdef CONFIG_SLAVE_BALANCING
472 skb->in_dev_queue=1;
473 dev->pkt_queue++;
474 #endif
475 skb_device_unlock(skb);
476 skb_queue_head(dev->buffs + pri,skb);
477 restore_flags(flags);
478 }
479
480
481
482
483
484
485
486 void netif_rx(struct sk_buff *skb)
487 {
488 static int dropping = 0;
489
490
491
492
493
494
495 skb->sk = NULL;
496 skb->free = 1;
497 if(skb->stamp.tv_sec==0)
498 skb->stamp = xtime;
499
500
501
502
503
504 if (!backlog_size)
505 dropping = 0;
506 else if (backlog_size > 300)
507 dropping = 1;
508
509 if (dropping)
510 {
511 kfree_skb(skb, FREE_READ);
512 return;
513 }
514
515
516
517
518 #ifdef CONFIG_SKB_CHECK
519 IS_SKB(skb);
520 #endif
521 skb_queue_tail(&backlog,skb);
522 backlog_size++;
523
524
525
526
527
528
529 mark_bh(NET_BH);
530 return;
531 }
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548 int dev_rint(unsigned char *buff, long len, int flags, struct device *dev)
549 {
550 static int dropping = 0;
551 struct sk_buff *skb = NULL;
552 unsigned char *to;
553 int amount, left;
554 int len2;
555
556 if (dev == NULL || buff == NULL || len <= 0)
557 return(1);
558
559 if (flags & IN_SKBUFF)
560 {
561 skb = (struct sk_buff *) buff;
562 }
563 else
564 {
565 if (dropping)
566 {
567 if (skb_peek(&backlog) != NULL)
568 return(1);
569 printk("INET: dev_rint: no longer dropping packets.\n");
570 dropping = 0;
571 }
572
573 skb = alloc_skb(len, GFP_ATOMIC);
574 if (skb == NULL)
575 {
576 printk("dev_rint: packet dropped on %s (no memory) !\n",
577 dev->name);
578 dropping = 1;
579 return(1);
580 }
581
582
583
584
585
586
587 to = skb->data;
588 left = len;
589
590 len2 = len;
591 while (len2 > 0)
592 {
593 amount = min(len2, (unsigned long) dev->rmem_end -
594 (unsigned long) buff);
595 memcpy(to, buff, amount);
596 len2 -= amount;
597 left -= amount;
598 buff += amount;
599 to += amount;
600 if ((unsigned long) buff == dev->rmem_end)
601 buff = (unsigned char *) dev->rmem_start;
602 }
603 }
604
605
606
607
608
609 skb->len = len;
610 skb->dev = dev;
611 skb->free = 1;
612
613 netif_rx(skb);
614
615
616
617 return(0);
618 }
619
620
621
622
623
624
625 void dev_transmit(void)
626 {
627 struct device *dev;
628
629 for (dev = dev_base; dev != NULL; dev = dev->next)
630 {
631 if (dev->flags != 0 && !dev->tbusy) {
632
633
634
635 dev_tint(dev);
636 }
637 }
638 }
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653 volatile char in_bh = 0;
654
655 int in_net_bh()
656 {
657 return(in_bh==0?0:1);
658 }
659
660
661
662
663
664
665
666
667
668 void net_bh(void *tmp)
669 {
670 struct sk_buff *skb;
671 struct packet_type *ptype;
672 unsigned short type;
673 unsigned char flag = 0;
674 int nitcount;
675
676
677
678
679
680 if (set_bit(1, (void*)&in_bh))
681 return;
682
683
684
685
686
687
688
689 dev_transmit();
690
691
692
693
694
695
696
697 cli();
698
699
700
701
702
703 while((skb=skb_dequeue(&backlog))!=NULL)
704 {
705
706
707
708 backlog_size--;
709
710 nitcount=dev_nit;
711 flag=0;
712 sti();
713
714
715
716
717
718
719
720
721 skb->h.raw = skb->data + skb->dev->hard_header_len;
722 skb->len -= skb->dev->hard_header_len;
723
724
725
726
727
728
729
730
731
732
733
734
735 type = skb->dev->type_trans(skb, skb->dev);
736
737
738
739
740
741
742
743
744
745
746
747
748
749 for (ptype = ptype_base; ptype != NULL; ptype = ptype->next)
750 {
751 if (ptype->type == type || ptype->type == htons(ETH_P_ALL))
752 {
753 struct sk_buff *skb2;
754
755 if (ptype->type == htons(ETH_P_ALL))
756 nitcount--;
757 if (ptype->copy || nitcount)
758 {
759
760
761
762 #ifdef OLD
763 skb2 = alloc_skb(skb->len, GFP_ATOMIC);
764 if (skb2 == NULL)
765 continue;
766 memcpy(skb2, skb, skb2->mem_len);
767 skb2->mem_addr = skb2;
768 skb2->h.raw = (unsigned char *)(
769 (unsigned long) skb2 +
770 (unsigned long) skb->h.raw -
771 (unsigned long) skb
772 );
773 skb2->free = 1;
774 #else
775 skb2=skb_clone(skb, GFP_ATOMIC);
776 if(skb2==NULL)
777 continue;
778 #endif
779 }
780 else
781 {
782 skb2 = skb;
783 }
784
785
786
787
788
789 flag = 1;
790
791
792
793
794
795
796 ptype->func(skb2, skb->dev, ptype);
797 }
798 }
799
800
801
802
803
804 if (!flag)
805 {
806 kfree_skb(skb, FREE_WRITE);
807 }
808
809
810
811
812
813 dev_transmit();
814 cli();
815 }
816
817
818
819
820
821 in_bh = 0;
822 sti();
823
824
825
826
827
828 dev_transmit();
829 }
830
831
832
833
834
835
836
837 void dev_tint(struct device *dev)
838 {
839 int i;
840 struct sk_buff *skb;
841 unsigned long flags;
842
843 save_flags(flags);
844
845
846
847
848 for(i = 0;i < DEV_NUMBUFFS; i++)
849 {
850
851
852
853
854
855 cli();
856 while((skb=skb_dequeue(&dev->buffs[i]))!=NULL)
857 {
858
859
860
861 skb_device_lock(skb);
862 restore_flags(flags);
863
864
865
866
867 dev_queue_xmit(skb,dev,-i - 1);
868
869
870
871 if (dev->tbusy)
872 return;
873 cli();
874 }
875 }
876 restore_flags(flags);
877 }
878
879
880
881
882
883
884
885
886 static int dev_ifconf(char *arg)
887 {
888 struct ifconf ifc;
889 struct ifreq ifr;
890 struct device *dev;
891 char *pos;
892 int len;
893 int err;
894
895
896
897
898
899 err=verify_area(VERIFY_WRITE, arg, sizeof(struct ifconf));
900 if(err)
901 return err;
902 memcpy_fromfs(&ifc, arg, sizeof(struct ifconf));
903 len = ifc.ifc_len;
904 pos = ifc.ifc_buf;
905
906
907
908
909
910
911 err=verify_area(VERIFY_WRITE,pos,len);
912 if(err)
913 return err;
914
915
916
917
918
919 for (dev = dev_base; dev != NULL; dev = dev->next)
920 {
921 if(!(dev->flags & IFF_UP))
922 continue;
923 memset(&ifr, 0, sizeof(struct ifreq));
924 strcpy(ifr.ifr_name, dev->name);
925 (*(struct sockaddr_in *) &ifr.ifr_addr).sin_family = dev->family;
926 (*(struct sockaddr_in *) &ifr.ifr_addr).sin_addr.s_addr = dev->pa_addr;
927
928
929
930
931
932 memcpy_tofs(pos, &ifr, sizeof(struct ifreq));
933 pos += sizeof(struct ifreq);
934 len -= sizeof(struct ifreq);
935
936
937
938
939
940 if (len < sizeof(struct ifreq))
941 break;
942 }
943
944
945
946
947
948 ifc.ifc_len = (pos - ifc.ifc_buf);
949 ifc.ifc_req = (struct ifreq *) ifc.ifc_buf;
950 memcpy_tofs(arg, &ifc, sizeof(struct ifconf));
951
952
953
954
955
956 return(pos - arg);
957 }
958
959
960
961
962
963
964
965 static int sprintf_stats(char *buffer, struct device *dev)
966 {
967 struct enet_statistics *stats = (dev->get_stats ? dev->get_stats(dev): NULL);
968 int size;
969
970 if (stats)
971 size = sprintf(buffer, "%6s:%7d %4d %4d %4d %4d %8d %4d %4d %4d %5d %4d\n",
972 dev->name,
973 stats->rx_packets, stats->rx_errors,
974 stats->rx_dropped + stats->rx_missed_errors,
975 stats->rx_fifo_errors,
976 stats->rx_length_errors + stats->rx_over_errors
977 + stats->rx_crc_errors + stats->rx_frame_errors,
978 stats->tx_packets, stats->tx_errors, stats->tx_dropped,
979 stats->tx_fifo_errors, stats->collisions,
980 stats->tx_carrier_errors + stats->tx_aborted_errors
981 + stats->tx_window_errors + stats->tx_heartbeat_errors);
982 else
983 size = sprintf(buffer, "%6s: No statistics available.\n", dev->name);
984
985 return size;
986 }
987
988
989
990
991
992
993 int dev_get_info(char *buffer, char **start, off_t offset, int length)
994 {
995 int len=0;
996 off_t begin=0;
997 off_t pos=0;
998 int size;
999
1000 struct device *dev;
1001
1002
1003 size = sprintf(buffer, "Inter-| Receive | Transmit\n"
1004 " face |packets errs drop fifo frame|packets errs drop fifo colls carrier\n");
1005
1006 pos+=size;
1007 len+=size;
1008
1009
1010 for (dev = dev_base; dev != NULL; dev = dev->next)
1011 {
1012 size = sprintf_stats(buffer+len, dev);
1013 len+=size;
1014 pos=begin+len;
1015
1016 if(pos<offset)
1017 {
1018 len=0;
1019 begin=pos;
1020 }
1021 if(pos>offset+length)
1022 break;
1023 }
1024
1025 *start=buffer+(offset-begin);
1026 len-=(offset-begin);
1027 if(len>length)
1028 len=length;
1029 return len;
1030 }
1031
1032
1033
1034
1035
1036
1037 static inline int bad_mask(unsigned long mask, unsigned long addr)
1038 {
1039 if (addr & (mask = ~mask))
1040 return 1;
1041 mask = ntohl(mask);
1042 if (mask & (mask+1))
1043 return 1;
1044 return 0;
1045 }
1046
1047
1048
1049
1050
1051
1052
1053
1054 static int dev_ifsioc(void *arg, unsigned int getset)
1055 {
1056 struct ifreq ifr;
1057 struct device *dev;
1058 int ret;
1059
1060
1061
1062
1063
1064 int err=verify_area(VERIFY_WRITE, arg, sizeof(struct ifreq));
1065 if(err)
1066 return err;
1067
1068 memcpy_fromfs(&ifr, arg, sizeof(struct ifreq));
1069
1070
1071
1072
1073
1074 if ((dev = dev_get(ifr.ifr_name)) == NULL)
1075 return(-ENODEV);
1076
1077 switch(getset)
1078 {
1079 case SIOCGIFFLAGS:
1080 ifr.ifr_flags = dev->flags;
1081 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1082 ret = 0;
1083 break;
1084 case SIOCSIFFLAGS:
1085 {
1086 int old_flags = dev->flags;
1087 #ifdef CONFIG_SLAVE_BALANCING
1088 if(dev->flags&IFF_SLAVE)
1089 return -EBUSY;
1090 #endif
1091 dev->flags = ifr.ifr_flags & (
1092 IFF_UP | IFF_BROADCAST | IFF_DEBUG | IFF_LOOPBACK |
1093 IFF_POINTOPOINT | IFF_NOTRAILERS | IFF_RUNNING |
1094 IFF_NOARP | IFF_PROMISC | IFF_ALLMULTI | IFF_SLAVE | IFF_MASTER
1095 | IFF_MULTICAST);
1096 #ifdef CONFIG_SLAVE_BALANCING
1097 if(!(dev->flags&IFF_MASTER) && dev->slave)
1098 {
1099 dev->slave->flags&=~IFF_SLAVE;
1100 dev->slave=NULL;
1101 }
1102 #endif
1103
1104
1105
1106
1107 dev_mc_upload(dev);
1108 #if 0
1109 if( dev->set_multicast_list!=NULL)
1110 {
1111
1112
1113
1114
1115
1116 if ( (old_flags & IFF_PROMISC) && ((dev->flags & IFF_PROMISC) == 0))
1117 dev->set_multicast_list(dev,0,NULL);
1118
1119
1120
1121
1122
1123 if ( (dev->flags & IFF_PROMISC) && ((old_flags & IFF_PROMISC) == 0))
1124 dev->set_multicast_list(dev,-1,NULL);
1125 }
1126 #endif
1127
1128
1129
1130
1131 if ((old_flags & IFF_UP) && ((dev->flags & IFF_UP) == 0))
1132 {
1133 ret = dev_close(dev);
1134 }
1135 else
1136 {
1137
1138
1139
1140
1141 ret = (! (old_flags & IFF_UP) && (dev->flags & IFF_UP))
1142 ? dev_open(dev) : 0;
1143
1144
1145
1146 if(ret<0)
1147 dev->flags&=~IFF_UP;
1148 }
1149 }
1150 break;
1151
1152 case SIOCGIFADDR:
1153 (*(struct sockaddr_in *)
1154 &ifr.ifr_addr).sin_addr.s_addr = dev->pa_addr;
1155 (*(struct sockaddr_in *)
1156 &ifr.ifr_addr).sin_family = dev->family;
1157 (*(struct sockaddr_in *)
1158 &ifr.ifr_addr).sin_port = 0;
1159 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1160 ret = 0;
1161 break;
1162
1163 case SIOCSIFADDR:
1164 dev->pa_addr = (*(struct sockaddr_in *)
1165 &ifr.ifr_addr).sin_addr.s_addr;
1166 dev->family = ifr.ifr_addr.sa_family;
1167
1168 #ifdef CONFIG_INET
1169
1170
1171 dev->pa_mask = ip_get_mask(dev->pa_addr);
1172 #endif
1173 dev->pa_brdaddr = dev->pa_addr | ~dev->pa_mask;
1174 ret = 0;
1175 break;
1176
1177 case SIOCGIFBRDADDR:
1178 (*(struct sockaddr_in *)
1179 &ifr.ifr_broadaddr).sin_addr.s_addr = dev->pa_brdaddr;
1180 (*(struct sockaddr_in *)
1181 &ifr.ifr_broadaddr).sin_family = dev->family;
1182 (*(struct sockaddr_in *)
1183 &ifr.ifr_broadaddr).sin_port = 0;
1184 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1185 ret = 0;
1186 break;
1187
1188 case SIOCSIFBRDADDR:
1189 dev->pa_brdaddr = (*(struct sockaddr_in *)
1190 &ifr.ifr_broadaddr).sin_addr.s_addr;
1191 ret = 0;
1192 break;
1193
1194 case SIOCGIFDSTADDR:
1195 (*(struct sockaddr_in *)
1196 &ifr.ifr_dstaddr).sin_addr.s_addr = dev->pa_dstaddr;
1197 (*(struct sockaddr_in *)
1198 &ifr.ifr_broadaddr).sin_family = dev->family;
1199 (*(struct sockaddr_in *)
1200 &ifr.ifr_broadaddr).sin_port = 0;
1201 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1202 ret = 0;
1203 break;
1204
1205 case SIOCSIFDSTADDR:
1206 dev->pa_dstaddr = (*(struct sockaddr_in *)
1207 &ifr.ifr_dstaddr).sin_addr.s_addr;
1208 ret = 0;
1209 break;
1210
1211 case SIOCGIFNETMASK:
1212 (*(struct sockaddr_in *)
1213 &ifr.ifr_netmask).sin_addr.s_addr = dev->pa_mask;
1214 (*(struct sockaddr_in *)
1215 &ifr.ifr_netmask).sin_family = dev->family;
1216 (*(struct sockaddr_in *)
1217 &ifr.ifr_netmask).sin_port = 0;
1218 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1219 ret = 0;
1220 break;
1221
1222 case SIOCSIFNETMASK:
1223 {
1224 unsigned long mask = (*(struct sockaddr_in *)
1225 &ifr.ifr_netmask).sin_addr.s_addr;
1226 ret = -EINVAL;
1227
1228
1229
1230 if (bad_mask(mask,0))
1231 break;
1232 dev->pa_mask = mask;
1233 ret = 0;
1234 }
1235 break;
1236
1237 case SIOCGIFMETRIC:
1238
1239 ifr.ifr_metric = dev->metric;
1240 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1241 ret = 0;
1242 break;
1243
1244 case SIOCSIFMETRIC:
1245 dev->metric = ifr.ifr_metric;
1246 ret = 0;
1247 break;
1248
1249 case SIOCGIFMTU:
1250 ifr.ifr_mtu = dev->mtu;
1251 memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
1252 ret = 0;
1253 break;
1254
1255 case SIOCSIFMTU:
1256
1257
1258
1259
1260
1261 if(ifr.ifr_mtu<1 || ifr.ifr_mtu>3800)
1262 return -EINVAL;
1263 dev->mtu = ifr.ifr_mtu;
1264 ret = 0;
1265 break;
1266
1267 case SIOCGIFMEM:
1268
1269 printk("NET: ioctl(SIOCGIFMEM, 0x%08X)\n", (int)arg);
1270 ret = -EINVAL;
1271 break;
1272
1273 case SIOCSIFMEM:
1274 printk("NET: ioctl(SIOCSIFMEM, 0x%08X)\n", (int)arg);
1275 ret = -EINVAL;
1276 break;
1277
1278 case OLD_SIOCGIFHWADDR:
1279 memcpy(ifr.old_ifr_hwaddr,dev->dev_addr, MAX_ADDR_LEN);
1280 memcpy_tofs(arg,&ifr,sizeof(struct ifreq));
1281 ret=0;
1282 break;
1283
1284 case SIOCGIFHWADDR:
1285 memcpy(ifr.ifr_hwaddr.sa_data,dev->dev_addr, MAX_ADDR_LEN);
1286 ifr.ifr_hwaddr.sa_family=dev->type;
1287 memcpy_tofs(arg,&ifr,sizeof(struct ifreq));
1288 ret=0;
1289 break;
1290
1291 case SIOCSIFHWADDR:
1292 if(dev->set_mac_address==NULL)
1293 return -EOPNOTSUPP;
1294 if(ifr.ifr_hwaddr.sa_family!=dev->type)
1295 return -EINVAL;
1296 ret=dev->set_mac_address(dev,ifr.ifr_hwaddr.sa_data);
1297 break;
1298
1299 case SIOCGIFMAP:
1300 ifr.ifr_map.mem_start=dev->mem_start;
1301 ifr.ifr_map.mem_end=dev->mem_end;
1302 ifr.ifr_map.base_addr=dev->base_addr;
1303 ifr.ifr_map.irq=dev->irq;
1304 ifr.ifr_map.dma=dev->dma;
1305 ifr.ifr_map.port=dev->if_port;
1306 memcpy_tofs(arg,&ifr,sizeof(struct ifreq));
1307 ret=0;
1308 break;
1309
1310 case SIOCSIFMAP:
1311 if(dev->set_config==NULL)
1312 return -EOPNOTSUPP;
1313 return dev->set_config(dev,&ifr.ifr_map);
1314
1315 case SIOCGIFSLAVE:
1316 #ifdef CONFIG_SLAVE_BALANCING
1317 if(dev->slave==NULL)
1318 return -ENOENT;
1319 strncpy(ifr.ifr_name,dev->name,sizeof(ifr.ifr_name));
1320 memcpy_tofs(arg,&ifr,sizeof(struct ifreq));
1321 ret=0;
1322 #else
1323 return -ENOENT;
1324 #endif
1325 break;
1326 #ifdef CONFIG_SLAVE_BALANCING
1327 case SIOCSIFSLAVE:
1328 {
1329
1330
1331
1332
1333
1334 unsigned long flags;
1335 struct device *slave=dev_get(ifr.ifr_slave);
1336 save_flags(flags);
1337 if(slave==NULL)
1338 {
1339 return -ENODEV;
1340 }
1341 cli();
1342 if((slave->flags&(IFF_UP|IFF_RUNNING))!=(IFF_UP|IFF_RUNNING))
1343 {
1344 restore_flags(flags);
1345 return -EINVAL;
1346 }
1347 if(dev->flags&IFF_SLAVE)
1348 {
1349 restore_flags(flags);
1350 return -EBUSY;
1351 }
1352 if(dev->slave!=NULL)
1353 {
1354 restore_flags(flags);
1355 return -EBUSY;
1356 }
1357 if(slave->flags&IFF_SLAVE)
1358 {
1359 restore_flags(flags);
1360 return -EBUSY;
1361 }
1362 dev->slave=slave;
1363 slave->flags|=IFF_SLAVE;
1364 dev->flags|=IFF_MASTER;
1365 restore_flags(flags);
1366 ret=0;
1367 }
1368 break;
1369 #endif
1370
1371 case SIOCADDMULTI:
1372 if(dev->set_multicast_list==NULL)
1373 return -EINVAL;
1374 if(ifr.ifr_hwaddr.sa_family!=AF_UNSPEC)
1375 return -EINVAL;
1376 dev_mc_add(dev,ifr.ifr_hwaddr.sa_data, dev->addr_len, 1);
1377 return 0;
1378
1379 case SIOCDELMULTI:
1380 if(dev->set_multicast_list==NULL)
1381 return -EINVAL;
1382 if(ifr.ifr_hwaddr.sa_family!=AF_UNSPEC)
1383 return -EINVAL;
1384 dev_mc_delete(dev,ifr.ifr_hwaddr.sa_data,dev->addr_len, 1);
1385 return 0;
1386
1387
1388
1389
1390 default:
1391 if((getset >= SIOCDEVPRIVATE) &&
1392 (getset <= (SIOCDEVPRIVATE + 15))) {
1393 if(dev->do_ioctl==NULL)
1394 return -EOPNOTSUPP;
1395 ret=dev->do_ioctl(dev, &ifr, getset);
1396 memcpy_tofs(arg,&ifr,sizeof(struct ifreq));
1397 break;
1398 }
1399
1400 ret = -EINVAL;
1401 }
1402 return(ret);
1403 }
1404
1405
1406
1407
1408
1409
1410
1411 int dev_ioctl(unsigned int cmd, void *arg)
1412 {
1413 switch(cmd)
1414 {
1415 case SIOCGIFCONF:
1416 (void) dev_ifconf((char *) arg);
1417 return 0;
1418
1419
1420
1421
1422
1423 case SIOCGIFFLAGS:
1424 case SIOCGIFADDR:
1425 case SIOCGIFDSTADDR:
1426 case SIOCGIFBRDADDR:
1427 case SIOCGIFNETMASK:
1428 case SIOCGIFMETRIC:
1429 case SIOCGIFMTU:
1430 case SIOCGIFMEM:
1431 case SIOCGIFHWADDR:
1432 case SIOCSIFHWADDR:
1433 case OLD_SIOCGIFHWADDR:
1434 case SIOCGIFSLAVE:
1435 case SIOCGIFMAP:
1436 return dev_ifsioc(arg, cmd);
1437
1438
1439
1440
1441
1442 case SIOCSIFFLAGS:
1443 case SIOCSIFADDR:
1444 case SIOCSIFDSTADDR:
1445 case SIOCSIFBRDADDR:
1446 case SIOCSIFNETMASK:
1447 case SIOCSIFMETRIC:
1448 case SIOCSIFMTU:
1449 case SIOCSIFMEM:
1450 case SIOCSIFMAP:
1451 case SIOCSIFSLAVE:
1452 case SIOCADDMULTI:
1453 case SIOCDELMULTI:
1454 if (!suser())
1455 return -EPERM;
1456 return dev_ifsioc(arg, cmd);
1457
1458 case SIOCSIFLINK:
1459 return -EINVAL;
1460
1461
1462
1463
1464
1465 default:
1466 if((cmd >= SIOCDEVPRIVATE) &&
1467 (cmd <= (SIOCDEVPRIVATE + 15))) {
1468 return dev_ifsioc(arg, cmd);
1469 }
1470 return -EINVAL;
1471 }
1472 }
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485 void dev_init(void)
1486 {
1487 struct device *dev, *dev2;
1488
1489
1490
1491
1492
1493
1494
1495
1496 dev2 = NULL;
1497 for (dev = dev_base; dev != NULL; dev=dev->next)
1498 {
1499 if (dev->init && dev->init(dev))
1500 {
1501
1502
1503
1504
1505 if (dev2 == NULL)
1506 dev_base = dev->next;
1507 else
1508 dev2->next = dev->next;
1509 }
1510 else
1511 {
1512 dev2 = dev;
1513 }
1514 }
1515 }