patch-2.4.23 linux-2.4.23/net/atm/lec.c
Next file: linux-2.4.23/net/atm/lec.h
Previous file: linux-2.4.23/net/atm/common.h
Back to the patch index
Back to the overall index
- Lines: 407
- Date:
2003-11-28 10:26:21.000000000 -0800
- Orig file:
linux-2.4.22/net/atm/lec.c
- Orig date:
2003-08-25 04:44:44.000000000 -0700
diff -urN linux-2.4.22/net/atm/lec.c linux-2.4.23/net/atm/lec.c
@@ -11,6 +11,7 @@
/* We are ethernet device */
#include <linux/if_ether.h>
#include <linux/netdevice.h>
+#include <linux/rtnetlink.h>
#include <linux/etherdevice.h>
#include <net/sock.h>
#include <linux/skbuff.h>
@@ -44,7 +45,7 @@
#include "lec.h"
#include "lec_arpc.h"
-#include "resources.h" /* for bind_vcc() */
+#include "resources.h"
#if 0
#define DPRINTK printk
@@ -57,8 +58,6 @@
unsigned char *addr);
extern void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent);
-static spinlock_t lec_arp_spinlock = SPIN_LOCK_UNLOCKED;
-
#define DUMP_PACKETS 0 /* 0 = None,
* 1 = 30 first bytes
* 2 = Whole packet
@@ -72,9 +71,9 @@
static int lec_close(struct net_device *dev);
static struct net_device_stats *lec_get_stats(struct net_device *dev);
static void lec_init(struct net_device *dev);
-static __inline__ struct lec_arp_table* lec_arp_find(struct lec_priv *priv,
+static inline struct lec_arp_table* lec_arp_find(struct lec_priv *priv,
unsigned char *mac_addr);
-static __inline__ int lec_arp_remove(struct lec_arp_table **lec_arp_tables,
+static inline int lec_arp_remove(struct lec_priv *priv,
struct lec_arp_table *to_remove);
/* LANE2 functions */
static void lane2_associate_ind (struct net_device *dev, u8 *mac_address,
@@ -96,8 +95,18 @@
static struct net_device *dev_lec[MAX_LEC_ITF];
/* This will be called from proc.c via function pointer */
-struct net_device **get_dev_lec (void) {
- return &dev_lec[0];
+struct net_device *get_dev_lec(int itf)
+{
+ struct net_device *dev;
+
+ if (itf >= MAX_LEC_ITF)
+ return NULL;
+ rtnl_lock();
+ dev = dev_lec[itf];
+ if (dev)
+ dev_hold(dev);
+ rtnl_unlock();
+ return dev;
}
#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
@@ -433,7 +442,7 @@
break;
case l_narp_req: /* LANE2: see 7.1.35 in the lane2 spec */
entry = lec_arp_find(priv, mesg->content.normal.mac_addr);
- lec_arp_remove(priv->lec_arp_tables, entry);
+ lec_arp_remove(priv, entry);
if (mesg->content.normal.no_source_le_narp)
break;
@@ -809,7 +818,8 @@
lec_arp_init(priv);
priv->itfnum = i; /* LANE2 addition */
priv->lecd = vcc;
- bind_vcc(vcc, &lecatm_dev);
+ vcc->dev = &lecatm_dev;
+ vcc_insert_socket(vcc->sk);
vcc->proto_data = dev_lec[i];
set_bit(ATM_VF_META,&vcc->flags);
@@ -834,37 +844,28 @@
return i;
}
-void atm_lane_init_ops(struct atm_lane_ops *ops)
+static struct atm_lane_ops __atm_lane_ops =
{
- ops->lecd_attach = lecd_attach;
- ops->mcast_attach = lec_mcast_attach;
- ops->vcc_attach = lec_vcc_attach;
- ops->get_lecs = get_dev_lec;
-
- printk("lec.c: " __DATE__ " " __TIME__ " initialized\n");
-
- return;
-}
+ .lecd_attach = lecd_attach,
+ .mcast_attach = lec_mcast_attach,
+ .vcc_attach = lec_vcc_attach,
+ .get_lec = get_dev_lec,
+ .owner = THIS_MODULE
+};
static int __init lane_module_init(void)
{
- extern struct atm_lane_ops atm_lane_ops;
-
- atm_lane_init_ops(&atm_lane_ops);
-
+ atm_lane_ops_set(&__atm_lane_ops);
+ printk("lec.c: " __DATE__ " " __TIME__ " initialized\n");
return 0;
}
static void __exit lane_module_cleanup(void)
{
int i;
- extern struct atm_lane_ops atm_lane_ops;
struct lec_priv *priv;
- atm_lane_ops.lecd_attach = NULL;
- atm_lane_ops.mcast_attach = NULL;
- atm_lane_ops.vcc_attach = NULL;
- atm_lane_ops.get_lecs = NULL;
+ atm_lane_ops_set(NULL);
for (i = 0; i < MAX_LEC_ITF; i++) {
if (dev_lec[i] != NULL) {
@@ -874,7 +875,7 @@
unregister_trdev(dev_lec[i]);
else
#endif
- unregister_netdev(dev_lec[i]);
+ unregister_netdev(dev_lec[i]);
kfree(dev_lec[i]);
dev_lec[i] = NULL;
}
@@ -1074,6 +1075,7 @@
for (i=0;i<LEC_ARP_TABLE_SIZE;i++) {
priv->lec_arp_tables[i] = NULL;
}
+ spin_lock_init(&priv->lec_arp_lock);
init_timer(&priv->lec_arp_timer);
priv->lec_arp_timer.expires = jiffies+LEC_ARP_REFRESH_INTERVAL;
priv->lec_arp_timer.data = (unsigned long)priv;
@@ -1091,7 +1093,7 @@
clear_bit(ATM_VF_READY,&entry->vcc->flags);
entry->vcc->push(entry->vcc, NULL);
#endif
- atm_async_release_vcc(entry->vcc, -EPIPE);
+ vcc_release_async(entry->vcc, -EPIPE);
entry->vcc = NULL;
}
if (entry->recv_vcc) {
@@ -1101,7 +1103,7 @@
clear_bit(ATM_VF_READY,&entry->recv_vcc->flags);
entry->recv_vcc->push(entry->recv_vcc, NULL);
#endif
- atm_async_release_vcc(entry->recv_vcc, -EPIPE);
+ vcc_release_async(entry->recv_vcc, -EPIPE);
entry->recv_vcc = NULL;
}
}
@@ -1110,21 +1112,20 @@
* Insert entry to lec_arp_table
* LANE2: Add to the end of the list to satisfy 8.1.13
*/
-static __inline__ void
-lec_arp_add(struct lec_arp_table **lec_arp_tables,
- struct lec_arp_table *to_add)
+static inline void
+lec_arp_add(struct lec_priv *priv, struct lec_arp_table *to_add)
{
unsigned long flags;
unsigned short place;
struct lec_arp_table *tmp;
- spin_lock_irqsave(&lec_arp_spinlock, flags);
+ spin_lock_irqsave(&priv->lec_arp_lock, flags);
place = HASH(to_add->mac_addr[ETH_ALEN-1]);
- tmp = lec_arp_tables[place];
+ tmp = priv->lec_arp_tables[place];
to_add->next = NULL;
if (tmp == NULL)
- lec_arp_tables[place] = to_add;
+ priv->lec_arp_tables[place] = to_add;
else { /* add to the end */
while (tmp->next)
@@ -1132,7 +1133,7 @@
tmp->next = to_add;
}
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
DPRINTK("LEC_ARP: Added entry:%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
0xff&to_add->mac_addr[0], 0xff&to_add->mac_addr[1],
@@ -1143,8 +1144,8 @@
/*
* Remove entry from lec_arp_table
*/
-static __inline__ int
-lec_arp_remove(struct lec_arp_table **lec_arp_tables,
+static inline int
+lec_arp_remove(struct lec_priv *priv,
struct lec_arp_table *to_remove)
{
unsigned long flags;
@@ -1152,22 +1153,22 @@
struct lec_arp_table *tmp;
int remove_vcc=1;
- spin_lock_irqsave(&lec_arp_spinlock, flags);
+ spin_lock_irqsave(&priv->lec_arp_lock, flags);
if (!to_remove) {
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
return -1;
}
place = HASH(to_remove->mac_addr[ETH_ALEN-1]);
- tmp = lec_arp_tables[place];
+ tmp = priv->lec_arp_tables[place];
if (tmp == to_remove) {
- lec_arp_tables[place] = tmp->next;
+ priv->lec_arp_tables[place] = tmp->next;
} else {
while(tmp && tmp->next != to_remove) {
tmp = tmp->next;
}
if (!tmp) {/* Entry was not found */
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
return -1;
}
}
@@ -1181,7 +1182,7 @@
* ESI_FLUSH_PENDING, ESI_FORWARD_DIRECT
*/
for(place=0;place<LEC_ARP_TABLE_SIZE;place++) {
- for(tmp=lec_arp_tables[place];tmp!=NULL;tmp=tmp->next){
+ for(tmp = priv->lec_arp_tables[place]; tmp != NULL; tmp = tmp->next) {
if (memcmp(tmp->atm_addr, to_remove->atm_addr,
ATM_ESA_LEN)==0) {
remove_vcc=0;
@@ -1194,7 +1195,7 @@
}
skb_queue_purge(&to_remove->tx_wait); /* FIXME: good place for this? */
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
DPRINTK("LEC_ARP: Removed entry:%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
0xff&to_remove->mac_addr[0], 0xff&to_remove->mac_addr[1],
@@ -1390,7 +1391,7 @@
for (i=0;i<LEC_ARP_TABLE_SIZE;i++) {
for(entry =priv->lec_arp_tables[i];entry != NULL; entry=next) {
next = entry->next;
- lec_arp_remove(priv->lec_arp_tables, entry);
+ lec_arp_remove(priv, entry);
kfree(entry);
}
}
@@ -1430,7 +1431,7 @@
/*
* Find entry by mac_address
*/
-static __inline__ struct lec_arp_table*
+static inline struct lec_arp_table*
lec_arp_find(struct lec_priv *priv,
unsigned char *mac_addr)
{
@@ -1568,8 +1569,6 @@
lec_arp_check_expire(unsigned long data)
{
struct lec_priv *priv = (struct lec_priv *)data;
- struct lec_arp_table **lec_arp_tables =
- (struct lec_arp_table **)priv->lec_arp_tables;
struct lec_arp_table *entry, *next;
unsigned long now;
unsigned long time_to_check;
@@ -1585,7 +1584,7 @@
lec_arp_get(priv);
now = jiffies;
for(i=0;i<LEC_ARP_TABLE_SIZE;i++) {
- for(entry = lec_arp_tables[i];entry != NULL;) {
+ for(entry = priv->lec_arp_tables[i]; entry != NULL; ) {
if ((entry->flags) & LEC_REMOTE_FLAG &&
priv->topology_change)
time_to_check=priv->forward_delay_time;
@@ -1601,7 +1600,7 @@
/* Remove entry */
DPRINTK("LEC:Entry timed out\n");
next = entry->next;
- lec_arp_remove(lec_arp_tables, entry);
+ lec_arp_remove(priv, entry);
kfree(entry);
entry = next;
} else {
@@ -1690,7 +1689,7 @@
if (!entry) {
return priv->mcast_vcc;
}
- lec_arp_add(priv->lec_arp_tables, entry);
+ lec_arp_add(priv, entry);
/* We want arp-request(s) to be sent */
entry->packets_flooded =1;
entry->status = ESI_ARP_PENDING;
@@ -1723,7 +1722,7 @@
if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN)
&& (permanent ||
!(entry->flags & LEC_PERMANENT_FLAG))) {
- lec_arp_remove(priv->lec_arp_tables, entry);
+ lec_arp_remove(priv, entry);
kfree(entry);
}
lec_arp_put(priv);
@@ -1789,7 +1788,7 @@
entry->status = ESI_FORWARD_DIRECT;
memcpy(entry->mac_addr, mac_addr, ETH_ALEN);
entry->last_used = jiffies;
- lec_arp_add(priv->lec_arp_tables, entry);
+ lec_arp_add(priv, entry);
}
if (remoteflag)
entry->flags|=LEC_REMOTE_FLAG;
@@ -1809,7 +1808,7 @@
return;
}
entry->status = ESI_UNKNOWN;
- lec_arp_add(priv->lec_arp_tables, entry);
+ lec_arp_add(priv, entry);
/* Temporary, changes before end of function */
}
memcpy(entry->atm_addr, atm_addr, ATM_ESA_LEN);
@@ -2056,7 +2055,7 @@
to_add->old_push = vcc->push;
vcc->push = lec_push;
priv->mcast_vcc = vcc;
- lec_arp_add(priv->lec_arp_tables, to_add);
+ lec_arp_add(priv, to_add);
lec_arp_put(priv);
return 0;
}
@@ -2074,7 +2073,7 @@
for(entry = priv->lec_arp_tables[i];entry; entry=next) {
next = entry->next;
if (vcc == entry->vcc) {
- lec_arp_remove(priv->lec_arp_tables,entry);
+ lec_arp_remove(priv, entry);
kfree(entry);
if (priv->mcast_vcc == vcc) {
priv->mcast_vcc = NULL;
@@ -2154,23 +2153,23 @@
lec_arp_get(priv);
entry = priv->lec_arp_empty_ones;
if (vcc == entry->vcc) {
- spin_lock_irqsave(&lec_arp_spinlock, flags);
+ spin_lock_irqsave(&priv->lec_arp_lock, flags);
del_timer(&entry->timer);
memcpy(entry->mac_addr, src, ETH_ALEN);
entry->status = ESI_FORWARD_DIRECT;
entry->last_used = jiffies;
priv->lec_arp_empty_ones = entry->next;
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
/* We might have got an entry */
if ((prev=lec_arp_find(priv,src))) {
- lec_arp_remove(priv->lec_arp_tables, prev);
+ lec_arp_remove(priv, prev);
kfree(prev);
}
- lec_arp_add(priv->lec_arp_tables, entry);
+ lec_arp_add(priv, entry);
lec_arp_put(priv);
return;
}
- spin_lock_irqsave(&lec_arp_spinlock, flags);
+ spin_lock_irqsave(&priv->lec_arp_lock, flags);
prev = entry;
entry = entry->next;
while (entry && entry->vcc != vcc) {
@@ -2180,7 +2179,7 @@
if (!entry) {
DPRINTK("LEC_ARP: Arp_check_empties: entry not found!\n");
lec_arp_put(priv);
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
return;
}
del_timer(&entry->timer);
@@ -2188,12 +2187,12 @@
entry->status = ESI_FORWARD_DIRECT;
entry->last_used = jiffies;
prev->next = entry->next;
- spin_unlock_irqrestore(&lec_arp_spinlock, flags);
+ spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
if ((prev = lec_arp_find(priv, src))) {
- lec_arp_remove(priv->lec_arp_tables,prev);
+ lec_arp_remove(priv, prev);
kfree(prev);
}
- lec_arp_add(priv->lec_arp_tables,entry);
+ lec_arp_add(priv, entry);
lec_arp_put(priv);
}
MODULE_LICENSE("GPL");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)