summaryrefslogtreecommitdiffstats
path: root/net/802/tr.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/802/tr.c')
-rw-r--r--net/802/tr.c50
1 files changed, 26 insertions, 24 deletions
diff --git a/net/802/tr.c b/net/802/tr.c
index 9047eaa49..f3fa70ac1 100644
--- a/net/802/tr.c
+++ b/net/802/tr.c
@@ -36,8 +36,8 @@
#include <linux/init.h>
#include <net/arp.h>
-static void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, struct device *dev);
-static void tr_add_rif_info(struct trh_hdr *trh, struct device *dev);
+static void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, struct net_device *dev);
+static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev);
static void rif_check_expire(unsigned long dummy);
#define TR_SR_DEBUG 0
@@ -50,7 +50,7 @@ typedef struct rif_cache_s *rif_cache;
struct rif_cache_s {
unsigned char addr[TR_ALEN];
- unsigned char iface[5];
+ int iface;
__u16 rcf;
__u16 rseg[8];
rif_cache next;
@@ -85,7 +85,7 @@ int sysctl_tr_rif_timeout = RIF_TIMEOUT;
* makes this a little more exciting than on ethernet.
*/
-int tr_header(struct sk_buff *skb, struct device *dev, unsigned short type,
+int tr_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
void *daddr, void *saddr, unsigned len)
{
struct trh_hdr *trh;
@@ -144,7 +144,7 @@ int tr_rebuild_header(struct sk_buff *skb)
{
struct trh_hdr *trh=(struct trh_hdr *)skb->data;
struct trllc *trllc=(struct trllc *)(skb->data+sizeof(struct trh_hdr));
- struct device *dev = skb->dev;
+ struct net_device *dev = skb->dev;
/*
* FIXME: We don't yet support IPv6 over token rings
@@ -173,7 +173,7 @@ int tr_rebuild_header(struct sk_buff *skb)
* it via SNAP.
*/
-unsigned short tr_type_trans(struct sk_buff *skb, struct device *dev)
+unsigned short tr_type_trans(struct sk_buff *skb, struct net_device *dev)
{
struct trh_hdr *trh=(struct trh_hdr *)skb->data;
@@ -225,15 +225,14 @@ unsigned short tr_type_trans(struct sk_buff *skb, struct device *dev)
* We try to do source routing...
*/
-static void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct device *dev)
+static void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev)
{
int i, slack;
unsigned int hash;
rif_cache entry;
unsigned char *olddata;
- unsigned long flags;
- spin_lock_irqsave(&rif_lock, flags);
+ spin_lock_bh(&rif_lock);
/*
* Broadcasts are single route as stated in RFC 1042
@@ -302,7 +301,7 @@ printk("source routing for %02X %02X %02X %02X %02X %02X\n",trh->daddr[0],
else
slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8);
olddata = skb->data;
- spin_unlock_irqrestore(&rif_lock, flags);
+ spin_unlock_bh(&rif_lock);
skb_pull(skb, slack);
memmove(skb->data, olddata, sizeof(struct trh_hdr) - slack);
@@ -313,15 +312,14 @@ printk("source routing for %02X %02X %02X %02X %02X %02X\n",trh->daddr[0],
* routing.
*/
-static void tr_add_rif_info(struct trh_hdr *trh, struct device *dev)
+static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
{
int i;
unsigned int hash, rii_p = 0;
rif_cache entry;
- unsigned long flags;
- spin_lock_irqsave(&rif_lock, flags);
+ spin_lock_bh(&rif_lock);
/*
* Firstly see if the entry exists
@@ -360,12 +358,12 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
if(!entry)
{
printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n");
- spin_unlock_irqrestore(&rif_lock, flags);
+ spin_unlock_bh(&rif_lock);
return;
}
memcpy(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);
- memcpy(&(entry->iface[0]),dev->name,5);
+ entry->iface = dev->ifindex;
entry->next=rif_table[hash];
entry->last_used=jiffies;
rif_table[hash]=entry;
@@ -402,7 +400,7 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
}
entry->last_used=jiffies;
}
- spin_unlock_irqrestore(&rif_lock, flags);
+ spin_unlock_bh(&rif_lock);
}
/*
@@ -412,9 +410,9 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
static void rif_check_expire(unsigned long dummy)
{
int i;
- unsigned long now=jiffies,flags;
+ unsigned long now=jiffies;
- spin_lock_irqsave(&rif_lock, flags);
+ spin_lock(&rif_lock);
for(i=0; i < RIF_TABLE_SIZE;i++)
{
@@ -434,15 +432,13 @@ static void rif_check_expire(unsigned long dummy)
}
}
- spin_unlock_irqrestore(&rif_lock, flags);
+ spin_unlock(&rif_lock);
/*
* Reset the timer
*/
- del_timer(&rif_timer);
- rif_timer.expires = jiffies + sysctl_tr_rif_timeout;
- add_timer(&rif_timer);
+ mod_timer(&rif_timer, jiffies+sysctl_tr_rif_timeout);
}
@@ -467,11 +463,14 @@ int rif_get_info(char *buffer,char **start, off_t offset, int length, int dummy)
pos+=size;
len+=size;
+ spin_lock_bh(&rif_lock);
for(i=0;i < RIF_TABLE_SIZE;i++)
{
for(entry=rif_table[i];entry;entry=entry->next) {
+ struct net_device *dev = __dev_get_by_index(entry->iface);
+
size=sprintf(buffer+len,"%s %02X:%02X:%02X:%02X:%02X:%02X %7li ",
- entry->iface,entry->addr[0],entry->addr[1],entry->addr[2],entry->addr[3],entry->addr[4],entry->addr[5],
+ dev?dev->name:"?",entry->addr[0],entry->addr[1],entry->addr[2],entry->addr[3],entry->addr[4],entry->addr[5],
sysctl_tr_rif_timeout-(now-entry->last_used));
len+=size;
pos=begin+len;
@@ -513,11 +512,14 @@ int rif_get_info(char *buffer,char **start, off_t offset, int length, int dummy)
if(pos>offset+length)
break;
}
+ spin_unlock_bh(&rif_lock);
*start=buffer+(offset-begin); /* Start of wanted data */
len-=(offset-begin); /* Start slop */
if(len>length)
len=length; /* Ending slop */
+ if (len<0)
+ len=0;
return len;
}
#endif
@@ -536,7 +538,7 @@ static struct proc_dir_entry tr_rif_proc = {
};
#endif
-__initfunc(void rif_init(struct net_proto *unused))
+void __init rif_init(struct net_proto *unused)
{
rif_timer.expires = RIF_TIMEOUT;
rif_timer.data = 0L;