summaryrefslogtreecommitdiffstats
path: root/include/linux/netdevice.h
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-10-09 00:00:47 +0000
committerRalf Baechle <ralf@linux-mips.org>1999-10-09 00:00:47 +0000
commitd6434e1042f3b0a6dfe1b1f615af369486f9b1fa (patch)
treee2be02f33984c48ec019c654051d27964e42c441 /include/linux/netdevice.h
parent609d1e803baf519487233b765eb487f9ec227a18 (diff)
Merge with 2.3.19.
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r--include/linux/netdevice.h190
1 files changed, 92 insertions, 98 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 5fbcbad86..75d6f872d 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -35,12 +35,16 @@
#ifdef CONFIG_NET_PROFILE
#include <net/profile.h>
#endif
+
+#define NET_XMIT_SUCCESS 0
+#define NET_XMIT_DROP 1 /* skb dropped */
+#define NET_XMIT_CN 2 /* congestion notification */
+#define NET_XMIT_POLICED 3 /* skb is shot by police */
+
+#define net_xmit_errno(e) ((e) != NET_XMIT_CN ? -ENOBUFS : 0)
+
#endif
-/*
- * For future expansion when we will have different priorities.
- */
-
#define MAX_ADDR_LEN 7 /* Largest hardware address length */
/*
@@ -166,11 +170,11 @@ struct hh_cache
* data with strictly "high-level" data, and it has to know about
* almost every data structure used in the INET module.
*
- * FIXME: cleanup struct device such that network protocol info
+ * FIXME: cleanup struct net_device such that network protocol info
* moves out.
*/
-struct device
+struct net_device
{
/*
@@ -202,11 +206,10 @@ struct device
unsigned long interrupt; /* bitops.. */
unsigned long tbusy; /* transmitter busy */
- struct device *next;
+ struct net_device *next;
/* The device initialization function. Called only once. */
- int (*init)(struct device *dev);
- void (*destructor)(struct device *dev);
+ int (*init)(struct net_device *dev);
/* Interface index. Unique device identifier */
int ifindex;
@@ -220,8 +223,8 @@ struct device
unsigned char if_port; /* Selectable AUI, TP,..*/
unsigned char dma; /* DMA channel */
- struct net_device_stats* (*get_stats)(struct device *dev);
- struct iw_statistics* (*get_wireless_stats)(struct device *dev);
+ struct net_device_stats* (*get_stats)(struct net_device *dev);
+ struct iw_statistics* (*get_wireless_stats)(struct net_device *dev);
/*
* This marks the end of the "visible" part of the structure. All
@@ -254,7 +257,7 @@ struct device
/* For load balancing driver pair support */
unsigned long pkt_queue; /* Packets queued */
- struct device *slave; /* Slave device */
+ struct net_device *slave; /* Slave device */
/* Protocol specific pointers */
@@ -276,52 +279,62 @@ struct device
int xmit_lock_owner;
/* device queue lock */
spinlock_t queue_lock;
+ /* Number of references to this device */
atomic_t refcnt;
+ /* The flag marking that device is unregistered, but held by an user */
+ int deadbeaf;
+ /* New style devices allow asynchronous destruction;
+ netdevice_unregister for old style devices blocks until
+ the last user will dereference this device.
+ */
+ int new_style;
+ /* Called after device is detached from network. */
+ void (*uninit)(struct net_device *dev);
+ /* Called after last user reference disappears. */
+ void (*destructor)(struct net_device *dev);
/* Pointers to interface service routines. */
- int (*open)(struct device *dev);
- int (*stop)(struct device *dev);
+ int (*open)(struct net_device *dev);
+ int (*stop)(struct net_device *dev);
int (*hard_start_xmit) (struct sk_buff *skb,
- struct device *dev);
+ struct net_device *dev);
int (*hard_header) (struct sk_buff *skb,
- struct device *dev,
+ struct net_device *dev,
unsigned short type,
void *daddr,
void *saddr,
unsigned len);
int (*rebuild_header)(struct sk_buff *skb);
#define HAVE_MULTICAST
- void (*set_multicast_list)(struct device *dev);
+ void (*set_multicast_list)(struct net_device *dev);
#define HAVE_SET_MAC_ADDR
- int (*set_mac_address)(struct device *dev,
+ int (*set_mac_address)(struct net_device *dev,
void *addr);
#define HAVE_PRIVATE_IOCTL
- int (*do_ioctl)(struct device *dev,
+ int (*do_ioctl)(struct net_device *dev,
struct ifreq *ifr, int cmd);
#define HAVE_SET_CONFIG
- int (*set_config)(struct device *dev,
+ int (*set_config)(struct net_device *dev,
struct ifmap *map);
#define HAVE_HEADER_CACHE
int (*hard_header_cache)(struct neighbour *neigh,
struct hh_cache *hh);
void (*header_cache_update)(struct hh_cache *hh,
- struct device *dev,
+ struct net_device *dev,
unsigned char * haddr);
#define HAVE_CHANGE_MTU
- int (*change_mtu)(struct device *dev, int new_mtu);
+ int (*change_mtu)(struct net_device *dev, int new_mtu);
int (*hard_header_parse)(struct sk_buff *skb,
unsigned char *haddr);
- int (*neigh_setup)(struct device *dev, struct neigh_parms *);
- int (*accept_fastpath)(struct device *, struct dst_entry*);
+ int (*neigh_setup)(struct net_device *dev, struct neigh_parms *);
+ int (*accept_fastpath)(struct net_device *, struct dst_entry*);
#ifdef CONFIG_NET_FASTROUTE
- /* Really, this semaphore may be necessary and for not fastroute code;
- f.e. SMP??
- */
- int tx_semaphore;
+ unsigned long tx_semaphore;
#define NETDEV_FASTROUTE_HMASK 0xF
/* Semi-private data. Keep it at the end of device struct. */
+ rwlock_t fastpath_lock;
struct dst_entry *fastpath[NETDEV_FASTROUTE_HMASK+1];
#endif
};
@@ -330,8 +343,8 @@ struct device
struct packet_type
{
unsigned short type; /* This is really htons(ether_type). */
- struct device *dev; /* NULL is wildcarded here */
- int (*func) (struct sk_buff *, struct device *,
+ struct net_device *dev; /* NULL is wildcarded here */
+ int (*func) (struct sk_buff *, struct net_device *,
struct packet_type *);
void *data; /* Private to the packet type */
struct packet_type *next;
@@ -341,31 +354,34 @@ struct packet_type
#include <linux/interrupt.h>
#include <linux/notifier.h>
-extern struct device loopback_dev; /* The loopback */
-extern struct device *dev_base; /* All devices */
+extern struct net_device loopback_dev; /* The loopback */
+extern struct net_device *dev_base; /* All devices */
extern rwlock_t dev_base_lock; /* Device list lock */
extern int netdev_dropping;
extern int net_cpu_congestion;
-extern struct device *dev_getbyhwaddr(unsigned short type, char *hwaddr);
+extern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr);
extern void dev_add_pack(struct packet_type *pt);
extern void dev_remove_pack(struct packet_type *pt);
-extern struct device *dev_get(const char *name);
-extern struct device *dev_alloc(const char *name, int *err);
-extern int dev_alloc_name(struct device *dev, const char *name);
-extern int dev_open(struct device *dev);
-extern int dev_close(struct device *dev);
+extern int dev_get(const char *name);
+extern struct net_device *dev_get_by_name(const char *name);
+extern struct net_device *__dev_get_by_name(const char *name);
+extern struct net_device *dev_alloc(const char *name, int *err);
+extern int dev_alloc_name(struct net_device *dev, const char *name);
+extern int dev_open(struct net_device *dev);
+extern int dev_close(struct net_device *dev);
extern int dev_queue_xmit(struct sk_buff *skb);
extern void dev_loopback_xmit(struct sk_buff *skb);
-extern int register_netdevice(struct device *dev);
-extern int unregister_netdevice(struct device *dev);
+extern int register_netdevice(struct net_device *dev);
+extern int unregister_netdevice(struct net_device *dev);
extern int register_netdevice_notifier(struct notifier_block *nb);
extern int unregister_netdevice_notifier(struct notifier_block *nb);
extern int dev_new_index(void);
-extern struct device *dev_get_by_index(int ifindex);
-extern int dev_restart(struct device *dev);
+extern struct net_device *dev_get_by_index(int ifindex);
+extern struct net_device *__dev_get_by_index(int ifindex);
+extern int dev_restart(struct net_device *dev);
-typedef int gifconf_func_t(struct device * dev, char * bufptr, int len);
+typedef int gifconf_func_t(struct net_device * dev, char * bufptr, int len);
extern int register_gifconf(unsigned int family, gifconf_func_t * gifconf);
extern __inline__ int unregister_gifconf(unsigned int family)
{
@@ -377,80 +393,58 @@ extern void netif_rx(struct sk_buff *skb);
extern void net_bh(void);
extern int dev_get_info(char *buffer, char **start, off_t offset, int length, int dummy);
extern int dev_ioctl(unsigned int cmd, void *);
-extern int dev_change_flags(struct device *, unsigned);
-extern void dev_queue_xmit_nit(struct sk_buff *skb, struct device *dev);
+extern int dev_change_flags(struct net_device *, unsigned);
+extern void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev);
extern void dev_init(void);
extern int netdev_nit;
-/* Locking protection for page faults during outputs to devices unloaded during the fault */
-
-extern atomic_t dev_lockct;
-
-/*
- * These two don't currently need to be atomic
- * but they may do soon. Do it properly anyway.
- */
-
-extern __inline__ void dev_lock_list(void)
+extern __inline__ void dev_init_buffers(struct net_device *dev)
{
- atomic_inc(&dev_lockct);
-}
-
-extern __inline__ void dev_unlock_list(void)
-{
- atomic_dec(&dev_lockct);
+ /* DO NOTHING */
}
-/*
- * This almost never occurs, isn't in performance critical paths
- * and we can thus be relaxed about it.
- *
- * FIXME: What if this is being run as a real time process ??
- * Linus: We need a way to force a yield here ?
- *
- * FIXME: Though dev_lockct is atomic varible, locking procedure
- * is not atomic.
- */
+extern int netdev_finish_unregister(struct net_device *dev);
-extern __inline__ void dev_lock_wait(void)
+extern __inline__ void dev_put(struct net_device *dev)
{
- while (atomic_read(&dev_lockct)) {
- current->policy |= SCHED_YIELD;
- schedule();
- }
+ if (atomic_dec_and_test(&dev->refcnt))
+ netdev_finish_unregister(dev);
}
-extern __inline__ void dev_init_buffers(struct device *dev)
-{
- /* DO NOTHING */
-}
+#define __dev_put(dev) atomic_dec(&(dev)->refcnt)
+#define dev_hold(dev) atomic_inc(&(dev)->refcnt)
+
/* These functions live elsewhere (drivers/net/net_init.c, but related) */
-extern void ether_setup(struct device *dev);
-extern void fddi_setup(struct device *dev);
-extern void tr_setup(struct device *dev);
-extern void tr_freedev(struct device *dev);
-extern int ether_config(struct device *dev, struct ifmap *map);
+extern void ether_setup(struct net_device *dev);
+extern void fddi_setup(struct net_device *dev);
+extern void tr_setup(struct net_device *dev);
+extern void fc_setup(struct net_device *dev);
+extern void tr_freedev(struct net_device *dev);
+extern void fc_freedev(struct net_device *dev);
+extern int ether_config(struct net_device *dev, struct ifmap *map);
/* Support for loadable net-drivers */
-extern int register_netdev(struct device *dev);
-extern void unregister_netdev(struct device *dev);
-extern int register_trdev(struct device *dev);
-extern void unregister_trdev(struct device *dev);
+extern int register_netdev(struct net_device *dev);
+extern void unregister_netdev(struct net_device *dev);
+extern int register_trdev(struct net_device *dev);
+extern void unregister_trdev(struct net_device *dev);
+extern int register_fcdev(struct net_device *dev);
+extern void unregister_fcdev(struct net_device *dev);
/* Functions used for multicast support */
-extern void dev_mc_upload(struct device *dev);
-extern int dev_mc_delete(struct device *dev, void *addr, int alen, int all);
-extern int dev_mc_add(struct device *dev, void *addr, int alen, int newonly);
-extern void dev_mc_discard(struct device *dev);
-extern void dev_set_promiscuity(struct device *dev, int inc);
-extern void dev_set_allmulti(struct device *dev, int inc);
-extern void netdev_state_change(struct device *dev);
+extern void dev_mc_upload(struct net_device *dev);
+extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all);
+extern int dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly);
+extern void dev_mc_discard(struct net_device *dev);
+extern void dev_set_promiscuity(struct net_device *dev, int inc);
+extern void dev_set_allmulti(struct net_device *dev, int inc);
+extern void netdev_state_change(struct net_device *dev);
/* Load a device via the kmod */
extern void dev_load(const char *name);
extern void dev_mcast_init(void);
-extern int netdev_register_fc(struct device *dev, void (*stimul)(struct device *dev));
+extern int netdev_register_fc(struct net_device *dev, void (*stimul)(struct net_device *dev));
extern void netdev_unregister_fc(int bit);
extern int netdev_dropping;
extern int netdev_max_backlog;
@@ -459,7 +453,7 @@ extern unsigned long netdev_fc_xoff;
#ifdef CONFIG_NET_FASTROUTE
extern int netdev_fastroute;
extern int netdev_fastroute_obstacles;
-extern void dev_clear_fastroute(struct device *dev);
+extern void dev_clear_fastroute(struct net_device *dev);
extern struct net_fastroute_stats dev_fastroute_stat;
#endif