~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/net/bridge/br_device.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *      Device handling code
  3  *      Linux ethernet bridge
  4  *
  5  *      Authors:
  6  *      Lennert Buytenhek               <buytenh@gnu.org>
  7  *
  8  *      $Id: br_device.c,v 1.3 2000/03/01 02:58:09 davem Exp $
  9  *
 10  *      This program is free software; you can redistribute it and/or
 11  *      modify it under the terms of the GNU General Public License
 12  *      as published by the Free Software Foundation; either version
 13  *      2 of the License, or (at your option) any later version.
 14  */
 15 
 16 #include <linux/kernel.h>
 17 #include <linux/netdevice.h>
 18 #include <linux/if_bridge.h>
 19 #include <asm/uaccess.h>
 20 #include "br_private.h"
 21 
 22 static int br_dev_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 23 {
 24         unsigned long args[4];
 25         unsigned long *data;
 26 
 27         if (cmd != SIOCDEVPRIVATE)
 28                 return -EOPNOTSUPP;
 29 
 30         data = (unsigned long *)rq->ifr_data;
 31         if (copy_from_user(args, data, 4*sizeof(unsigned long)))
 32                 return -EFAULT;
 33 
 34         return br_ioctl(dev->priv, args[0], args[1], args[2], args[3]);
 35 }
 36 
 37 static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
 38 {
 39         struct net_bridge *br;
 40 
 41         br = dev->priv;
 42 
 43         return &br->statistics;
 44 }
 45 
 46 static int __br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 47 {
 48         struct net_bridge *br;
 49         unsigned char *dest;
 50         struct net_bridge_fdb_entry *dst;
 51 
 52         br = dev->priv;
 53         br->statistics.tx_packets++;
 54         br->statistics.tx_bytes += skb->len;
 55 
 56         dest = skb->data;
 57 
 58         if (dest[0] & 1) {
 59                 br_flood(br, skb, 0);
 60                 return 0;
 61         }
 62 
 63         if ((dst = br_fdb_get(br, dest)) != NULL) {
 64                 br_forward(dst->dst, skb);
 65                 br_fdb_put(dst);
 66                 return 0;
 67         }
 68 
 69         br_flood(br, skb, 0);
 70         return 0;
 71 }
 72 
 73 static int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 74 {
 75         struct net_bridge *br;
 76         int ret;
 77 
 78         br = dev->priv;
 79         read_lock(&br->lock);
 80         ret = __br_dev_xmit(skb, dev);
 81         read_unlock(&br->lock);
 82 
 83         return ret;
 84 }
 85 
 86 static int br_dev_open(struct net_device *dev)
 87 {
 88         struct net_bridge *br;
 89 
 90         netif_start_queue(dev);
 91 
 92         br = dev->priv;
 93         read_lock(&br->lock);
 94         br_stp_enable_bridge(br);
 95         read_unlock(&br->lock);
 96 
 97         return 0;
 98 }
 99 
100 static void br_dev_set_multicast_list(struct net_device *dev)
101 {
102 }
103 
104 static int br_dev_stop(struct net_device *dev)
105 {
106         struct net_bridge *br;
107 
108         br = dev->priv;
109         read_lock(&br->lock);
110         br_stp_disable_bridge(br);
111         read_unlock(&br->lock);
112 
113         netif_stop_queue(dev);
114 
115         return 0;
116 }
117 
118 static int br_dev_accept_fastpath(struct net_device *dev, struct dst_entry *dst)
119 {
120         return -1;
121 }
122 
123 void br_dev_setup(struct net_device *dev)
124 {
125         memset(dev->dev_addr, 0, ETH_ALEN);
126 
127         dev->do_ioctl = br_dev_do_ioctl;
128         dev->get_stats = br_dev_get_stats;
129         dev->hard_start_xmit = br_dev_xmit;
130         dev->open = br_dev_open;
131         dev->set_multicast_list = br_dev_set_multicast_list;
132         dev->stop = br_dev_stop;
133         dev->accept_fastpath = br_dev_accept_fastpath;
134         dev->tx_queue_len = 0;
135         dev->set_mac_address = NULL;
136 }
137 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.