Annotation of Gnu-Mach/i386/i386at/gpl/linux/net/dev.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     NET3    Protocol independent device support routines.
                      3:  *
                      4:  *             This program is free software; you can redistribute it and/or
                      5:  *             modify it under the terms of the GNU General Public License
                      6:  *             as published by the Free Software Foundation; either version
                      7:  *             2 of the License, or (at your option) any later version.
                      8:  *
                      9:  *     Derived from the non IP parts of dev.c 1.0.19
                     10:  *             Authors:        Ross Biro, <[email protected]>
                     11:  *                             Fred N. van Kempen, <[email protected]>
                     12:  *                             Mark Evans, <[email protected]>
                     13:  *
                     14:  *     Additional Authors:
                     15:  *             Florian la Roche <[email protected]>
                     16:  *             Alan Cox <[email protected]>
                     17:  *             David Hinds <[email protected]>
                     18:  *
                     19:  *     Changes:
                     20:  *             Alan Cox        :       device private ioctl copies fields back.
                     21:  *             Alan Cox        :       Transmit queue code does relevant stunts to
                     22:  *                                     keep the queue safe.
                     23:  *             Alan Cox        :       Fixed double lock.
                     24:  *             Alan Cox        :       Fixed promisc NULL pointer trap
                     25:  *             ????????        :       Support the full private ioctl range
                     26:  *             Alan Cox        :       Moved ioctl permission check into drivers
                     27:  *             Tim Kordas      :       SIOCADDMULTI/SIOCDELMULTI
                     28:  *             Alan Cox        :       100 backlog just doesn't cut it when
                     29:  *                                     you start doing multicast video 8)
                     30:  *             Alan Cox        :       Rewrote net_bh and list manager.
                     31:  *             Alan Cox        :       Fix ETH_P_ALL echoback lengths.
                     32:  *             Alan Cox        :       Took out transmit every packet pass
                     33:  *                                     Saved a few bytes in the ioctl handler
                     34:  *             Alan Cox        :       Network driver sets packet type before calling netif_rx. Saves
                     35:  *                                     a function call a packet.
                     36:  *             Alan Cox        :       Hashed net_bh()
                     37:  *             Richard Kooijman:       Timestamp fixes.
                     38:  *             Alan Cox        :       Wrong field in SIOCGIFDSTADDR
                     39:  *             Alan Cox        :       Device lock protection.
                     40:  *             Alan Cox        :       Fixed nasty side effect of device close changes.
                     41:  *             Rudi Cilibrasi  :       Pass the right thing to set_mac_address()
                     42:  *             Dave Miller     :       32bit quantity for the device lock to make it work out
                     43:  *                                     on a Sparc.
                     44:  *             Bjorn Ekwall    :       Added KERNELD hack.
                     45:  *             Alan Cox        :       Cleaned up the backlog initialise.
                     46:  *             Craig Metz      :       SIOCGIFCONF fix if space for under
                     47:  *                                     1 device.
                     48:  *
                     49:  */
                     50: 
                     51: #include <asm/segment.h>
                     52: #include <asm/system.h>
                     53: #include <asm/bitops.h>
                     54: #include <linux/config.h>
                     55: #include <linux/types.h>
                     56: #include <linux/kernel.h>
                     57: #include <linux/sched.h>
                     58: #include <linux/string.h>
                     59: #include <linux/mm.h>
                     60: #include <linux/socket.h>
                     61: #include <linux/sockios.h>
                     62: #include <linux/in.h>
                     63: #include <linux/errno.h>
                     64: #include <linux/interrupt.h>
                     65: #include <linux/if_ether.h>
                     66: #include <linux/inet.h>
                     67: #include <linux/netdevice.h>
                     68: #include <linux/etherdevice.h>
                     69: #include <linux/notifier.h>
                     70: #include <net/ip.h>
                     71: #include <net/route.h>
                     72: #include <linux/skbuff.h>
                     73: #include <net/sock.h>
                     74: #include <net/arp.h>
                     75: #include <net/slhc.h>
                     76: #include <linux/proc_fs.h>
                     77: #include <linux/stat.h>
                     78: #ifdef CONFIG_NET_ALIAS
                     79: #include <linux/net_alias.h>
                     80: #endif
                     81: #ifdef CONFIG_KERNELD
                     82: #include <linux/kerneld.h>
                     83: #endif
                     84: 
                     85: #ifndef MACH
                     86: /*
                     87:  *     The list of packet types we will receive (as opposed to discard)
                     88:  *     and the routines to invoke.
                     89:  */
                     90: 
                     91: struct packet_type *ptype_base[16];
                     92: struct packet_type *ptype_all = NULL;          /* Taps */
                     93: 
                     94: /*
                     95:  *     Device list lock
                     96:  */
                     97:  
                     98: int dev_lockct=0;
                     99:  
                    100: /*
                    101:  *     Our notifier list
                    102:  */
                    103:  
                    104: struct notifier_block *netdev_chain=NULL;
                    105: 
                    106: /*
                    107:  *     Device drivers call our routines to queue packets here. We empty the
                    108:  *     queue in the bottom half handler.
                    109:  */
                    110: 
                    111: static struct sk_buff_head backlog;
                    112: 
                    113: /* 
                    114:  *     We don't overdo the queue or we will thrash memory badly.
                    115:  */
                    116:  
                    117: static int backlog_size = 0;
                    118: 
                    119: /*
                    120:  *     Return the lesser of the two values. 
                    121:  */
                    122:  
                    123: static __inline__ unsigned long min(unsigned long a, unsigned long b)
                    124: {
                    125:        return (a < b)? a : b;
                    126: }
                    127: 
                    128: 
                    129: /******************************************************************************************
                    130: 
                    131:                Protocol management and registration routines
                    132: 
                    133: *******************************************************************************************/
                    134: 
                    135: /*
                    136:  *     For efficiency
                    137:  */
                    138: 
                    139: static int dev_nit=0;
                    140: 
                    141: /*
                    142:  *     Add a protocol ID to the list. Now that the input handler is
                    143:  *     smarter we can dispense with all the messy stuff that used to be
                    144:  *     here.
                    145:  */
                    146:  
                    147: void dev_add_pack(struct packet_type *pt)
                    148: {
                    149:        int hash;
                    150:        if(pt->type==htons(ETH_P_ALL))
                    151:        {
                    152:                dev_nit++;
                    153:                pt->next=ptype_all;
                    154:                ptype_all=pt;
                    155:        }
                    156:        else
                    157:        {       
                    158:                hash=ntohs(pt->type)&15;
                    159:                pt->next = ptype_base[hash];
                    160:                ptype_base[hash] = pt;
                    161:        }
                    162: }
                    163: 
                    164: 
                    165: /*
                    166:  *     Remove a protocol ID from the list.
                    167:  */
                    168:  
                    169: void dev_remove_pack(struct packet_type *pt)
                    170: {
                    171:        struct packet_type **pt1;
                    172:        if(pt->type==htons(ETH_P_ALL))
                    173:        {
                    174:                dev_nit--;
                    175:                pt1=&ptype_all;
                    176:        }
                    177:        else
                    178:                pt1=&ptype_base[ntohs(pt->type)&15];
                    179:        for(; (*pt1)!=NULL; pt1=&((*pt1)->next))
                    180:        {
                    181:                if(pt==(*pt1))
                    182:                {
                    183:                        *pt1=pt->next;
                    184:                        return;
                    185:                }
                    186:        }
                    187:        printk("dev_remove_pack: %p not found.\n", pt);
                    188: }
                    189: 
                    190: /*****************************************************************************************
                    191: 
                    192:                            Device Interface Subroutines
                    193: 
                    194: ******************************************************************************************/
                    195: 
                    196: /* 
                    197:  *     Find an interface by name.
                    198:  */
                    199:  
                    200: struct device *dev_get(const char *name)
                    201: {
                    202:        struct device *dev;
                    203: 
                    204:        for (dev = dev_base; dev != NULL; dev = dev->next) 
                    205:        {
                    206:                if (strcmp(dev->name, name) == 0)
                    207:                        return(dev);
                    208:        }
                    209:        return NULL;
                    210: }
                    211:        
                    212: /*
                    213:  *     Find and possibly load an interface.
                    214:  */
                    215:  
                    216: #ifdef CONFIG_KERNELD
                    217: 
                    218: extern __inline__ void dev_load(const char *name)
                    219: {
                    220:         char *sptr;
                    221:  
                    222:         if(!dev_get(name)) {
                    223: #ifdef CONFIG_NET_ALIAS
                    224:                 for (sptr=name ; *sptr ; sptr++) if(*sptr==':') break;
                    225:                 if (!(*sptr && *(sptr+1)))
                    226: #endif
                    227:                         request_module(name);
                    228:         }
                    229: }
                    230: 
                    231: #endif
                    232:  
                    233: /*
                    234:  *     Prepare an interface for use. 
                    235:  */
                    236:  
                    237: int dev_open(struct device *dev)
                    238: {
                    239:        int ret = 0;
                    240: 
                    241:        /*
                    242:         *      Call device private open method
                    243:         */
                    244:        if (dev->open) 
                    245:                ret = dev->open(dev);
                    246: 
                    247:        /*
                    248:         *      If it went open OK then set the flags
                    249:         */
                    250:         
                    251:        if (ret == 0) 
                    252:        {
                    253:                dev->flags |= (IFF_UP | IFF_RUNNING);
                    254:                /*
                    255:                 *      Initialise multicasting status 
                    256:                 */
                    257:                dev_mc_upload(dev);
                    258:                notifier_call_chain(&netdev_chain, NETDEV_UP, dev);
                    259:        }
                    260:        return(ret);
                    261: }
                    262: 
                    263: 
                    264: /*
                    265:  *     Completely shutdown an interface.
                    266:  */
                    267:  
                    268: int dev_close(struct device *dev)
                    269: {
                    270:        int ct=0;
                    271: 
                    272:        /*
                    273:         *      Call the device specific close. This cannot fail.
                    274:         *      Only if device is UP
                    275:         */
                    276:         
                    277:        if ((dev->flags & IFF_UP) && dev->stop)
                    278:                dev->stop(dev);
                    279: 
                    280:        /*
                    281:         *      Device is now down.
                    282:         */
                    283:         
                    284:        dev->flags&=~(IFF_UP|IFF_RUNNING);
                    285: 
                    286:        /*
                    287:         *      Tell people we are going down
                    288:         */
                    289:        notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev);
                    290:        /*
                    291:         *      Flush the multicast chain
                    292:         */
                    293:        dev_mc_discard(dev);
                    294:        /*
                    295:         *      Blank the IP addresses
                    296:         */
                    297:        dev->pa_addr = 0;
                    298:        dev->pa_dstaddr = 0;
                    299:        dev->pa_brdaddr = 0;
                    300:        dev->pa_mask = 0;
                    301:        /*
                    302:         *      Purge any queued packets when we down the link 
                    303:         */
                    304:        while(ct<DEV_NUMBUFFS)
                    305:        {
                    306:                struct sk_buff *skb;
                    307:                while((skb=skb_dequeue(&dev->buffs[ct]))!=NULL)
                    308:                        if(skb->free)
                    309:                                kfree_skb(skb,FREE_WRITE);
                    310:                ct++;
                    311:        }
                    312:        return(0);
                    313: }
                    314: 
                    315: 
                    316: /*
                    317:  *     Device change register/unregister. These are not inline or static
                    318:  *     as we export them to the world.
                    319:  */
                    320: 
                    321: int register_netdevice_notifier(struct notifier_block *nb)
                    322: {
                    323:        return notifier_chain_register(&netdev_chain, nb);
                    324: }
                    325: 
                    326: int unregister_netdevice_notifier(struct notifier_block *nb)
                    327: {
                    328:        return notifier_chain_unregister(&netdev_chain,nb);
                    329: }
                    330: 
                    331: /*
                    332:  *     Send (or queue for sending) a packet. 
                    333:  *
                    334:  *     IMPORTANT: When this is called to resend frames. The caller MUST
                    335:  *     already have locked the sk_buff. Apart from that we do the
                    336:  *     rest of the magic.
                    337:  */
                    338: 
                    339: void dev_queue_xmit(struct sk_buff *skb, struct device *dev, int pri)
                    340: {
                    341:        unsigned long flags;
                    342:        struct sk_buff_head *list;
                    343:        int retransmission = 0; /* used to say if the packet should go  */
                    344:                                /* at the front or the back of the      */
                    345:                                /* queue - front is a retransmit try    */
                    346: 
                    347:        if(pri>=0 && !skb_device_locked(skb))
                    348:                skb_device_lock(skb);   /* Shove a lock on the frame */
                    349: #if CONFIG_SKB_CHECK 
                    350:        IS_SKB(skb);
                    351: #endif    
                    352:        skb->dev = dev;
                    353: 
                    354:        /*
                    355:         *      Negative priority is used to flag a frame that is being pulled from the
                    356:         *      queue front as a retransmit attempt. It therefore goes back on the queue
                    357:         *      start on a failure.
                    358:         */
                    359:         
                    360:        if (pri < 0) 
                    361:        {
                    362:                pri = -pri-1;
                    363:                retransmission = 1;
                    364:        }
                    365: 
                    366: #ifdef CONFIG_NET_DEBUG
                    367:        if (pri >= DEV_NUMBUFFS) 
                    368:        {
                    369:                printk("bad priority in dev_queue_xmit.\n");
                    370:                pri = 1;
                    371:        }
                    372: #endif
                    373: 
                    374:        /*
                    375:         *      If the address has not been resolved. Call the device header rebuilder.
                    376:         *      This can cover all protocols and technically not just ARP either.
                    377:         */
                    378:         
                    379:        if (!skb->arp && dev->rebuild_header(skb->data, dev, skb->raddr, skb)) {
                    380:                return;
                    381:        }
                    382: 
                    383:        /*
                    384:         *
                    385:         *      If dev is an alias, switch to its main device.
                    386:         *      "arp" resolution has been made with alias device, so
                    387:         *      arp entries refer to alias, not main.
                    388:         *
                    389:         */
                    390: 
                    391: #ifdef CONFIG_NET_ALIAS
                    392:        if (net_alias_is(dev))
                    393:                skb->dev = dev = net_alias_main_dev(dev);
                    394: #endif
                    395:        list = dev->buffs + pri;
                    396: 
                    397:        save_flags(flags);
                    398:        /* if this isn't a retransmission, use the first packet instead... */
                    399:        if (!retransmission) {
                    400:                if (skb_queue_len(list)) {
                    401:                        /* avoid overrunning the device queue.. */
                    402:                        if (skb_queue_len(list) > dev->tx_queue_len) {
                    403:                                dev_kfree_skb(skb, FREE_WRITE);
                    404:                                return;
                    405:                        }
                    406:                        cli();
                    407:                        skb_device_unlock(skb);         /* Buffer is on the device queue and can be freed safely */
                    408:                        __skb_queue_tail(list, skb);
                    409:                        skb = __skb_dequeue(list);
                    410:                        skb_device_lock(skb);           /* New buffer needs locking down */
                    411:                        restore_flags(flags);
                    412:                }
                    413:                
                    414:                /* copy outgoing packets to any sniffer packet handlers */
                    415:                if (dev_nit) {
                    416:                        struct packet_type *ptype;
                    417:                        skb->stamp=xtime;
                    418:                        for (ptype = ptype_all; ptype!=NULL; ptype = ptype->next) 
                    419:                        {
                    420:                                /* Never send packets back to the socket
                    421:                                 * they originated from - MvS ([email protected])
                    422:                                 */
                    423:                                if ((ptype->dev == dev || !ptype->dev) &&
                    424:                                   ((struct sock *)ptype->data != skb->sk))
                    425:                                {
                    426:                                        struct sk_buff *skb2;
                    427:                                        if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL)
                    428:                                                break;
                    429:                                        skb2->h.raw = skb2->data + dev->hard_header_len;
                    430:                                        skb2->mac.raw = skb2->data;
                    431:                                        ptype->func(skb2, skb->dev, ptype);
                    432:                                }
                    433:                        }
                    434:                }
                    435:        }
                    436:        start_bh_atomic();
                    437:        if (dev->hard_start_xmit(skb, dev) == 0) {
                    438:                /*
                    439:                 *      Packet is now solely the responsibility of the driver
                    440:                 */
                    441:                end_bh_atomic();
                    442:                return;
                    443:        }
                    444:        end_bh_atomic();
                    445: 
                    446:        /*
                    447:         *      Transmission failed, put skb back into a list. Once on the list it's safe and
                    448:         *      no longer device locked (it can be freed safely from the device queue)
                    449:         */
                    450:        cli();
                    451:        skb_device_unlock(skb);
                    452:        __skb_queue_head(list,skb);
                    453:        restore_flags(flags);
                    454: }
                    455: 
                    456: /*
                    457:  *     Receive a packet from a device driver and queue it for the upper
                    458:  *     (protocol) levels.  It always succeeds. This is the recommended 
                    459:  *     interface to use.
                    460:  */
                    461: 
                    462: void netif_rx(struct sk_buff *skb)
                    463: {
                    464:        static int dropping = 0;
                    465: 
                    466:        /*
                    467:         *      Any received buffers are un-owned and should be discarded
                    468:         *      when freed. These will be updated later as the frames get
                    469:         *      owners.
                    470:         */
                    471: 
                    472:        skb->sk = NULL;
                    473:        skb->free = 1;
                    474:        if(skb->stamp.tv_sec==0)
                    475:                skb->stamp = xtime;
                    476: 
                    477:        /*
                    478:         *      Check that we aren't overdoing things.
                    479:         */
                    480: 
                    481:        if (!backlog_size)
                    482:                dropping = 0;
                    483:        else if (backlog_size > 300)
                    484:                dropping = 1;
                    485: 
                    486:        if (dropping) 
                    487:        {
                    488:                kfree_skb(skb, FREE_READ);
                    489:                return;
                    490:        }
                    491: 
                    492:        /*
                    493:         *      Add it to the "backlog" queue. 
                    494:         */
                    495: #if CONFIG_SKB_CHECK
                    496:        IS_SKB(skb);
                    497: #endif 
                    498:        skb_queue_tail(&backlog,skb);
                    499:        backlog_size++;
                    500:   
                    501:        /*
                    502:         *      If any packet arrived, mark it for processing after the
                    503:         *      hardware interrupt returns.
                    504:         */
                    505: 
                    506: #ifdef CONFIG_NET_RUNONIRQ     /* Dont enable yet, needs some driver mods */
                    507:        net_bh();
                    508: #else
                    509:        mark_bh(NET_BH);
                    510: #endif
                    511:        return;
                    512: }
                    513: 
                    514: /*
                    515:  *     This routine causes all interfaces to try to send some data. 
                    516:  */
                    517:  
                    518: void dev_transmit(void)
                    519: {
                    520:        struct device *dev;
                    521: 
                    522:        for (dev = dev_base; dev != NULL; dev = dev->next)
                    523:        {
                    524:                if (dev->flags != 0 && !dev->tbusy) {
                    525:                        /*
                    526:                         *      Kick the device
                    527:                         */
                    528:                        dev_tint(dev);
                    529:                }
                    530:        }
                    531: }
                    532: 
                    533: 
                    534: /**********************************************************************************
                    535: 
                    536:                        Receive Queue Processor
                    537:                        
                    538: ***********************************************************************************/
                    539: 
                    540: /*
                    541:  *     This is a single non-reentrant routine which takes the received packet
                    542:  *     queue and throws it at the networking layers in the hope that something
                    543:  *     useful will emerge.
                    544:  */
                    545:  
                    546: volatile unsigned long in_bh = 0;      /* Non-reentrant remember */
                    547: 
                    548: int in_net_bh()        /* Used by timer.c */
                    549: {
                    550:        return(in_bh==0?0:1);
                    551: }
                    552: 
                    553: /*
                    554:  *     When we are called the queue is ready to grab, the interrupts are
                    555:  *     on and hardware can interrupt and queue to the receive queue a we
                    556:  *     run with no problems.
                    557:  *     This is run as a bottom half after an interrupt handler that does
                    558:  *     mark_bh(NET_BH);
                    559:  */
                    560:  
                    561: void net_bh(void *tmp)
                    562: {
                    563:        struct sk_buff *skb;
                    564:        struct packet_type *ptype;
                    565:        struct packet_type *pt_prev;
                    566:        unsigned short type;
                    567: 
                    568:        /*
                    569:         *      Atomically check and mark our BUSY state. 
                    570:         */
                    571: 
                    572:        if (set_bit(1, (void*)&in_bh))
                    573:                return;
                    574: 
                    575:        /*
                    576:         *      Can we send anything now? We want to clear the
                    577:         *      decks for any more sends that get done as we
                    578:         *      process the input. This also minimises the
                    579:         *      latency on a transmit interrupt bh.
                    580:         */
                    581: 
                    582:        dev_transmit();
                    583:   
                    584:        /*
                    585:         *      Any data left to process. This may occur because a
                    586:         *      mark_bh() is done after we empty the queue including
                    587:         *      that from the device which does a mark_bh() just after
                    588:         */
                    589: 
                    590:        cli();
                    591:        
                    592:        /*
                    593:         *      While the queue is not empty
                    594:         */
                    595:         
                    596:        while((skb=__skb_dequeue(&backlog))!=NULL)
                    597:        {
                    598:                /*
                    599:                 *      We have a packet. Therefore the queue has shrunk
                    600:                 */
                    601:                backlog_size--;
                    602: 
                    603:                sti();
                    604:                
                    605:               /*
                    606:                *       Bump the pointer to the next structure.
                    607:                *
                    608:                *       On entry to the protocol layer. skb->data and
                    609:                *       skb->h.raw point to the MAC and encapsulated data
                    610:                */
                    611: 
                    612:                skb->h.raw = skb->data;
                    613: 
                    614:               /*
                    615:                *       Fetch the packet protocol ID. 
                    616:                */
                    617:                
                    618:                type = skb->protocol;
                    619: 
                    620:                /*
                    621:                 *      We got a packet ID.  Now loop over the "known protocols"
                    622:                 *      list. There are two lists. The ptype_all list of taps (normally empty)
                    623:                 *      and the main protocol list which is hashed perfectly for normal protocols.
                    624:                 */
                    625:                pt_prev = NULL;
                    626:                for (ptype = ptype_all; ptype!=NULL; ptype=ptype->next)
                    627:                {
                    628:                        if(pt_prev)
                    629:                        {
                    630:                                struct sk_buff *skb2=skb_clone(skb, GFP_ATOMIC);
                    631:                                if(skb2)
                    632:                                        pt_prev->func(skb2,skb->dev, pt_prev);
                    633:                        }
                    634:                        pt_prev=ptype;
                    635:                }
                    636:                
                    637:                for (ptype = ptype_base[ntohs(type)&15]; ptype != NULL; ptype = ptype->next) 
                    638:                {
                    639:                        if (ptype->type == type && (!ptype->dev || ptype->dev==skb->dev))
                    640:                        {
                    641:                                /*
                    642:                                 *      We already have a match queued. Deliver
                    643:                                 *      to it and then remember the new match
                    644:                                 */
                    645:                                if(pt_prev)
                    646:                                {
                    647:                                        struct sk_buff *skb2;
                    648: 
                    649:                                        skb2=skb_clone(skb, GFP_ATOMIC);
                    650: 
                    651:                                        /*
                    652:                                         *      Kick the protocol handler. This should be fast
                    653:                                         *      and efficient code.
                    654:                                         */
                    655: 
                    656:                                        if(skb2)
                    657:                                                pt_prev->func(skb2, skb->dev, pt_prev);
                    658:                                }
                    659:                                /* Remember the current last to do */
                    660:                                pt_prev=ptype;
                    661:                        }
                    662:                } /* End of protocol list loop */
                    663:                
                    664:                /*
                    665:                 *      Is there a last item to send to ?
                    666:                 */
                    667: 
                    668:                if(pt_prev)
                    669:                        pt_prev->func(skb, skb->dev, pt_prev);
                    670:                /*
                    671:                 *      Has an unknown packet has been received ?
                    672:                 */
                    673:         
                    674:                else
                    675:                        kfree_skb(skb, FREE_WRITE);
                    676: 
                    677:                /*
                    678:                 *      Again, see if we can transmit anything now. 
                    679:                 *      [Ought to take this out judging by tests it slows
                    680:                 *       us down not speeds us up]
                    681:                 */
                    682: #ifdef XMIT_EVERY
                    683:                dev_transmit();
                    684: #endif         
                    685:                cli();
                    686:        }       /* End of queue loop */
                    687:        
                    688:        /*
                    689:         *      We have emptied the queue
                    690:         */
                    691:         
                    692:        in_bh = 0;
                    693:        sti();
                    694:        
                    695:        /*
                    696:         *      One last output flush.
                    697:         */
                    698: 
                    699: #ifdef XMIT_AFTER       
                    700:        dev_transmit();
                    701: #endif
                    702: }
                    703: 
                    704: 
                    705: /*
                    706:  *     This routine is called when an device driver (i.e. an
                    707:  *     interface) is ready to transmit a packet.
                    708:  */
                    709:  
                    710: void dev_tint(struct device *dev)
                    711: {
                    712:        int i;
                    713:        unsigned long flags;
                    714:        struct sk_buff_head * head;
                    715:        
                    716:        /*
                    717:         * aliases do not transmit (for now :) )
                    718:         */
                    719: 
                    720: #ifdef CONFIG_NET_ALIAS
                    721:        if (net_alias_is(dev)) return;
                    722: #endif
                    723:        head = dev->buffs;
                    724:        save_flags(flags);
                    725:        cli();
                    726: 
                    727:        /*
                    728:         *      Work the queues in priority order
                    729:         */      
                    730:        for(i = 0;i < DEV_NUMBUFFS; i++,head++)
                    731:        {
                    732:                struct sk_buff *skb = skb_peek(head);
                    733: 
                    734:                if (skb) {
                    735:                        __skb_unlink(skb, head);
                    736:                        /*
                    737:                         *      Stop anyone freeing the buffer while we retransmit it
                    738:                         */
                    739:                        skb_device_lock(skb);
                    740:                        restore_flags(flags);
                    741:                        /*
                    742:                         *      Feed them to the output stage and if it fails
                    743:                         *      indicate they re-queue at the front.
                    744:                         */
                    745:                        dev_queue_xmit(skb,dev,-i - 1);
                    746:                        /*
                    747:                         *      If we can take no more then stop here.
                    748:                         */
                    749:                        if (dev->tbusy)
                    750:                                return;
                    751:                        cli();
                    752:                }
                    753:        }
                    754:        restore_flags(flags);
                    755: }
                    756: 
                    757: 
                    758: /*
                    759:  *     Perform a SIOCGIFCONF call. This structure will change
                    760:  *     size shortly, and there is nothing I can do about it.
                    761:  *     Thus we will need a 'compatibility mode'.
                    762:  */
                    763: 
                    764: static int dev_ifconf(char *arg)
                    765: {
                    766:        struct ifconf ifc;
                    767:        struct ifreq ifr;
                    768:        struct device *dev;
                    769:        char *pos;
                    770:        int len;
                    771:        int err;
                    772: 
                    773:        /*
                    774:         *      Fetch the caller's info block. 
                    775:         */
                    776:         
                    777:        err=verify_area(VERIFY_WRITE, arg, sizeof(struct ifconf));
                    778:        if(err)
                    779:                return err;
                    780:        memcpy_fromfs(&ifc, arg, sizeof(struct ifconf));
                    781:        len = ifc.ifc_len;
                    782:        pos = ifc.ifc_buf;
                    783: 
                    784:        /*
                    785:         *      We now walk the device list filling each active device
                    786:         *      into the array.
                    787:         */
                    788:         
                    789:        err=verify_area(VERIFY_WRITE,pos,len);
                    790:        if(err)
                    791:                return err;
                    792:        
                    793:        /*
                    794:         *      Loop over the interfaces, and write an info block for each. 
                    795:         */
                    796: 
                    797:        for (dev = dev_base; dev != NULL; dev = dev->next) 
                    798:        {
                    799:                if(!(dev->flags & IFF_UP))      /* Downed devices don't count */
                    800:                        continue;
                    801:                /*
                    802:                 *      Have we run out of space here ?
                    803:                 */
                    804:        
                    805:                if (len < sizeof(struct ifreq)) 
                    806:                        break;
                    807: 
                    808:                memset(&ifr, 0, sizeof(struct ifreq));
                    809:                strcpy(ifr.ifr_name, dev->name);
                    810:                (*(struct sockaddr_in *) &ifr.ifr_addr).sin_family = dev->family;
                    811:                (*(struct sockaddr_in *) &ifr.ifr_addr).sin_addr.s_addr = dev->pa_addr;
                    812: 
                    813: 
                    814:                /*
                    815:                 *      Write this block to the caller's space. 
                    816:                 */
                    817:                 
                    818:                memcpy_tofs(pos, &ifr, sizeof(struct ifreq));
                    819:                pos += sizeof(struct ifreq);
                    820:                len -= sizeof(struct ifreq);            
                    821:        }
                    822: 
                    823:        /*
                    824:         *      All done.  Write the updated control block back to the caller. 
                    825:         */
                    826:         
                    827:        ifc.ifc_len = (pos - ifc.ifc_buf);
                    828:        ifc.ifc_req = (struct ifreq *) ifc.ifc_buf;
                    829:        memcpy_tofs(arg, &ifc, sizeof(struct ifconf));
                    830:        
                    831:        /*
                    832:         *      Report how much was filled in
                    833:         */
                    834:         
                    835:        return(pos - arg);
                    836: }
                    837: 
                    838: 
                    839: /*
                    840:  *     This is invoked by the /proc filesystem handler to display a device
                    841:  *     in detail.
                    842:  */
                    843: 
                    844: #ifdef CONFIG_PROC_FS
                    845: static int sprintf_stats(char *buffer, struct device *dev)
                    846: {
                    847:        struct enet_statistics *stats = (dev->get_stats ? dev->get_stats(dev): NULL);
                    848:        int size;
                    849:        
                    850:        if (stats)
                    851:                size = sprintf(buffer, "%6s:%7d %4d %4d %4d %4d %8d %4d %4d %4d %5d %4d\n",
                    852:                   dev->name,
                    853:                   stats->rx_packets, stats->rx_errors,
                    854:                   stats->rx_dropped + stats->rx_missed_errors,
                    855:                   stats->rx_fifo_errors,
                    856:                   stats->rx_length_errors + stats->rx_over_errors
                    857:                   + stats->rx_crc_errors + stats->rx_frame_errors,
                    858:                   stats->tx_packets, stats->tx_errors, stats->tx_dropped,
                    859:                   stats->tx_fifo_errors, stats->collisions,
                    860:                   stats->tx_carrier_errors + stats->tx_aborted_errors
                    861:                   + stats->tx_window_errors + stats->tx_heartbeat_errors);
                    862:        else
                    863:                size = sprintf(buffer, "%6s: No statistics available.\n", dev->name);
                    864: 
                    865:        return size;
                    866: }
                    867: 
                    868: /*
                    869:  *     Called from the PROCfs module. This now uses the new arbitrary sized /proc/net interface
                    870:  *     to create /proc/net/dev
                    871:  */
                    872:  
                    873: int dev_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
                    874: {
                    875:        int len=0;
                    876:        off_t begin=0;
                    877:        off_t pos=0;
                    878:        int size;
                    879:        
                    880:        struct device *dev;
                    881: 
                    882: 
                    883:        size = sprintf(buffer, "Inter-|   Receive                  |  Transmit\n"
                    884:                            " face |packets errs drop fifo frame|packets errs drop fifo colls carrier\n");
                    885:        
                    886:        pos+=size;
                    887:        len+=size;
                    888:        
                    889: 
                    890:        for (dev = dev_base; dev != NULL; dev = dev->next) 
                    891:        {
                    892:                size = sprintf_stats(buffer+len, dev);
                    893:                len+=size;
                    894:                pos=begin+len;
                    895:                                
                    896:                if(pos<offset)
                    897:                {
                    898:                        len=0;
                    899:                        begin=pos;
                    900:                }
                    901:                if(pos>offset+length)
                    902:                        break;
                    903:        }
                    904:        
                    905:        *start=buffer+(offset-begin);   /* Start of wanted data */
                    906:        len-=(offset-begin);            /* Start slop */
                    907:        if(len>length)
                    908:                len=length;             /* Ending slop */
                    909:        return len;
                    910: }
                    911: #endif /* CONFIG_PROC_FS */
                    912: 
                    913: 
                    914: /*
                    915:  *     This checks bitmasks for the ioctl calls for devices.
                    916:  */
                    917:  
                    918: static inline int bad_mask(unsigned long mask, unsigned long addr)
                    919: {
                    920:        if (addr & (mask = ~mask))
                    921:                return 1;
                    922:        mask = ntohl(mask);
                    923:        if (mask & (mask+1))
                    924:                return 1;
                    925:        return 0;
                    926: }
                    927: 
                    928: /*
                    929:  *     Perform the SIOCxIFxxx calls. 
                    930:  *
                    931:  *     The socket layer has seen an ioctl the address family thinks is
                    932:  *     for the device. At this point we get invoked to make a decision
                    933:  */
                    934:  
                    935: static int dev_ifsioc(void *arg, unsigned int getset)
                    936: {
                    937:        struct ifreq ifr;
                    938:        struct device *dev;
                    939:        int ret;
                    940: 
                    941:        /*
                    942:         *      Fetch the caller's info block into kernel space
                    943:         */
                    944: 
                    945:        int err=verify_area(VERIFY_WRITE, arg, sizeof(struct ifreq));
                    946:        if(err)
                    947:                return err;
                    948:        
                    949:        memcpy_fromfs(&ifr, arg, sizeof(struct ifreq));
                    950: 
                    951:        /*
                    952:         *      See which interface the caller is talking about. 
                    953:         */
                    954:         
                    955:        /*
                    956:         *
                    957:         *      net_alias_dev_get(): dev_get() with added alias naming magic.
                    958:         *      only allow alias creation/deletion if (getset==SIOCSIFADDR)
                    959:         *
                    960:         */
                    961:         
                    962: #ifdef CONFIG_KERNELD
                    963:        dev_load(ifr.ifr_name);
                    964: #endif 
                    965: 
                    966: #ifdef CONFIG_NET_ALIAS
                    967:        if ((dev = net_alias_dev_get(ifr.ifr_name, getset == SIOCSIFADDR, &err, NULL, NULL)) == NULL)
                    968:                return(err);
                    969: #else
                    970:        if ((dev = dev_get(ifr.ifr_name)) == NULL)      
                    971:                return(-ENODEV);
                    972: #endif
                    973:        switch(getset) 
                    974:        {
                    975:                case SIOCGIFFLAGS:      /* Get interface flags */
                    976:                        ifr.ifr_flags = dev->flags;
                    977:                        goto rarok;
                    978: 
                    979:                case SIOCSIFFLAGS:      /* Set interface flags */
                    980:                        {
                    981:                                int old_flags = dev->flags;
                    982:                                
                    983:                                /*
                    984:                                 *      We are not allowed to potentially close/unload
                    985:                                 *      a device until we get this lock.
                    986:                                 */
                    987:                                
                    988:                                dev_lock_wait();
                    989:                                
                    990:                                /*
                    991:                                 *      Set the flags on our device.
                    992:                                 */
                    993:                                 
                    994:                                dev->flags = (ifr.ifr_flags & (
                    995:                                        IFF_BROADCAST | IFF_DEBUG | IFF_LOOPBACK |
                    996:                                        IFF_POINTOPOINT | IFF_NOTRAILERS | IFF_RUNNING |
                    997:                                        IFF_NOARP | IFF_PROMISC | IFF_ALLMULTI | IFF_SLAVE | IFF_MASTER
                    998:                                        | IFF_MULTICAST)) | (dev->flags & IFF_UP);
                    999:                                /*
                   1000:                                 *      Load in the correct multicast list now the flags have changed.
                   1001:                                 */                             
                   1002: 
                   1003:                                dev_mc_upload(dev);
                   1004: 
                   1005:                                /*
                   1006:                                 *      Have we downed the interface. We handle IFF_UP ourselves
                   1007:                                 *      according to user attempts to set it, rather than blindly
                   1008:                                 *      setting it.
                   1009:                                 */
                   1010:                                 
                   1011:                                if ((old_flags^ifr.ifr_flags)&IFF_UP)   /* Bit is different  ? */
                   1012:                                {
                   1013:                                        if(old_flags&IFF_UP)            /* Gone down */
                   1014:                                                ret=dev_close(dev);             
                   1015:                                        else                            /* Come up */
                   1016:                                        {
                   1017:                                                ret=dev_open(dev);
                   1018:                                                if(ret<0)
                   1019:                                                        dev->flags&=~IFF_UP;    /* Open failed */
                   1020:                                        }       
                   1021:                                }
                   1022:                                else
                   1023:                                        ret=0;
                   1024:                                /*
                   1025:                                 *      Load in the correct multicast list now the flags have changed.
                   1026:                                 */                             
                   1027: 
                   1028:                                dev_mc_upload(dev);
                   1029:                        }
                   1030:                        break;
                   1031:                
                   1032:                case SIOCGIFADDR:       /* Get interface address (and family) */
                   1033:                        if(ifr.ifr_addr.sa_family==AF_UNSPEC)
                   1034:                        {
                   1035:                                memcpy(ifr.ifr_hwaddr.sa_data,dev->dev_addr, MAX_ADDR_LEN);
                   1036:                                ifr.ifr_hwaddr.sa_family=dev->type;                     
                   1037:                                goto rarok;
                   1038:                        }
                   1039:                        else
                   1040:                        {
                   1041:                                (*(struct sockaddr_in *)
                   1042:                                          &ifr.ifr_addr).sin_addr.s_addr = dev->pa_addr;
                   1043:                                (*(struct sockaddr_in *)
                   1044:                                          &ifr.ifr_addr).sin_family = dev->family;
                   1045:                                (*(struct sockaddr_in *)
                   1046:                                          &ifr.ifr_addr).sin_port = 0;
                   1047:                        }
                   1048:                        goto rarok;
                   1049:        
                   1050:                case SIOCSIFADDR:       /* Set interface address (and family) */
                   1051:                
                   1052:                        /*
                   1053:                         *      BSDism. SIOCSIFADDR family=AF_UNSPEC sets the
                   1054:                         *      physical address. We can cope with this now.
                   1055:                         */
                   1056:                        
                   1057:                        if(ifr.ifr_addr.sa_family==AF_UNSPEC)
                   1058:                        {
                   1059:                                if(dev->set_mac_address==NULL)
                   1060:                                        return -EOPNOTSUPP;
                   1061:                                ret=dev->set_mac_address(dev,&ifr.ifr_addr);
                   1062:                        }
                   1063:                        else
                   1064:                        {
                   1065: 
                   1066:                                /*
                   1067:                                 *      if dev is an alias, must rehash to update
                   1068:                                 *      address change
                   1069:                                 */
                   1070: 
                   1071: #ifdef CONFIG_NET_ALIAS
                   1072:                                if (net_alias_is(dev))
                   1073:                                net_alias_dev_rehash(dev ,&ifr.ifr_addr);
                   1074: #endif
                   1075:                                dev->pa_addr = (*(struct sockaddr_in *)
                   1076:                                         &ifr.ifr_addr).sin_addr.s_addr;
                   1077:                                dev->family = ifr.ifr_addr.sa_family;
                   1078:                        
                   1079: #ifdef CONFIG_INET     
                   1080:                                /* This is naughty. When net-032e comes out It wants moving into the net032
                   1081:                                   code not the kernel. Till then it can sit here (SIGH) */             
                   1082:                                dev->pa_mask = ip_get_mask(dev->pa_addr);
                   1083: #endif                 
                   1084:                                dev->pa_brdaddr = dev->pa_addr | ~dev->pa_mask;
                   1085:                                ret = 0;
                   1086:                        }
                   1087:                        break;
                   1088:                        
                   1089:                case SIOCGIFBRDADDR:    /* Get the broadcast address */
                   1090:                        (*(struct sockaddr_in *)
                   1091:                                &ifr.ifr_broadaddr).sin_addr.s_addr = dev->pa_brdaddr;
                   1092:                        (*(struct sockaddr_in *)
                   1093:                                &ifr.ifr_broadaddr).sin_family = dev->family;
                   1094:                        (*(struct sockaddr_in *)
                   1095:                                &ifr.ifr_broadaddr).sin_port = 0;
                   1096:                        goto rarok;
                   1097: 
                   1098:                case SIOCSIFBRDADDR:    /* Set the broadcast address */
                   1099:                        dev->pa_brdaddr = (*(struct sockaddr_in *)
                   1100:                                &ifr.ifr_broadaddr).sin_addr.s_addr;
                   1101:                        ret = 0;
                   1102:                        break;
                   1103:                        
                   1104:                case SIOCGIFDSTADDR:    /* Get the destination address (for point-to-point links) */
                   1105:                        (*(struct sockaddr_in *)
                   1106:                                &ifr.ifr_dstaddr).sin_addr.s_addr = dev->pa_dstaddr;
                   1107:                        (*(struct sockaddr_in *)
                   1108:                                &ifr.ifr_dstaddr).sin_family = dev->family;
                   1109:                        (*(struct sockaddr_in *)
                   1110:                                &ifr.ifr_dstaddr).sin_port = 0;
                   1111:                        goto rarok;
                   1112:        
                   1113:                case SIOCSIFDSTADDR:    /* Set the destination address (for point-to-point links) */
                   1114:                        dev->pa_dstaddr = (*(struct sockaddr_in *)
                   1115:                                &ifr.ifr_dstaddr).sin_addr.s_addr;
                   1116:                        ret = 0;
                   1117:                        break;
                   1118:                        
                   1119:                case SIOCGIFNETMASK:    /* Get the netmask for the interface */
                   1120:                        (*(struct sockaddr_in *)
                   1121:                                &ifr.ifr_netmask).sin_addr.s_addr = dev->pa_mask;
                   1122:                        (*(struct sockaddr_in *)
                   1123:                                &ifr.ifr_netmask).sin_family = dev->family;
                   1124:                        (*(struct sockaddr_in *)
                   1125:                                &ifr.ifr_netmask).sin_port = 0;
                   1126:                        goto rarok;
                   1127: 
                   1128:                case SIOCSIFNETMASK:    /* Set the netmask for the interface */
                   1129:                        {
                   1130:                                unsigned long mask = (*(struct sockaddr_in *)
                   1131:                                        &ifr.ifr_netmask).sin_addr.s_addr;
                   1132:                                ret = -EINVAL;
                   1133:                                /*
                   1134:                                 *      The mask we set must be legal.
                   1135:                                 */
                   1136:                                if (bad_mask(mask,0))
                   1137:                                        break;
                   1138:                                dev->pa_mask = mask;
                   1139:                                ret = 0;
                   1140:                        }
                   1141:                        break;
                   1142:                        
                   1143:                case SIOCGIFMETRIC:     /* Get the metric on the interface (currently unused) */
                   1144:                        
                   1145:                        ifr.ifr_metric = dev->metric;
                   1146:                        goto  rarok;
                   1147:                        
                   1148:                case SIOCSIFMETRIC:     /* Set the metric on the interface (currently unused) */
                   1149:                        dev->metric = ifr.ifr_metric;
                   1150:                        ret=0;
                   1151:                        break;
                   1152:        
                   1153:                case SIOCGIFMTU:        /* Get the MTU of a device */
                   1154:                        ifr.ifr_mtu = dev->mtu;
                   1155:                        goto rarok;
                   1156:        
                   1157:                case SIOCSIFMTU:        /* Set the MTU of a device */
                   1158:                
                   1159:                        /*
                   1160:                         *      MTU must be positive.
                   1161:                         */
                   1162:                         
                   1163:                        if(ifr.ifr_mtu<68)
                   1164:                                return -EINVAL;
                   1165:                        dev->mtu = ifr.ifr_mtu;
                   1166:                        ret = 0;
                   1167:                        break;
                   1168:        
                   1169:                case SIOCGIFMEM:        /* Get the per device memory space. We can add this but currently
                   1170:                                           do not support it */
                   1171:                        ret = -EINVAL;
                   1172:                        break;
                   1173:                
                   1174:                case SIOCSIFMEM:        /* Set the per device memory buffer space. Not applicable in our case */
                   1175:                        ret = -EINVAL;
                   1176:                        break;
                   1177: 
                   1178:                case SIOCGIFHWADDR:
                   1179:                        memcpy(ifr.ifr_hwaddr.sa_data,dev->dev_addr, MAX_ADDR_LEN);
                   1180:                        ifr.ifr_hwaddr.sa_family=dev->type;                     
                   1181:                        goto rarok;
                   1182:                                
                   1183:                case SIOCSIFHWADDR:
                   1184:                        if(dev->set_mac_address==NULL)
                   1185:                                return -EOPNOTSUPP;
                   1186:                        if(ifr.ifr_hwaddr.sa_family!=dev->type)
                   1187:                                return -EINVAL;
                   1188:                        ret=dev->set_mac_address(dev,&ifr.ifr_hwaddr);
                   1189:                        break;
                   1190:                        
                   1191:                case SIOCGIFMAP:
                   1192:                        ifr.ifr_map.mem_start=dev->mem_start;
                   1193:                        ifr.ifr_map.mem_end=dev->mem_end;
                   1194:                        ifr.ifr_map.base_addr=dev->base_addr;
                   1195:                        ifr.ifr_map.irq=dev->irq;
                   1196:                        ifr.ifr_map.dma=dev->dma;
                   1197:                        ifr.ifr_map.port=dev->if_port;
                   1198:                        goto rarok;
                   1199:                        
                   1200:                case SIOCSIFMAP:
                   1201:                        if(dev->set_config==NULL)
                   1202:                                return -EOPNOTSUPP;
                   1203:                        return dev->set_config(dev,&ifr.ifr_map);
                   1204:                        
                   1205:                case SIOCADDMULTI:
                   1206:                        if(dev->set_multicast_list==NULL)
                   1207:                                return -EINVAL;
                   1208:                        if(ifr.ifr_hwaddr.sa_family!=AF_UNSPEC)
                   1209:                                return -EINVAL;
                   1210:                        dev_mc_add(dev,ifr.ifr_hwaddr.sa_data, dev->addr_len, 1);
                   1211:                        return 0;
                   1212: 
                   1213:                case SIOCDELMULTI:
                   1214:                        if(dev->set_multicast_list==NULL)
                   1215:                                return -EINVAL;
                   1216:                        if(ifr.ifr_hwaddr.sa_family!=AF_UNSPEC)
                   1217:                                return -EINVAL;
                   1218:                        dev_mc_delete(dev,ifr.ifr_hwaddr.sa_data,dev->addr_len, 1);
                   1219:                        return 0;
                   1220:                /*
                   1221:                 *      Unknown or private ioctl
                   1222:                 */
                   1223: 
                   1224:                default:
                   1225:                        if((getset >= SIOCDEVPRIVATE) &&
                   1226:                           (getset <= (SIOCDEVPRIVATE + 15))) {
                   1227:                                if(dev->do_ioctl==NULL)
                   1228:                                        return -EOPNOTSUPP;
                   1229:                                ret=dev->do_ioctl(dev, &ifr, getset);
                   1230:                                memcpy_tofs(arg,&ifr,sizeof(struct ifreq));
                   1231:                                break;
                   1232:                        }
                   1233:                        
                   1234:                        ret = -EINVAL;
                   1235:        }
                   1236:        return(ret);
                   1237: /*
                   1238:  *     The load of calls that return an ifreq and ok (saves memory).
                   1239:  */
                   1240: rarok:
                   1241:        memcpy_tofs(arg, &ifr, sizeof(struct ifreq));
                   1242:        return 0;
                   1243: }
                   1244: 
                   1245: 
                   1246: /*
                   1247:  *     This function handles all "interface"-type I/O control requests. The actual
                   1248:  *     'doing' part of this is dev_ifsioc above.
                   1249:  */
                   1250: 
                   1251: int dev_ioctl(unsigned int cmd, void *arg)
                   1252: {
                   1253:        switch(cmd) 
                   1254:        {
                   1255:                case SIOCGIFCONF:
                   1256:                        (void) dev_ifconf((char *) arg);
                   1257:                        return 0;
                   1258: 
                   1259:                /*
                   1260:                 *      Ioctl calls that can be done by all.
                   1261:                 */
                   1262:                 
                   1263:                case SIOCGIFFLAGS:
                   1264:                case SIOCGIFADDR:
                   1265:                case SIOCGIFDSTADDR:
                   1266:                case SIOCGIFBRDADDR:
                   1267:                case SIOCGIFNETMASK:
                   1268:                case SIOCGIFMETRIC:
                   1269:                case SIOCGIFMTU:
                   1270:                case SIOCGIFMEM:
                   1271:                case SIOCGIFHWADDR:
                   1272:                case SIOCSIFHWADDR:
                   1273:                case SIOCGIFSLAVE:
                   1274:                case SIOCGIFMAP:
                   1275:                        return dev_ifsioc(arg, cmd);
                   1276: 
                   1277:                /*
                   1278:                 *      Ioctl calls requiring the power of a superuser
                   1279:                 */
                   1280:                 
                   1281:                case SIOCSIFFLAGS:
                   1282:                case SIOCSIFADDR:
                   1283:                case SIOCSIFDSTADDR:
                   1284:                case SIOCSIFBRDADDR:
                   1285:                case SIOCSIFNETMASK:
                   1286:                case SIOCSIFMETRIC:
                   1287:                case SIOCSIFMTU:
                   1288:                case SIOCSIFMEM:
                   1289:                case SIOCSIFMAP:
                   1290:                case SIOCSIFSLAVE:
                   1291:                case SIOCADDMULTI:
                   1292:                case SIOCDELMULTI:
                   1293:                        if (!suser())
                   1294:                                return -EPERM;
                   1295:                        return dev_ifsioc(arg, cmd);
                   1296:        
                   1297:                case SIOCSIFLINK:
                   1298:                        return -EINVAL;
                   1299: 
                   1300:                /*
                   1301:                 *      Unknown or private ioctl.
                   1302:                 */     
                   1303:                 
                   1304:                default:
                   1305:                        if((cmd >= SIOCDEVPRIVATE) &&
                   1306:                           (cmd <= (SIOCDEVPRIVATE + 15))) {
                   1307:                                return dev_ifsioc(arg, cmd);
                   1308:                        }
                   1309:                        return -EINVAL;
                   1310:        }
                   1311: }
                   1312: #endif /* ! MACH */
                   1313: 
                   1314: /*
                   1315:  *     Initialize the DEV module. At boot time this walks the device list and
                   1316:  *     unhooks any devices that fail to initialise (normally hardware not 
                   1317:  *     present) and leaves us with a valid list of present and active devices.
                   1318:  *
                   1319:  */
                   1320: extern int lance_init(void);
                   1321: extern int pi_init(void);
                   1322: extern int dec21040_init(void);
                   1323: 
                   1324: int net_dev_init(void)
                   1325: {
                   1326:        struct device *dev, **dp;
                   1327: 
                   1328: #ifndef MACH
                   1329:        /*
                   1330:         *      Initialise the packet receive queue.
                   1331:         */
                   1332:         
                   1333:        skb_queue_head_init(&backlog);
                   1334: #endif
                   1335: 
                   1336:        /*
                   1337:         * This is VeryUgly(tm).
                   1338:         *
                   1339:         * Some devices want to be initialized eary..
                   1340:         */
                   1341: #if defined(CONFIG_LANCE)
                   1342:        lance_init();
                   1343: #endif
                   1344: #if defined(CONFIG_PI)
                   1345:        pi_init();
                   1346: #endif 
                   1347: #if defined(CONFIG_PT)
                   1348:        pt_init();
                   1349: #endif
                   1350: #if defined(CONFIG_DEC_ELCP)
                   1351:        dec21040_init();
                   1352: #endif 
                   1353:        /*
                   1354:         *      SLHC if present needs attaching so other people see it
                   1355:         *      even if not opened.
                   1356:         */
                   1357: #if (defined(CONFIG_SLIP_COMPRESSED) || defined(CONFIG_PPP)) && defined(CONFIG_SLHC_BUILTIN)
                   1358:        slhc_install();
                   1359: #endif 
                   1360: 
                   1361:        /*
                   1362:         *      Add the devices.
                   1363:         *      If the call to dev->init fails, the dev is removed
                   1364:         *      from the chain disconnecting the device until the
                   1365:         *      next reboot.
                   1366:         */
                   1367: 
                   1368:        dp = &dev_base;
                   1369:        while ((dev = *dp) != NULL)
                   1370:        {
                   1371:                int i;
                   1372:                for (i = 0; i < DEV_NUMBUFFS; i++)  {
                   1373:                        skb_queue_head_init(dev->buffs + i);
                   1374:                }
                   1375: 
                   1376:                if (dev->init && dev->init(dev)) 
                   1377:                {
                   1378:                        /*
                   1379:                         *      It failed to come up. Unhook it.
                   1380:                         */
                   1381:                        *dp = dev->next;
                   1382:                } 
                   1383:                else
                   1384:                {
                   1385:                        dp = &dev->next;
                   1386:                }
                   1387:        }
                   1388: 
                   1389: #ifdef CONFIG_PROC_FS
                   1390:        proc_net_register(&(struct proc_dir_entry) {
                   1391:                PROC_NET_DEV, 3, "dev",
                   1392:                S_IFREG | S_IRUGO, 1, 0, 0,
                   1393:                0, &proc_net_inode_operations,
                   1394:                dev_get_info
                   1395:        });
                   1396: #endif
                   1397: 
                   1398:        /*      
                   1399:         *      Initialise net_alias engine 
                   1400:         *
                   1401:         *              - register net_alias device notifier
                   1402:         *              - register proc entries:        /proc/net/alias_types
                   1403:         *                                                                      /proc/net/aliases
                   1404:         */
                   1405: 
                   1406: #ifdef CONFIG_NET_ALIAS
                   1407:        net_alias_init();
                   1408: #endif
                   1409: 
                   1410:        bh_base[NET_BH].routine = net_bh;
                   1411:        enable_bh(NET_BH);
                   1412:        return 0;
                   1413: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.