summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2011-01-31 14:03:00 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2011-01-31 14:03:00 -0800
commit0ffbf8bf21db0186e9fbb024a1796c3148790578 (patch)
tree8004e1dc2c6893f2aa0b8a2279718a2120fef838 /drivers
parent51da8e2b4e0e4b14e5ec0fd32473dcfc2562b822 (diff)
downloadlinux-stable-0ffbf8bf21db0186e9fbb024a1796c3148790578.tar.gz
linux-stable-0ffbf8bf21db0186e9fbb024a1796c3148790578.tar.bz2
linux-stable-0ffbf8bf21db0186e9fbb024a1796c3148790578.zip
Revert "appletalk: move to staging"
This reverts commit a6238f21736af3f47bdebf3895f477f5f23f1af9 Appletalk got some patches to fix up the BLK usage in it in the network tree, so this removal isn't needed. Cc: Arnd Bergmann <arnd@arndb.de> Cc: <acme@ghostprotocols.net> Cc: netdev@vger.kernel.org, Cc: David Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/Makefile1
-rw-r--r--drivers/net/appletalk/Kconfig (renamed from drivers/staging/appletalk/Kconfig)0
-rw-r--r--drivers/net/appletalk/Makefile7
-rw-r--r--drivers/net/appletalk/cops.c (renamed from drivers/staging/appletalk/cops.c)2
-rw-r--r--drivers/net/appletalk/cops.h (renamed from drivers/staging/appletalk/cops.h)0
-rw-r--r--drivers/net/appletalk/cops_ffdrv.h (renamed from drivers/staging/appletalk/cops_ffdrv.h)0
-rw-r--r--drivers/net/appletalk/cops_ltdrv.h (renamed from drivers/staging/appletalk/cops_ltdrv.h)0
-rw-r--r--drivers/net/appletalk/ipddp.c (renamed from drivers/staging/appletalk/ipddp.c)2
-rw-r--r--drivers/net/appletalk/ipddp.h (renamed from drivers/staging/appletalk/ipddp.h)0
-rw-r--r--drivers/net/appletalk/ltpc.c (renamed from drivers/staging/appletalk/ltpc.c)2
-rw-r--r--drivers/net/appletalk/ltpc.h (renamed from drivers/staging/appletalk/ltpc.h)0
-rw-r--r--drivers/staging/Kconfig2
-rw-r--r--drivers/staging/Makefile1
-rw-r--r--drivers/staging/appletalk/Makefile12
-rw-r--r--drivers/staging/appletalk/aarp.c1063
-rw-r--r--drivers/staging/appletalk/atalk.h208
-rw-r--r--drivers/staging/appletalk/atalk_proc.c301
-rw-r--r--drivers/staging/appletalk/ddp.c1981
-rw-r--r--drivers/staging/appletalk/dev.c44
-rw-r--r--drivers/staging/appletalk/sysctl_net_atalk.c61
20 files changed, 11 insertions, 3676 deletions
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 11a9c053f0c8..b90738d13994 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -265,6 +265,7 @@ obj-$(CONFIG_MACB) += macb.o
obj-$(CONFIG_S6GMAC) += s6gmac.o
obj-$(CONFIG_ARM) += arm/
+obj-$(CONFIG_DEV_APPLETALK) += appletalk/
obj-$(CONFIG_TR) += tokenring/
obj-$(CONFIG_WAN) += wan/
obj-$(CONFIG_ARCNET) += arcnet/
diff --git a/drivers/staging/appletalk/Kconfig b/drivers/net/appletalk/Kconfig
index 0b376a990972..0b376a990972 100644
--- a/drivers/staging/appletalk/Kconfig
+++ b/drivers/net/appletalk/Kconfig
diff --git a/drivers/net/appletalk/Makefile b/drivers/net/appletalk/Makefile
new file mode 100644
index 000000000000..6cfc705f7c5c
--- /dev/null
+++ b/drivers/net/appletalk/Makefile
@@ -0,0 +1,7 @@
+#
+# Makefile for drivers/net/appletalk
+#
+
+obj-$(CONFIG_IPDDP) += ipddp.o
+obj-$(CONFIG_COPS) += cops.o
+obj-$(CONFIG_LTPC) += ltpc.o
diff --git a/drivers/staging/appletalk/cops.c b/drivers/net/appletalk/cops.c
index 661d42eff7d8..748c9f526e71 100644
--- a/drivers/staging/appletalk/cops.c
+++ b/drivers/net/appletalk/cops.c
@@ -65,6 +65,7 @@ static const char *version =
#include <linux/if_arp.h>
#include <linux/if_ltalk.h>
#include <linux/delay.h> /* For udelay() */
+#include <linux/atalk.h>
#include <linux/spinlock.h>
#include <linux/bitops.h>
#include <linux/jiffies.h>
@@ -73,7 +74,6 @@ static const char *version =
#include <asm/io.h>
#include <asm/dma.h>
-#include "atalk.h"
#include "cops.h" /* Our Stuff */
#include "cops_ltdrv.h" /* Firmware code for Tangent type cards. */
#include "cops_ffdrv.h" /* Firmware code for Dayna type cards. */
diff --git a/drivers/staging/appletalk/cops.h b/drivers/net/appletalk/cops.h
index fd2750b269c8..fd2750b269c8 100644
--- a/drivers/staging/appletalk/cops.h
+++ b/drivers/net/appletalk/cops.h
diff --git a/drivers/staging/appletalk/cops_ffdrv.h b/drivers/net/appletalk/cops_ffdrv.h
index b02005087c1b..b02005087c1b 100644
--- a/drivers/staging/appletalk/cops_ffdrv.h
+++ b/drivers/net/appletalk/cops_ffdrv.h
diff --git a/drivers/staging/appletalk/cops_ltdrv.h b/drivers/net/appletalk/cops_ltdrv.h
index c699b1ad31da..c699b1ad31da 100644
--- a/drivers/staging/appletalk/cops_ltdrv.h
+++ b/drivers/net/appletalk/cops_ltdrv.h
diff --git a/drivers/staging/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c
index 58b4e6098ad4..10d0dba572c2 100644
--- a/drivers/staging/appletalk/ipddp.c
+++ b/drivers/net/appletalk/ipddp.c
@@ -29,12 +29,12 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ip.h>
+#include <linux/atalk.h>
#include <linux/if_arp.h>
#include <linux/slab.h>
#include <net/route.h>
#include <asm/uaccess.h>
-#include "atalk.h"
#include "ipddp.h" /* Our stuff */
static const char version[] = KERN_INFO "ipddp.c:v0.01 8/28/97 Bradford W. Johnson <johns393@maroon.tc.umn.edu>\n";
diff --git a/drivers/staging/appletalk/ipddp.h b/drivers/net/appletalk/ipddp.h
index 531519da99a3..531519da99a3 100644
--- a/drivers/staging/appletalk/ipddp.h
+++ b/drivers/net/appletalk/ipddp.h
diff --git a/drivers/staging/appletalk/ltpc.c b/drivers/net/appletalk/ltpc.c
index 60caf892695e..e69eead12ec7 100644
--- a/drivers/staging/appletalk/ltpc.c
+++ b/drivers/net/appletalk/ltpc.c
@@ -225,6 +225,7 @@ static int dma;
#include <linux/if_ltalk.h>
#include <linux/delay.h>
#include <linux/timer.h>
+#include <linux/atalk.h>
#include <linux/bitops.h>
#include <linux/gfp.h>
@@ -233,7 +234,6 @@ static int dma;
#include <asm/io.h>
/* our stuff */
-#include "atalk.h"
#include "ltpc.h"
static DEFINE_SPINLOCK(txqueue_lock);
diff --git a/drivers/staging/appletalk/ltpc.h b/drivers/net/appletalk/ltpc.h
index cd30544a3729..cd30544a3729 100644
--- a/drivers/staging/appletalk/ltpc.h
+++ b/drivers/net/appletalk/ltpc.h
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 584d4e264807..b80755da5394 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -169,8 +169,6 @@ source "drivers/staging/bcm/Kconfig"
source "drivers/staging/ft1000/Kconfig"
-source "drivers/staging/appletalk/Kconfig"
-
source "drivers/staging/intel_sst/Kconfig"
source "drivers/staging/speakup/Kconfig"
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index 88f0c64e7e58..fd26509e5efa 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -65,7 +65,6 @@ obj-$(CONFIG_ATH6K_LEGACY) += ath6kl/
obj-$(CONFIG_USB_ENESTORAGE) += keucr/
obj-$(CONFIG_BCM_WIMAX) += bcm/
obj-$(CONFIG_FT1000) += ft1000/
-obj-$(CONFIG_DEV_APPLETALK) += appletalk/
obj-$(CONFIG_SND_INTEL_SST) += intel_sst/
obj-$(CONFIG_SPEAKUP) += speakup/
obj-$(CONFIG_TOUCHSCREEN_CLEARPAD_TM1217) += cptm1217/
diff --git a/drivers/staging/appletalk/Makefile b/drivers/staging/appletalk/Makefile
deleted file mode 100644
index 2a5129a5c6bc..000000000000
--- a/drivers/staging/appletalk/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Makefile for drivers/staging/appletalk
-#
-obj-$(CONFIG_ATALK) += appletalk.o
-
-appletalk-y := aarp.o ddp.o dev.o
-appletalk-$(CONFIG_PROC_FS) += atalk_proc.o
-appletalk-$(CONFIG_SYSCTL) += sysctl_net_atalk.o
-
-obj-$(CONFIG_IPDDP) += ipddp.o
-obj-$(CONFIG_COPS) += cops.o
-obj-$(CONFIG_LTPC) += ltpc.o
diff --git a/drivers/staging/appletalk/aarp.c b/drivers/staging/appletalk/aarp.c
deleted file mode 100644
index 7163a1dd501f..000000000000
--- a/drivers/staging/appletalk/aarp.c
+++ /dev/null
@@ -1,1063 +0,0 @@
-/*
- * AARP: An implementation of the AppleTalk AARP protocol for
- * Ethernet 'ELAP'.
- *
- * Alan Cox <Alan.Cox@linux.org>
- *
- * This doesn't fit cleanly with the IP arp. Potentially we can use
- * the generic neighbour discovery code to clean this up.
- *
- * FIXME:
- * We ought to handle the retransmits with a single list and a
- * separate fast timer for when it is needed.
- * Use neighbour discovery code.
- * Token Ring Support.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- *
- * References:
- * Inside AppleTalk (2nd Ed).
- * Fixes:
- * Jaume Grau - flush caches on AARP_PROBE
- * Rob Newberry - Added proxy AARP and AARP proc fs,
- * moved probing from DDP module.
- * Arnaldo C. Melo - don't mangle rx packets
- *
- */
-
-#include <linux/if_arp.h>
-#include <linux/slab.h>
-#include <net/sock.h>
-#include <net/datalink.h>
-#include <net/psnap.h>
-#include "atalk.h"
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-
-int sysctl_aarp_expiry_time = AARP_EXPIRY_TIME;
-int sysctl_aarp_tick_time = AARP_TICK_TIME;
-int sysctl_aarp_retransmit_limit = AARP_RETRANSMIT_LIMIT;
-int sysctl_aarp_resolve_time = AARP_RESOLVE_TIME;
-
-/* Lists of aarp entries */
-/**
- * struct aarp_entry - AARP entry
- * @last_sent - Last time we xmitted the aarp request
- * @packet_queue - Queue of frames wait for resolution
- * @status - Used for proxy AARP
- * expires_at - Entry expiry time
- * target_addr - DDP Address
- * dev - Device to use
- * hwaddr - Physical i/f address of target/router
- * xmit_count - When this hits 10 we give up
- * next - Next entry in chain
- */
-struct aarp_entry {
- /* These first two are only used for unresolved entries */
- unsigned long last_sent;
- struct sk_buff_head packet_queue;
- int status;
- unsigned long expires_at;
- struct atalk_addr target_addr;
- struct net_device *dev;
- char hwaddr[6];
- unsigned short xmit_count;
- struct aarp_entry *next;
-};
-
-/* Hashed list of resolved, unresolved and proxy entries */
-static struct aarp_entry *resolved[AARP_HASH_SIZE];
-static struct aarp_entry *unresolved[AARP_HASH_SIZE];
-static struct aarp_entry *proxies[AARP_HASH_SIZE];
-static int unresolved_count;
-
-/* One lock protects it all. */
-static DEFINE_RWLOCK(aarp_lock);
-
-/* Used to walk the list and purge/kick entries. */
-static struct timer_list aarp_timer;
-
-/*
- * Delete an aarp queue
- *
- * Must run under aarp_lock.
- */
-static void __aarp_expire(struct aarp_entry *a)
-{
- skb_queue_purge(&a->packet_queue);
- kfree(a);
-}
-
-/*
- * Send an aarp queue entry request
- *
- * Must run under aarp_lock.
- */
-static void __aarp_send_query(struct aarp_entry *a)
-{
- static unsigned char aarp_eth_multicast[ETH_ALEN] =
- { 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF };
- struct net_device *dev = a->dev;
- struct elapaarp *eah;
- int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length;
- struct sk_buff *skb = alloc_skb(len, GFP_ATOMIC);
- struct atalk_addr *sat = atalk_find_dev_addr(dev);
-
- if (!skb)
- return;
-
- if (!sat) {
- kfree_skb(skb);
- return;
- }
-
- /* Set up the buffer */
- skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
- skb_reset_network_header(skb);
- skb_reset_transport_header(skb);
- skb_put(skb, sizeof(*eah));
- skb->protocol = htons(ETH_P_ATALK);
- skb->dev = dev;
- eah = aarp_hdr(skb);
-
- /* Set up the ARP */
- eah->hw_type = htons(AARP_HW_TYPE_ETHERNET);
- eah->pa_type = htons(ETH_P_ATALK);
- eah->hw_len = ETH_ALEN;
- eah->pa_len = AARP_PA_ALEN;
- eah->function = htons(AARP_REQUEST);
-
- memcpy(eah->hw_src, dev->dev_addr, ETH_ALEN);
-
- eah->pa_src_zero = 0;
- eah->pa_src_net = sat->s_net;
- eah->pa_src_node = sat->s_node;
-
- memset(eah->hw_dst, '\0', ETH_ALEN);
-
- eah->pa_dst_zero = 0;
- eah->pa_dst_net = a->target_addr.s_net;
- eah->pa_dst_node = a->target_addr.s_node;
-
- /* Send it */
- aarp_dl->request(aarp_dl, skb, aarp_eth_multicast);
- /* Update the sending count */
- a->xmit_count++;
- a->last_sent = jiffies;
-}
-
-/* This runs under aarp_lock and in softint context, so only atomic memory
- * allocations can be used. */
-static void aarp_send_reply(struct net_device *dev, struct atalk_addr *us,
- struct atalk_addr *them, unsigned char *sha)
-{
- struct elapaarp *eah;
- int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length;
- struct sk_buff *skb = alloc_skb(len, GFP_ATOMIC);
-
- if (!skb)
- return;
-
- /* Set up the buffer */
- skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
- skb_reset_network_header(skb);
- skb_reset_transport_header(skb);
- skb_put(skb, sizeof(*eah));
- skb->protocol = htons(ETH_P_ATALK);
- skb->dev = dev;
- eah = aarp_hdr(skb);
-
- /* Set up the ARP */
- eah->hw_type = htons(AARP_HW_TYPE_ETHERNET);
- eah->pa_type = htons(ETH_P_ATALK);
- eah->hw_len = ETH_ALEN;
- eah->pa_len = AARP_PA_ALEN;
- eah->function = htons(AARP_REPLY);
-
- memcpy(eah->hw_src, dev->dev_addr, ETH_ALEN);
-
- eah->pa_src_zero = 0;
- eah->pa_src_net = us->s_net;
- eah->pa_src_node = us->s_node;
-
- if (!sha)
- memset(eah->hw_dst, '\0', ETH_ALEN);
- else
- memcpy(eah->hw_dst, sha, ETH_ALEN);
-
- eah->pa_dst_zero = 0;
- eah->pa_dst_net = them->s_net;
- eah->pa_dst_node = them->s_node;
-
- /* Send it */
- aarp_dl->request(aarp_dl, skb, sha);
-}
-
-/*
- * Send probe frames. Called from aarp_probe_network and
- * aarp_proxy_probe_network.
- */
-
-static void aarp_send_probe(struct net_device *dev, struct atalk_addr *us)
-{
- struct elapaarp *eah;
- int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length;
- struct sk_buff *skb = alloc_skb(len, GFP_ATOMIC);
- static unsigned char aarp_eth_multicast[ETH_ALEN] =
- { 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF };
-
- if (!skb)
- return;
-
- /* Set up the buffer */
- skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
- skb_reset_network_header(skb);
- skb_reset_transport_header(skb);
- skb_put(skb, sizeof(*eah));
- skb->protocol = htons(ETH_P_ATALK);
- skb->dev = dev;
- eah = aarp_hdr(skb);
-
- /* Set up the ARP */
- eah->hw_type = htons(AARP_HW_TYPE_ETHERNET);
- eah->pa_type = htons(ETH_P_ATALK);
- eah->hw_len = ETH_ALEN;
- eah->pa_len = AARP_PA_ALEN;
- eah->function = htons(AARP_PROBE);
-
- memcpy(eah->hw_src, dev->dev_addr, ETH_ALEN);
-
- eah->pa_src_zero = 0;
- eah->pa_src_net = us->s_net;
- eah->pa_src_node = us->s_node;
-
- memset(eah->hw_dst, '\0', ETH_ALEN);
-
- eah->pa_dst_zero = 0;
- eah->pa_dst_net = us->s_net;
- eah->pa_dst_node = us->s_node;
-
- /* Send it */
- aarp_dl->request(aarp_dl, skb, aarp_eth_multicast);
-}
-
-/*
- * Handle an aarp timer expire
- *
- * Must run under the aarp_lock.
- */
-
-static void __aarp_expire_timer(struct aarp_entry **n)
-{
- struct aarp_entry *t;
-
- while (*n)
- /* Expired ? */
- if (time_after(jiffies, (*n)->expires_at)) {
- t = *n;
- *n = (*n)->next;
- __aarp_expire(t);
- } else
- n = &((*n)->next);
-}
-
-/*
- * Kick all pending requests 5 times a second.
- *
- * Must run under the aarp_lock.
- */
-static void __aarp_kick(struct aarp_entry **n)
-{
- struct aarp_entry *t;
-
- while (*n)
- /* Expired: if this will be the 11th tx, we delete instead. */
- if ((*n)->xmit_count >= sysctl_aarp_retransmit_limit) {
- t = *n;
- *n = (*n)->next;
- __aarp_expire(t);
- } else {
- __aarp_send_query(*n);
- n = &((*n)->next);
- }
-}
-
-/*
- * A device has gone down. Take all entries referring to the device
- * and remove them.
- *
- * Must run under the aarp_lock.
- */
-static void __aarp_expire_device(struct aarp_entry **n, struct net_device *dev)
-{
- struct aarp_entry *t;
-
- while (*n)
- if ((*n)->dev == dev) {
- t = *n;
- *n = (*n)->next;
- __aarp_expire(t);
- } else
- n = &((*n)->next);
-}
-
-/* Handle the timer event */
-static void aarp_expire_timeout(unsigned long unused)
-{
- int ct;
-
- write_lock_bh(&aarp_lock);
-
- for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
- __aarp_expire_timer(&resolved[ct]);
- __aarp_kick(&unresolved[ct]);
- __aarp_expire_timer(&unresolved[ct]);
- __aarp_expire_timer(&proxies[ct]);
- }
-
- write_unlock_bh(&aarp_lock);
- mod_timer(&aarp_timer, jiffies +
- (unresolved_count ? sysctl_aarp_tick_time :
- sysctl_aarp_expiry_time));
-}
-
-/* Network device notifier chain handler. */
-static int aarp_device_event(struct notifier_block *this, unsigned long event,
- void *ptr)
-{
- struct net_device *dev = ptr;
- int ct;
-
- if (!net_eq(dev_net(dev), &init_net))
- return NOTIFY_DONE;
-
- if (event == NETDEV_DOWN) {
- write_lock_bh(&aarp_lock);
-
- for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
- __aarp_expire_device(&resolved[ct], dev);
- __aarp_expire_device(&unresolved[ct], dev);
- __aarp_expire_device(&proxies[ct], dev);
- }
-
- write_unlock_bh(&aarp_lock);
- }
- return NOTIFY_DONE;
-}
-
-/* Expire all entries in a hash chain */
-static void __aarp_expire_all(struct aarp_entry **n)
-{
- struct aarp_entry *t;
-
- while (*n) {
- t = *n;
- *n = (*n)->next;
- __aarp_expire(t);
- }
-}
-
-/* Cleanup all hash chains -- module unloading */
-static void aarp_purge(void)
-{
- int ct;
-
- write_lock_bh(&aarp_lock);
- for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
- __aarp_expire_all(&resolved[ct]);
- __aarp_expire_all(&unresolved[ct]);
- __aarp_expire_all(&proxies[ct]);
- }
- write_unlock_bh(&aarp_lock);
-}
-
-/*
- * Create a new aarp entry. This must use GFP_ATOMIC because it
- * runs while holding spinlocks.
- */
-static struct aarp_entry *aarp_alloc(void)
-{
- struct aarp_entry *a = kmalloc(sizeof(*a), GFP_ATOMIC);
-
- if (a)
- skb_queue_head_init(&a->packet_queue);
- return a;
-}
-
-/*
- * Find an entry. We might return an expired but not yet purged entry. We
- * don't care as it will do no harm.
- *
- * This must run under the aarp_lock.
- */
-static struct aarp_entry *__aarp_find_entry(struct aarp_entry *list,
- struct net_device *dev,
- struct atalk_addr *sat)
-{
- while (list) {
- if (list->target_addr.s_net == sat->s_net &&
- list->target_addr.s_node == sat->s_node &&
- list->dev == dev)
- break;
- list = list->next;
- }
-
- return list;
-}
-
-/* Called from the DDP code, and thus must be exported. */
-void aarp_proxy_remove(struct net_device *dev, struct atalk_addr *sa)
-{
- int hash = sa->s_node % (AARP_HASH_SIZE - 1);
- struct aarp_entry *a;
-
- write_lock_bh(&aarp_lock);
-
- a = __aarp_find_entry(proxies[hash], dev, sa);
- if (a)
- a->expires_at = jiffies - 1;
-
- write_unlock_bh(&aarp_lock);
-}
-
-/* This must run under aarp_lock. */
-static struct atalk_addr *__aarp_proxy_find(struct net_device *dev,
- struct atalk_addr *sa)
-{
- int hash = sa->s_node % (AARP_HASH_SIZE - 1);
- struct aarp_entry *a = __aarp_find_entry(proxies[hash], dev, sa);
-
- return a ? sa : NULL;
-}
-
-/*
- * Probe a Phase 1 device or a device that requires its Net:Node to
- * be set via an ioctl.
- */
-static void aarp_send_probe_phase1(struct atalk_iface *iface)
-{
- struct ifreq atreq;
- struct sockaddr_at *sa = (struct sockaddr_at *)&atreq.ifr_addr;
- const struct net_device_ops *ops = iface->dev->netdev_ops;
-
- sa->sat_addr.s_node = iface->address.s_node;
- sa->sat_addr.s_net = ntohs(iface->address.s_net);
-
- /* We pass the Net:Node to the drivers/cards by a Device ioctl. */
- if (!(ops->ndo_do_ioctl(iface->dev, &atreq, SIOCSIFADDR))) {
- ops->ndo_do_ioctl(iface->dev, &atreq, SIOCGIFADDR);
- if (iface->address.s_net != htons(sa->sat_addr.s_net) ||
- iface->address.s_node != sa->sat_addr.s_node)
- iface->status |= ATIF_PROBE_FAIL;
-
- iface->address.s_net = htons(sa->sat_addr.s_net);
- iface->address.s_node = sa->sat_addr.s_node;
- }
-}
-
-
-void aarp_probe_network(struct atalk_iface *atif)
-{
- if (atif->dev->type == ARPHRD_LOCALTLK ||
- atif->dev->type == ARPHRD_PPP)
- aarp_send_probe_phase1(atif);
- else {
- unsigned int count;
-
- for (count = 0; count < AARP_RETRANSMIT_LIMIT; count++) {
- aarp_send_probe(atif->dev, &atif->address);
-
- /* Defer 1/10th */
- msleep(100);
-
- if (atif->status & ATIF_PROBE_FAIL)
- break;
- }
- }
-}
-
-int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa)
-{
- int hash, retval = -EPROTONOSUPPORT;
- struct aarp_entry *entry;
- unsigned int count;
-
- /*
- * we don't currently support LocalTalk or PPP for proxy AARP;
- * if someone wants to try and add it, have fun
- */
- if (atif->dev->type == ARPHRD_LOCALTLK ||
- atif->dev->type == ARPHRD_PPP)
- goto out;
-
- /*
- * create a new AARP entry with the flags set to be published --
- * we need this one to hang around even if it's in use
- */
- entry = aarp_alloc();
- retval = -ENOMEM;
- if (!entry)
- goto out;
-
- entry->expires_at = -1;
- entry->status = ATIF_PROBE;
- entry->target_addr.s_node = sa->s_node;
- entry->target_addr.s_net = sa->s_net;
- entry->dev = atif->dev;
-
- write_lock_bh(&aarp_lock);
-
- hash = sa->s_node % (AARP_HASH_SIZE - 1);
- entry->next = proxies[hash];
- proxies[hash] = entry;
-
- for (count = 0; count < AARP_RETRANSMIT_LIMIT; count++) {
- aarp_send_probe(atif->dev, sa);
-
- /* Defer 1/10th */
- write_unlock_bh(&aarp_lock);
- msleep(100);
- write_lock_bh(&aarp_lock);
-
- if (entry->status & ATIF_PROBE_FAIL)
- break;
- }
-
- if (entry->status & ATIF_PROBE_FAIL) {
- entry->expires_at = jiffies - 1; /* free the entry */
- retval = -EADDRINUSE; /* return network full */
- } else { /* clear the probing flag */
- entry->status &= ~ATIF_PROBE;
- retval = 1;
- }
-
- write_unlock_bh(&aarp_lock);
-out:
- return retval;
-}
-
-/* Send a DDP frame */
-int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
- struct atalk_addr *sa, void *hwaddr)
-{
- static char ddp_eth_multicast[ETH_ALEN] =
- { 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF };
- int hash;
- struct aarp_entry *a;
-
- skb_reset_network_header(skb);
-
- /* Check for LocalTalk first */
- if (dev->type == ARPHRD_LOCALTLK) {
- struct atalk_addr *at = atalk_find_dev_addr(dev);
- struct ddpehdr *ddp = (struct ddpehdr *)skb->data;
- int ft = 2;
-
- /*
- * Compressible ?
- *
- * IFF: src_net == dest_net == device_net
- * (zero matches anything)
- */
-
- if ((!ddp->deh_snet || at->s_net == ddp->deh_snet) &&
- (!ddp->deh_dnet || at->s_net == ddp->deh_dnet)) {
- skb_pull(skb, sizeof(*ddp) - 4);
-
- /*
- * The upper two remaining bytes are the port
- * numbers we just happen to need. Now put the
- * length in the lower two.
- */
- *((__be16 *)skb->data) = htons(skb->len);
- ft = 1;
- }
- /*
- * Nice and easy. No AARP type protocols occur here so we can
- * just shovel it out with a 3 byte LLAP header
- */
-
- skb_push(skb, 3);
- skb->data[0] = sa->s_node;
- skb->data[1] = at->s_node;
- skb->data[2] = ft;
- skb->dev = dev;
- goto sendit;
- }
-
- /* On a PPP link we neither compress nor aarp. */
- if (dev->type == ARPHRD_PPP) {
- skb->protocol = htons(ETH_P_PPPTALK);
- skb->dev = dev;
- goto sendit;
- }
-
- /* Non ELAP we cannot do. */
- if (dev->type != ARPHRD_ETHER)
- goto free_it;
-
- skb->dev = dev;
- skb->protocol = htons(ETH_P_ATALK);
- hash = sa->s_node % (AARP_HASH_SIZE - 1);
-
- /* Do we have a resolved entry? */
- if (sa->s_node == ATADDR_BCAST) {
- /* Send it */
- ddp_dl->request(ddp_dl, skb, ddp_eth_multicast);
- goto sent;
- }
-
- write_lock_bh(&aarp_lock);
- a = __aarp_find_entry(resolved[hash], dev, sa);
-
- if (a) { /* Return 1 and fill in the address */
- a->expires_at = jiffies + (sysctl_aarp_expiry_time * 10);
- ddp_dl->request(ddp_dl, skb, a->hwaddr);
- write_unlock_bh(&aarp_lock);
- goto sent;
- }
-
- /* Do we have an unresolved entry: This is the less common path */
- a = __aarp_find_entry(unresolved[hash], dev, sa);
- if (a) { /* Queue onto the unresolved queue */
- skb_queue_tail(&a->packet_queue, skb);
- goto out_unlock;
- }
-
- /* Allocate a new entry */
- a = aarp_alloc();
- if (!a) {
- /* Whoops slipped... good job it's an unreliable protocol 8) */
- write_unlock_bh(&aarp_lock);
- goto free_it;
- }
-
- /* Set up the queue */
- skb_queue_tail(&a->packet_queue, skb);
- a->expires_at = jiffies + sysctl_aarp_resolve_time;
- a->dev = dev;
- a->next = unresolved[hash];
- a->target_addr = *sa;
- a->xmit_count = 0;
- unresolved[hash] = a;
- unresolved_count++;
-
- /* Send an initial request for the address */
- __aarp_send_query(a);
-
- /*
- * Switch to fast timer if needed (That is if this is the first
- * unresolved entry to get added)
- */
-
- if (unresolved_count == 1)
- mod_timer(&aarp_timer, jiffies + sysctl_aarp_tick_time);
-
- /* Now finally, it is safe to drop the lock. */
-out_unlock:
- write_unlock_bh(&aarp_lock);
-
- /* Tell the ddp layer we have taken over for this frame. */
- goto sent;
-
-sendit:
- if (skb->sk)
- skb->priority = skb->sk->sk_priority;
- if (dev_queue_xmit(skb))
- goto drop;
-sent:
- return NET_XMIT_SUCCESS;
-free_it:
- kfree_skb(skb);
-drop:
- return NET_XMIT_DROP;
-}
-EXPORT_SYMBOL(aarp_send_ddp);
-
-/*
- * An entry in the aarp unresolved queue has become resolved. Send
- * all the frames queued under it.
- *
- * Must run under aarp_lock.
- */
-static void __aarp_resolved(struct aarp_entry **list, struct aarp_entry *a,
- int hash)
-{
- struct sk_buff *skb;
-
- while (*list)
- if (*list == a) {
- unresolved_count--;
- *list = a->next;
-
- /* Move into the resolved list */
- a->next = resolved[hash];
- resolved[hash] = a;
-
- /* Kick frames off */
- while ((skb = skb_dequeue(&a->packet_queue)) != NULL) {
- a->expires_at = jiffies +
- sysctl_aarp_expiry_time * 10;
- ddp_dl->request(ddp_dl, skb, a->hwaddr);
- }
- } else
- list = &((*list)->next);
-}
-
-/*
- * This is called by the SNAP driver whenever we see an AARP SNAP
- * frame. We currently only support Ethernet.
- */
-static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
- struct packet_type *pt, struct net_device *orig_dev)
-{
- struct elapaarp *ea = aarp_hdr(skb);
- int hash, ret = 0;
- __u16 function;
- struct aarp_entry *a;
- struct atalk_addr sa, *ma, da;
- struct atalk_iface *ifa;
-
- if (!net_eq(dev_net(dev), &init_net))
- goto out0;
-
- /* We only do Ethernet SNAP AARP. */
- if (dev->type != ARPHRD_ETHER)
- goto out0;
-
- /* Frame size ok? */
- if (!skb_pull(skb, sizeof(*ea)))
- goto out0;
-
- function = ntohs(ea->function);
-
- /* Sanity check fields. */
- if (function < AARP_REQUEST || function > AARP_PROBE ||
- ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN ||
- ea->pa_src_zero || ea->pa_dst_zero)
- goto out0;
-
- /* Looks good. */
- hash = ea->pa_src_node % (AARP_HASH_SIZE - 1);
-
- /* Build an address. */
- sa.s_node = ea->pa_src_node;
- sa.s_net = ea->pa_src_net;
-
- /* Process the packet. Check for replies of me. */
- ifa = atalk_find_dev(dev);
- if (!ifa)
- goto out1;
-
- if (ifa->status & ATIF_PROBE &&
- ifa->address.s_node == ea->pa_dst_node &&
- ifa->address.s_net == ea->pa_dst_net) {
- ifa->status |= ATIF_PROBE_FAIL; /* Fail the probe (in use) */
- goto out1;
- }
-
- /* Check for replies of proxy AARP entries */
- da.s_node = ea->pa_dst_node;
- da.s_net = ea->pa_dst_net;
-
- write_lock_bh(&aarp_lock);
- a = __aarp_find_entry(proxies[hash], dev, &da);
-
- if (a && a->status & ATIF_PROBE) {
- a->status |= ATIF_PROBE_FAIL;
- /*
- * we do not respond to probe or request packets for
- * this address while we are probing this address
- */
- goto unlock;
- }
-
- switch (function) {
- case AARP_REPLY:
- if (!unresolved_count) /* Speed up */
- break;
-
- /* Find the entry. */
- a = __aarp_find_entry(unresolved[hash], dev, &sa);
- if (!a || dev != a->dev)
- break;
-
- /* We can fill one in - this is good. */
- memcpy(a->hwaddr, ea->hw_src, ETH_ALEN);
- __aarp_resolved(&unresolved[hash], a, hash);
- if (!unresolved_count)
- mod_timer(&aarp_timer,
- jiffies + sysctl_aarp_expiry_time);
- break;
-
- case AARP_REQUEST:
- case AARP_PROBE:
-
- /*
- * If it is my address set ma to my address and reply.
- * We can treat probe and request the same. Probe
- * simply means we shouldn't cache the querying host,
- * as in a probe they are proposing an address not
- * using one.
- *
- * Support for proxy-AARP added. We check if the
- * address is one of our proxies before we toss the
- * packet out.
- */
-
- sa.s_node = ea->pa_dst_node;
- sa.s_net = ea->pa_dst_net;
-
- /* See if we have a matching proxy. */
- ma = __aarp_proxy_find(dev, &sa);
- if (!ma)
- ma = &ifa->address;
- else { /* We need to make a copy of the entry. */
- da.s_node = sa.s_node;
- da.s_net = sa.s_net;
- ma = &da;
- }
-
- if (function == AARP_PROBE) {
- /*
- * A probe implies someone trying to get an
- * address. So as a precaution flush any
- * entries we have for this address.
- */
- a = __aarp_find_entry(resolved[sa.s_node %
- (AARP_HASH_SIZE - 1)],
- skb->dev, &sa);
-
- /*
- * Make it expire next tick - that avoids us
- * getting into a probe/flush/learn/probe/
- * flush/learn cycle during probing of a slow
- * to respond host addr.
- */
- if (a) {
- a->expires_at = jiffies - 1;
- mod_timer(&aarp_timer, jiffies +
- sysctl_aarp_tick_time);
- }
- }
-
- if (sa.s_node != ma->s_node)
- break;
-
- if (sa.s_net && ma->s_net && sa.s_net != ma->s_net)
- break;
-
- sa.s_node = ea->pa_src_node;
- sa.s_net = ea->pa_src_net;
-
- /* aarp_my_address has found the address to use for us.
- */
- aarp_send_reply(dev, ma, &sa, ea->hw_src);
- break;
- }
-
-unlock:
- write_unlock_bh(&aarp_lock);
-out1:
- ret = 1;
-out0:
- kfree_skb(skb);
- return ret;
-}
-
-static struct notifier_block aarp_notifier = {
- .notifier_call = aarp_device_event,
-};
-
-static unsigned char aarp_snap_id[] = { 0x00, 0x00, 0x00, 0x80, 0xF3 };
-
-void __init aarp_proto_init(void)
-{
- aarp_dl = register_snap_client(aarp_snap_id, aarp_rcv);
- if (!aarp_dl)
- printk(KERN_CRIT "Unable to register AARP with SNAP.\n");
- setup_timer(&aarp_timer, aarp_expire_timeout, 0);
- aarp_timer.expires = jiffies + sysctl_aarp_expiry_time;
- add_timer(&aarp_timer);
- register_netdevice_notifier(&aarp_notifier);
-}
-
-/* Remove the AARP entries associated with a device. */
-void aarp_device_down(struct net_device *dev)
-{
- int ct;
-
- write_lock_bh(&aarp_lock);
-
- for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
- __aarp_expire_device(&resolved[ct], dev);
- __aarp_expire_device(&unresolved[ct], dev);
- __aarp_expire_device(&proxies[ct], dev);
- }
-
- write_unlock_bh(&aarp_lock);
-}
-
-#ifdef CONFIG_PROC_FS
-struct aarp_iter_state {
- int bucket;
- struct aarp_entry **table;
-};
-
-/*
- * Get the aarp entry that is in the chain described
- * by the iterator.
- * If pos is set then skip till that index.
- * pos = 1 is the first entry
- */
-static struct aarp_entry *iter_next(struct aarp_iter_state *iter, loff_t *pos)
-{
- int ct = iter->bucket;
- struct aarp_entry **table = iter->table;
- loff_t off = 0;
- struct aarp_entry *entry;
-
- rescan:
- while(ct < AARP_HASH_SIZE) {
- for (entry = table[ct]; entry; entry = entry->next) {
- if (!pos || ++off == *pos) {
- iter->table = table;
- iter->bucket = ct;
- return entry;
- }
- }
- ++ct;
- }
-
- if (table == resolved) {
- ct = 0;
- table = unresolved;
- goto rescan;
- }
- if (table == unresolved) {
- ct = 0;
- table = proxies;
- goto rescan;
- }
- return NULL;
-}
-
-static void *aarp_seq_start(struct seq_file *seq, loff_t *pos)
- __acquires(aarp_lock)
-{
- struct aarp_iter_state *iter = seq->private;
-
- read_lock_bh(&aarp_lock);
- iter->table = resolved;
- iter->bucket = 0;
-
- return *pos ? iter_next(iter, pos) : SEQ_START_TOKEN;
-}
-
-static void *aarp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-{
- struct aarp_entry *entry = v;
- struct aarp_iter_state *iter = seq->private;
-
- ++*pos;
-
- /* first line after header */
- if (v == SEQ_START_TOKEN)
- entry = iter_next(iter, NULL);
-
- /* next entry in current bucket */
- else if (entry->next)
- entry = entry->next;
-
- /* next bucket or table */
- else {
- ++iter->bucket;
- entry = iter_next(iter, NULL);
- }
- return entry;
-}
-
-static void aarp_seq_stop(struct seq_file *seq, void *v)
- __releases(aarp_lock)
-{
- read_unlock_bh(&aarp_lock);
-}
-
-static const char *dt2str(unsigned long ticks)
-{
- static char buf[32];
-
- sprintf(buf, "%ld.%02ld", ticks / HZ, ((ticks % HZ) * 100 ) / HZ);
-
- return buf;
-}
-
-static int aarp_seq_show(struct seq_file *seq, void *v)
-{
- struct aarp_iter_state *iter = seq->private;
- struct aarp_entry *entry = v;
- unsigned long now = jiffies;
-
- if (v == SEQ_START_TOKEN)
- seq_puts(seq,
- "Address Interface Hardware Address"
- " Expires LastSend Retry Status\n");
- else {
- seq_printf(seq, "%04X:%02X %-12s",
- ntohs(entry->target_addr.s_net),
- (unsigned int) entry->target_addr.s_node,
- entry->dev ? entry->dev->name : "????");
- seq_printf(seq, "%pM", entry->hwaddr);
- seq_printf(seq, " %8s",
- dt2str((long)entry->expires_at - (long)now));
- if (iter->table == unresolved)
- seq_printf(seq, " %8s %6hu",
- dt2str(now - entry->last_sent),
- entry->xmit_count);
- else
- seq_puts(seq, " ");
- seq_printf(seq, " %s\n",
- (iter->table == resolved) ? "resolved"
- : (iter->table == unresolved) ? "unresolved"
- : (iter->table == proxies) ? "proxies"
- : "unknown");
- }
- return 0;
-}
-
-static const struct seq_operations aarp_seq_ops = {
- .start = aarp_seq_start,
- .next = aarp_seq_next,
- .stop = aarp_seq_stop,
- .show = aarp_seq_show,
-};
-
-static int aarp_seq_open(struct inode *inode, struct file *file)
-{
- return seq_open_private(file, &aarp_seq_ops,
- sizeof(struct aarp_iter_state));
-}
-
-const struct file_operations atalk_seq_arp_fops = {
- .owner = THIS_MODULE,
- .open = aarp_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release_private,
-};
-#endif
-
-/* General module cleanup. Called from cleanup_module() in ddp.c. */
-void aarp_cleanup_module(void)
-{
- del_timer_sync(&aarp_timer);
- unregister_netdevice_notifier(&aarp_notifier);
- unregister_snap_client(aarp_dl);
- aarp_purge();
-}
diff --git a/drivers/staging/appletalk/atalk.h b/drivers/staging/appletalk/atalk.h
deleted file mode 100644
index d34c187432ed..000000000000
--- a/drivers/staging/appletalk/atalk.h
+++ /dev/null
@@ -1,208 +0,0 @@
-#ifndef __LINUX_ATALK_H__
-#define __LINUX_ATALK_H__
-
-#include <linux/types.h>
-#include <asm/byteorder.h>
-
-/*
- * AppleTalk networking structures
- *
- * The following are directly referenced from the University Of Michigan
- * netatalk for compatibility reasons.
- */
-#define ATPORT_FIRST 1
-#define ATPORT_RESERVED 128
-#define ATPORT_LAST 254 /* 254 is only legal on localtalk */
-#define ATADDR_ANYNET (__u16)0
-#define ATADDR_ANYNODE (__u8)0
-#define ATADDR_ANYPORT (__u8)0
-#define ATADDR_BCAST (__u8)255
-#define DDP_MAXSZ 587
-#define DDP_MAXHOPS 15 /* 4 bits of hop counter */
-
-#define SIOCATALKDIFADDR (SIOCPROTOPRIVATE + 0)
-
-struct atalk_addr {
- __be16 s_net;
- __u8 s_node;
-};
-
-struct sockaddr_at {
- sa_family_t sat_family;
- __u8 sat_port;
- struct atalk_addr sat_addr;
- char sat_zero[8];
-};
-
-struct atalk_netrange {
- __u8 nr_phase;
- __be16 nr_firstnet;
- __be16 nr_lastnet;
-};
-
-#ifdef __KERNEL__
-
-#include <net/sock.h>
-
-struct atalk_route {
- struct net_device *dev;
- struct atalk_addr target;
- struct atalk_addr gateway;
- int flags;
- struct atalk_route *next;
-};
-
-/**
- * struct atalk_iface - AppleTalk Interface
- * @dev - Network device associated with this interface
- * @address - Our address
- * @status - What are we doing?
- * @nets - Associated direct netrange
- * @next - next element in the list of interfaces
- */
-struct atalk_iface {
- struct net_device *dev;
- struct atalk_addr address;
- int status;
-#define ATIF_PROBE 1 /* Probing for an address */
-#define ATIF_PROBE_FAIL 2 /* Probe collided */
- struct atalk_netrange nets;
- struct atalk_iface *next;
-};
-
-struct atalk_sock {
- /* struct sock has to be the first member of atalk_sock */
- struct sock sk;
- __be16 dest_net;
- __be16 src_net;
- unsigned char dest_node;
- unsigned char src_node;
- unsigned char dest_port;
- unsigned char src_port;
-};
-
-static inline struct atalk_sock *at_sk(struct sock *sk)
-{
- return (struct atalk_sock *)sk;
-}
-
-struct ddpehdr {
- __be16 deh_len_hops; /* lower 10 bits are length, next 4 - hops */
- __be16 deh_sum;
- __be16 deh_dnet;
- __be16 deh_snet;
- __u8 deh_dnode;
- __u8 deh_snode;
- __u8 deh_dport;
- __u8 deh_sport;
- /* And netatalk apps expect to stick the type in themselves */
-};
-
-static __inline__ struct ddpehdr *ddp_hdr(struct sk_buff *skb)
-{
- return (struct ddpehdr *)skb_transport_header(skb);
-}
-
-/* AppleTalk AARP headers */
-struct elapaarp {
- __be16 hw_type;
-#define AARP_HW_TYPE_ETHERNET 1
-#define AARP_HW_TYPE_TOKENRING 2
- __be16 pa_type;
- __u8 hw_len;
- __u8 pa_len;
-#define AARP_PA_ALEN 4
- __be16 function;
-#define AARP_REQUEST 1
-#define AARP_REPLY 2
-#define AARP_PROBE 3
- __u8 hw_src[ETH_ALEN];
- __u8 pa_src_zero;
- __be16 pa_src_net;
- __u8 pa_src_node;
- __u8 hw_dst[ETH_ALEN];
- __u8 pa_dst_zero;
- __be16 pa_dst_net;
- __u8 pa_dst_node;
-} __attribute__ ((packed));
-
-static __inline__ struct elapaarp *aarp_hdr(struct sk_buff *skb)
-{
- return (struct elapaarp *)skb_transport_header(skb);
-}
-
-/* Not specified - how long till we drop a resolved entry */
-#define AARP_EXPIRY_TIME (5 * 60 * HZ)
-/* Size of hash table */
-#define AARP_HASH_SIZE 16
-/* Fast retransmission timer when resolving */
-#define AARP_TICK_TIME (HZ / 5)
-/* Send 10 requests then give up (2 seconds) */
-#define AARP_RETRANSMIT_LIMIT 10
-/*
- * Some value bigger than total retransmit time + a bit for last reply to
- * appear and to stop continual requests
- */
-#define AARP_RESOLVE_TIME (10 * HZ)
-
-extern struct datalink_proto *ddp_dl, *aarp_dl;
-extern void aarp_proto_init(void);
-
-/* Inter module exports */
-
-/* Give a device find its atif control structure */
-static inline struct atalk_iface *atalk_find_dev(struct net_device *dev)
-{
- return dev->atalk_ptr;
-}
-
-extern struct atalk_addr *atalk_find_dev_addr(struct net_device *dev);
-extern struct net_device *atrtr_get_dev(struct atalk_addr *sa);
-extern int aarp_send_ddp(struct net_device *dev,
- struct sk_buff *skb,
- struct atalk_addr *sa, void *hwaddr);
-extern void aarp_device_down(struct net_device *dev);
-extern void aarp_probe_network(struct atalk_iface *atif);
-extern int aarp_proxy_probe_network(struct atalk_iface *atif,
- struct atalk_addr *sa);
-extern void aarp_proxy_remove(struct net_device *dev,
- struct atalk_addr *sa);
-
-extern void aarp_cleanup_module(void);
-
-extern struct hlist_head atalk_sockets;
-extern rwlock_t atalk_sockets_lock;
-
-extern struct atalk_route *atalk_routes;
-extern rwlock_t atalk_routes_lock;
-
-extern struct atalk_iface *atalk_interfaces;
-extern rwlock_t atalk_interfaces_lock;
-
-extern struct atalk_route atrtr_default;
-
-extern const struct file_operations atalk_seq_arp_fops;
-
-extern int sysctl_aarp_expiry_time;
-extern int sysctl_aarp_tick_time;
-extern int sysctl_aarp_retransmit_limit;
-extern int sysctl_aarp_resolve_time;
-
-#ifdef CONFIG_SYSCTL
-extern void atalk_register_sysctl(void);
-extern void atalk_unregister_sysctl(void);
-#else
-#define atalk_register_sysctl() do { } while(0)
-#define atalk_unregister_sysctl() do { } while(0)
-#endif
-
-#ifdef CONFIG_PROC_FS
-extern int atalk_proc_init(void);
-extern void atalk_proc_exit(void);
-#else
-#define atalk_proc_init() ({ 0; })
-#define atalk_proc_exit() do { } while(0)
-#endif /* CONFIG_PROC_FS */
-
-#endif /* __KERNEL__ */
-#endif /* __LINUX_ATALK_H__ */
diff --git a/drivers/staging/appletalk/atalk_proc.c b/drivers/staging/appletalk/atalk_proc.c
deleted file mode 100644
index d012ba2e67d1..000000000000
--- a/drivers/staging/appletalk/atalk_proc.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * atalk_proc.c - proc support for Appletalk
- *
- * Copyright(c) Arnaldo Carvalho de Melo <acme@conectiva.com.br>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, version 2.
- */
-
-#include <linux/init.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <net/net_namespace.h>
-#include <net/sock.h>
-#include "atalk.h"
-
-
-static __inline__ struct atalk_iface *atalk_get_interface_idx(loff_t pos)
-{
- struct atalk_iface *i;
-
- for (i = atalk_interfaces; pos && i; i = i->next)
- --pos;
-
- return i;
-}
-
-static void *atalk_seq_interface_start(struct seq_file *seq, loff_t *pos)
- __acquires(atalk_interfaces_lock)
-{
- loff_t l = *pos;
-
- read_lock_bh(&atalk_interfaces_lock);
- return l ? atalk_get_interface_idx(--l) : SEQ_START_TOKEN;
-}
-
-static void *atalk_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos)
-{
- struct atalk_iface *i;
-
- ++*pos;
- if (v == SEQ_START_TOKEN) {
- i = NULL;
- if (atalk_interfaces)
- i = atalk_interfaces;
- goto out;
- }
- i = v;
- i = i->next;
-out:
- return i;
-}
-
-static void atalk_seq_interface_stop(struct seq_file *seq, void *v)
- __releases(atalk_interfaces_lock)
-{
- read_unlock_bh(&atalk_interfaces_lock);
-}
-
-static int atalk_seq_interface_show(struct seq_file *seq, void *v)
-{
- struct atalk_iface *iface;
-
- if (v == SEQ_START_TOKEN) {
- seq_puts(seq, "Interface Address Networks "
- "Status\n");
- goto out;
- }
-
- iface = v;
- seq_printf(seq, "%-16s %04X:%02X %04X-%04X %d\n",
- iface->dev->name, ntohs(iface->address.s_net),
- iface->address.s_node, ntohs(iface->nets.nr_firstnet),
- ntohs(iface->nets.nr_lastnet), iface->status);
-out:
- return 0;
-}
-
-static __inline__ struct atalk_route *atalk_get_route_idx(loff_t pos)
-{
- struct atalk_route *r;
-
- for (r = atalk_routes; pos && r; r = r->next)
- --pos;
-
- return r;
-}
-
-static void *atalk_seq_route_start(struct seq_file *seq, loff_t *pos)
- __acquires(atalk_routes_lock)
-{
- loff_t l = *pos;
-
- read_lock_bh(&atalk_routes_lock);
- return l ? atalk_get_route_idx(--l) : SEQ_START_TOKEN;
-}
-
-static void *atalk_seq_route_next(struct seq_file *seq, void *v, loff_t *pos)
-{
- struct atalk_route *r;
-
- ++*pos;
- if (v == SEQ_START_TOKEN) {
- r = NULL;
- if (atalk_routes)
- r = atalk_routes;
- goto out;
- }
- r = v;
- r = r->next;
-out:
- return r;
-}
-
-static void atalk_seq_route_stop(struct seq_file *seq, void *v)
- __releases(atalk_routes_lock)
-{
- read_unlock_bh(&atalk_routes_lock);
-}
-
-static int atalk_seq_route_show(struct seq_file *seq, void *v)
-{
- struct atalk_route *rt;
-
- if (v == SEQ_START_TOKEN) {
- seq_puts(seq, "Target Router Flags Dev\n");
- goto out;
- }
-
- if (atrtr_default.dev) {
- rt = &atrtr_default;
- seq_printf(seq, "Default %04X:%02X %-4d %s\n",
- ntohs(rt->gateway.s_net), rt->gateway.s_node,
- rt->flags, rt->dev->name);
- }
-
- rt = v;
- seq_printf(seq, "%04X:%02X %04X:%02X %-4d %s\n",
- ntohs(rt->target.s_net), rt->target.s_node,
- ntohs(rt->gateway.s_net), rt->gateway.s_node,
- rt->flags, rt->dev->name);
-out:
- return 0;
-}
-
-static void *atalk_seq_socket_start(struct seq_file *seq, loff_t *pos)
- __acquires(atalk_sockets_lock)
-{
- read_lock_bh(&atalk_sockets_lock);
- return seq_hlist_start_head(&atalk_sockets, *pos);
-}
-
-static void *atalk_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos)
-{
- return seq_hlist_next(v, &atalk_sockets, pos);
-}
-
-static void atalk_seq_socket_stop(struct seq_file *seq, void *v)
- __releases(atalk_sockets_lock)
-{
- read_unlock_bh(&atalk_sockets_lock);
-}
-
-static int atalk_seq_socket_show(struct seq_file *seq, void *v)
-{
- struct sock *s;
- struct atalk_sock *at;
-
- if (v == SEQ_START_TOKEN) {
- seq_printf(seq, "Type Local_addr Remote_addr Tx_queue "
- "Rx_queue St UID\n");
- goto out;
- }
-
- s = sk_entry(v);
- at = at_sk(s);
-
- seq_printf(seq, "%02X %04X:%02X:%02X %04X:%02X:%02X %08X:%08X "
- "%02X %d\n",
- s->sk_type, ntohs(at->src_net), at->src_node, at->src_port,
- ntohs(at->dest_net), at->dest_node, at->dest_port,
- sk_wmem_alloc_get(s),
- sk_rmem_alloc_get(s),
- s->sk_state, SOCK_INODE(s->sk_socket)->i_uid);
-out:
- return 0;
-}
-
-static const struct seq_operations atalk_seq_interface_ops = {
- .start = atalk_seq_interface_start,
- .next = atalk_seq_interface_next,
- .stop = atalk_seq_interface_stop,
- .show = atalk_seq_interface_show,
-};
-
-static const struct seq_operations atalk_seq_route_ops = {
- .start = atalk_seq_route_start,
- .next = atalk_seq_route_next,
- .stop = atalk_seq_route_stop,
- .show = atalk_seq_route_show,
-};
-
-static const struct seq_operations atalk_seq_socket_ops = {
- .start = atalk_seq_socket_start,
- .next = atalk_seq_socket_next,
- .stop = atalk_seq_socket_stop,
- .show = atalk_seq_socket_show,
-};
-
-static int atalk_seq_interface_open(struct inode *inode, struct file *file)
-{
- return seq_open(file, &atalk_seq_interface_ops);
-}
-
-static int atalk_seq_route_open(struct inode *inode, struct file *file)
-{
- return seq_open(file, &atalk_seq_route_ops);
-}
-
-static int atalk_seq_socket_open(struct inode *inode, struct file *file)
-{
- return seq_open(file, &atalk_seq_socket_ops);
-}
-
-static const struct file_operations atalk_seq_interface_fops = {
- .owner = THIS_MODULE,
- .open = atalk_seq_interface_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
-};
-
-static const struct file_operations atalk_seq_route_fops = {
- .owner = THIS_MODULE,
- .open = atalk_seq_route_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
-};
-
-static const struct file_operations atalk_seq_socket_fops = {
- .owner = THIS_MODULE,
- .open = atalk_seq_socket_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
-};
-
-static struct proc_dir_entry *atalk_proc_dir;
-
-int __init atalk_proc_init(void)
-{
- struct proc_dir_entry *p;
- int rc = -ENOMEM;
-
- atalk_proc_dir = proc_mkdir("atalk", init_net.proc_net);
- if (!atalk_proc_dir)
- goto out;
-
- p = proc_create("interface", S_IRUGO, atalk_proc_dir,
- &atalk_seq_interface_fops);
- if (!p)
- goto out_interface;
-
- p = proc_create("route", S_IRUGO, atalk_proc_dir,
- &atalk_seq_route_fops);
- if (!p)
- goto out_route;
-
- p = proc_create("socket", S_IRUGO, atalk_proc_dir,
- &atalk_seq_socket_fops);
- if (!p)
- goto out_socket;
-
- p = proc_create("arp", S_IRUGO, atalk_proc_dir, &atalk_seq_arp_fops);
- if (!p)
- goto out_arp;
-
- rc = 0;
-out:
- return rc;
-out_arp:
- remove_proc_entry("socket", atalk_proc_dir);
-out_socket:
- remove_proc_entry("route", atalk_proc_dir);
-out_route:
- remove_proc_entry("interface", atalk_proc_dir);
-out_interface:
- remove_proc_entry("atalk", init_net.proc_net);
- goto out;
-}
-
-void __exit atalk_proc_exit(void)
-{
- remove_proc_entry("interface", atalk_proc_dir);
- remove_proc_entry("route", atalk_proc_dir);
- remove_proc_entry("socket", atalk_proc_dir);
- remove_proc_entry("arp", atalk_proc_dir);
- remove_proc_entry("atalk", init_net.proc_net);
-}
diff --git a/drivers/staging/appletalk/ddp.c b/drivers/staging/appletalk/ddp.c
deleted file mode 100644
index 940dd1908339..000000000000
--- a/drivers/staging/appletalk/ddp.c
+++ /dev/null
@@ -1,1981 +0,0 @@
-/*
- * DDP: An implementation of the AppleTalk DDP protocol for
- * Ethernet 'ELAP'.
- *
- * Alan Cox <alan@lxorguk.ukuu.org.uk>
- *
- * With more than a little assistance from
- *
- * Wesley Craig <netatalk@umich.edu>
- *
- * Fixes:
- * Neil Horman : Added missing device ioctls
- * Michael Callahan : Made routing work
- * Wesley Craig : Fix probing to listen to a
- * passed node id.
- * Alan Cox : Added send/recvmsg support
- * Alan Cox : Moved at. to protinfo in
- * socket.
- * Alan Cox : Added firewall hooks.
- * Alan Cox : Supports new ARPHRD_LOOPBACK
- * Christer Weinigel : Routing and /proc fixes.
- * Bradford Johnson : LocalTalk.
- * Tom Dyas : Module support.
- * Alan Cox : Hooks for PPP (based on the
- * LocalTalk hook).
- * Alan Cox : Posix bits
- * Alan Cox/Mike Freeman : Possible fix to NBP problems
- * Bradford Johnson : IP-over-DDP (experimental)
- * Jay Schulist : Moved IP-over-DDP to its own
- * driver file. (ipddp.c & ipddp.h)
- * Jay Schulist : Made work as module with
- * AppleTalk drivers, cleaned it.
- * Rob Newberry : Added proxy AARP and AARP
- * procfs, moved probing to AARP
- * module.
- * Adrian Sun/
- * Michael Zuelsdorff : fix for net.0 packets. don't
- * allow illegal ether/tokentalk
- * port assignment. we lose a
- * valid localtalk port as a
- * result.
- * Arnaldo C. de Melo : Cleanup, in preparation for
- * shared skb support 8)
- * Arnaldo C. de Melo : Move proc stuff to atalk_proc.c,
- * use seq_file
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- */
-
-#include <linux/capability.h>
-#include <linux/module.h>
-#include <linux/if_arp.h>
-#include <linux/smp_lock.h>
-#include <linux/termios.h> /* For TIOCOUTQ/INQ */
-#include <linux/compat.h>
-#include <linux/slab.h>
-#include <net/datalink.h>
-#include <net/psnap.h>
-#include <net/sock.h>
-#include <net/tcp_states.h>
-#include <net/route.h>
-#include "atalk.h"
-#include "../../net/core/kmap_skb.h"
-
-struct datalink_proto *ddp_dl, *aarp_dl;
-static const struct proto_ops atalk_dgram_ops;
-
-/**************************************************************************\
-* *
-* Handlers for the socket list. *
-* *
-\**************************************************************************/
-
-HLIST_HEAD(atalk_sockets);
-DEFINE_RWLOCK(atalk_sockets_lock);
-
-static inline void __atalk_insert_socket(struct sock *sk)
-{
- sk_add_node(sk, &atalk_sockets);
-}
-
-static inline void atalk_remove_socket(struct sock *sk)
-{
- write_lock_bh(&atalk_sockets_lock);
- sk_del_node_init(sk);
- write_unlock_bh(&atalk_sockets_lock);
-}
-
-static struct sock *atalk_search_socket(struct sockaddr_at *to,
- struct atalk_iface *atif)
-{
- struct sock *s;
- struct hlist_node *node;
-
- read_lock_bh(&atalk_sockets_lock);
- sk_for_each(s, node, &atalk_sockets) {
- struct atalk_sock *at = at_sk(s);
-
- if (to->sat_port != at->src_port)
- continue;
-
- if (to->sat_addr.s_net == ATADDR_ANYNET &&
- to->sat_addr.s_node == ATADDR_BCAST)
- goto found;
-
- if (to->sat_addr.s_net == at->src_net &&
- (to->sat_addr.s_node == at->src_node ||
- to->sat_addr.s_node == ATADDR_BCAST ||
- to->sat_addr.s_node == ATADDR_ANYNODE))
- goto found;
-
- /* XXXX.0 -- we got a request for this router. make sure
- * that the node is appropriately set. */
- if (to->sat_addr.s_node == ATADDR_ANYNODE &&
- to->sat_addr.s_net != ATADDR_ANYNET &&
- atif->address.s_node == at->src_node) {
- to->sat_addr.s_node = atif->address.s_node;
- goto found;
- }
- }
- s = NULL;
-found:
- read_unlock_bh(&atalk_sockets_lock);
- return s;
-}
-
-/**
- * atalk_find_or_insert_socket - Try to find a socket matching ADDR
- * @sk - socket to insert in the list if it is not there already
- * @sat - address to search for
- *
- * Try to find a socket matching ADDR in the socket list, if found then return
- * it. If not, insert SK into the socket list.
- *
- * This entire operation must execute atomically.
- */
-static struct sock *atalk_find_or_insert_socket(struct sock *sk,
- struct sockaddr_at *sat)
-{
- struct sock *s;
- struct hlist_node *node;
- struct atalk_sock *at;
-
- write_lock_bh(&atalk_sockets_lock);
- sk_for_each(s, node, &atalk_sockets) {
- at = at_sk(s);
-
- if (at->src_net == sat->sat_addr.s_net &&
- at->src_node == sat->sat_addr.s_node &&
- at->src_port == sat->sat_port)
- goto found;
- }
- s = NULL;
- __atalk_insert_socket(sk); /* Wheee, it's free, assign and insert. */
-found:
- write_unlock_bh(&atalk_sockets_lock);
- return s;
-}
-
-static void atalk_destroy_timer(unsigned long data)
-{
- struct sock *sk = (struct sock *)data;
-
- if (sk_has_allocations(sk)) {
- sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME;
- add_timer(&sk->sk_timer);
- } else
- sock_put(sk);
-}
-
-static inline void atalk_destroy_socket(struct sock *sk)
-{
- atalk_remove_socket(sk);
- skb_queue_purge(&sk->sk_receive_queue);
-
- if (sk_has_allocations(sk)) {
- setup_timer(&sk->sk_timer, atalk_destroy_timer,
- (unsigned long)sk);
- sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME;
- add_timer(&sk->sk_timer);
- } else
- sock_put(sk);
-}
-
-/**************************************************************************\
-* *
-* Routing tables for the AppleTalk socket layer. *
-* *
-\**************************************************************************/
-
-/* Anti-deadlock ordering is atalk_routes_lock --> iface_lock -DaveM */
-struct atalk_route *atalk_routes;
-DEFINE_RWLOCK(atalk_routes_lock);
-
-struct atalk_iface *atalk_interfaces;
-DEFINE_RWLOCK(atalk_interfaces_lock);
-
-/* For probing devices or in a routerless network */
-struct atalk_route atrtr_default;
-
-/* AppleTalk interface control */
-/*
- * Drop a device. Doesn't drop any of its routes - that is the caller's
- * problem. Called when we down the interface or delete the address.
- */
-static void atif_drop_device(struct net_device *dev)
-{
- struct atalk_iface **iface = &atalk_interfaces;
- struct atalk_iface *tmp;
-
- write_lock_bh(&atalk_interfaces_lock);
- while ((tmp = *iface) != NULL) {
- if (tmp->dev == dev) {
- *iface = tmp->next;
- dev_put(dev);
- kfree(tmp);
- dev->atalk_ptr = NULL;
- } else
- iface = &tmp->next;
- }
- write_unlock_bh(&atalk_interfaces_lock);
-}
-
-static struct atalk_iface *atif_add_device(struct net_device *dev,
- struct atalk_addr *sa)
-{
- struct atalk_iface *iface = kzalloc(sizeof(*iface), GFP_KERNEL);
-
- if (!iface)
- goto out;
-
- dev_hold(dev);
- iface->dev = dev;
- dev->atalk_ptr = iface;
- iface->address = *sa;
- iface->status = 0;
-
- write_lock_bh(&atalk_interfaces_lock);
- iface->next = atalk_interfaces;
- atalk_interfaces = iface;
- write_unlock_bh(&atalk_interfaces_lock);
-out:
- return iface;
-}
-
-/* Perform phase 2 AARP probing on our tentative address */
-static int atif_probe_device(struct atalk_iface *atif)
-{
- int netrange = ntohs(atif->nets.nr_lastnet) -
- ntohs(atif->nets.nr_firstnet) + 1;
- int probe_net = ntohs(atif->address.s_net);
- int probe_node = atif->address.s_node;
- int netct, nodect;
-
- /* Offset the network we start probing with */
- if (probe_net == ATADDR_ANYNET) {
- probe_net = ntohs(atif->nets.nr_firstnet);
- if (netrange)
- probe_net += jiffies % netrange;
- }
- if (probe_node == ATADDR_ANYNODE)
- probe_node = jiffies & 0xFF;
-
- /* Scan the networks */
- atif->status |= ATIF_PROBE;
- for (netct = 0; netct <= netrange; netct++) {
- /* Sweep the available nodes from a given start */
- atif->address.s_net = htons(probe_net);
- for (nodect = 0; nodect < 256; nodect++) {
- atif->address.s_node = (nodect + probe_node) & 0xFF;
- if (atif->address.s_node > 0 &&
- atif->address.s_node < 254) {
- /* Probe a proposed address */
- aarp_probe_network(atif);
-
- if (!(atif->status & ATIF_PROBE_FAIL)) {
- atif->status &= ~ATIF_PROBE;
- return 0;
- }
- }
- atif->status &= ~ATIF_PROBE_FAIL;
- }
- probe_net++;
- if (probe_net > ntohs(atif->nets.nr_lastnet))
- probe_net = ntohs(atif->nets.nr_firstnet);
- }
- atif->status &= ~ATIF_PROBE;
-
- return -EADDRINUSE; /* Network is full... */
-}
-
-
-/* Perform AARP probing for a proxy address */
-static int atif_proxy_probe_device(struct atalk_iface *atif,
- struct atalk_addr* proxy_addr)
-{
- int netrange = ntohs(atif->nets.nr_lastnet) -
- ntohs(atif->nets.nr_firstnet) + 1;
- /* we probe the interface's network */
- int probe_net = ntohs(atif->address.s_net);
- int probe_node = ATADDR_ANYNODE; /* we'll take anything */
- int netct, nodect;
-
- /* Offset the network we start probing with */
- if (probe_net == ATADDR_ANYNET) {
- probe_net = ntohs(atif->nets.nr_firstnet);
- if (netrange)
- probe_net += jiffies % netrange;
- }
-
- if (probe_node == ATADDR_ANYNODE)
- probe_node = jiffies & 0xFF;
-
- /* Scan the networks */
- for (netct = 0; netct <= netrange; netct++) {
- /* Sweep the available nodes from a given start */
- proxy_addr->s_net = htons(probe_net);
- for (nodect = 0; nodect < 256; nodect++) {
- proxy_addr->s_node = (nodect + probe_node) & 0xFF;
- if (proxy_addr->s_node > 0 &&
- proxy_addr->s_node < 254) {
- /* Tell AARP to probe a proposed address */
- int ret = aarp_proxy_probe_network(atif,
- proxy_addr);
-
- if (ret != -EADDRINUSE)
- return ret;
- }
- }
- probe_net++;
- if (probe_net > ntohs(atif->nets.nr_lastnet))
- probe_net = ntohs(atif->nets.nr_firstnet);
- }
-
- return -EADDRINUSE; /* Network is full... */
-}
-
-
-struct atalk_addr *atalk_find_dev_addr(struct net_device *dev)
-{
- struct atalk_iface *iface = dev->atalk_ptr;
- return iface ? &iface->address : NULL;
-}
-
-static struct atalk_addr *atalk_find_primary(void)
-{
- struct atalk_iface *fiface = NULL;
- struct atalk_addr *retval;
- struct atalk_iface *iface;
-
- /*
- * Return a point-to-point interface only if
- * there is no non-ptp interface available.
- */
- read_lock_bh(&atalk_interfaces_lock);
- for (iface = atalk_interfaces; iface; iface = iface->next) {
- if (!fiface && !(iface->dev->flags & IFF_LOOPBACK))
- fiface = iface;
- if (!(iface->dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) {
- retval = &iface->address;
- goto out;
- }
- }
-
- if (fiface)
- retval = &fiface->address;
- else if (atalk_interfaces)
- retval = &atalk_interfaces->address;
- else
- retval = NULL;
-out:
- read_unlock_bh(&atalk_interfaces_lock);
- return retval;
-}
-
-/*
- * Find a match for 'any network' - ie any of our interfaces with that
- * node number will do just nicely.
- */
-static struct atalk_iface *atalk_find_anynet(int node, struct net_device *dev)
-{
- struct atalk_iface *iface = dev->atalk_ptr;
-
- if (!iface || iface->status & ATIF_PROBE)
- goto out_err;
-
- if (node != ATADDR_BCAST &&
- iface->address.s_node != node &&
- node != ATADDR_ANYNODE)
- goto out_err;
-out:
- return iface;
-out_err:
- iface = NULL;
- goto out;
-}
-
-/* Find a match for a specific network:node pair */
-static struct atalk_iface *atalk_find_interface(__be16 net, int node)
-{
- struct atalk_iface *iface;
-
- read_lock_bh(&atalk_interfaces_lock);
- for (iface = atalk_interfaces; iface; iface = iface->next) {
- if ((node == ATADDR_BCAST ||
- node == ATADDR_ANYNODE ||
- iface->address.s_node == node) &&
- iface->address.s_net == net &&
- !(iface->status & ATIF_PROBE))
- break;
-
- /* XXXX.0 -- net.0 returns the iface associated with net */
- if (node == ATADDR_ANYNODE && net != ATADDR_ANYNET &&
- ntohs(iface->nets.nr_firstnet) <= ntohs(net) &&
- ntohs(net) <= ntohs(iface->nets.nr_lastnet))
- break;
- }
- read_unlock_bh(&atalk_interfaces_lock);
- return iface;
-}
-
-
-/*
- * Find a route for an AppleTalk packet. This ought to get cached in
- * the socket (later on...). We know about host routes and the fact
- * that a route must be direct to broadcast.
- */
-static struct atalk_route *atrtr_find(struct atalk_addr *target)
-{
- /*
- * we must search through all routes unless we find a
- * host route, because some host routes might overlap
- * network routes
- */
- struct atalk_route *net_route = NULL;
- struct atalk_route *r;
-
- read_lock_bh(&atalk_routes_lock);
- for (r = atalk_routes; r; r = r->next) {
- if (!(r->flags & RTF_UP))
- continue;
-
- if (r->target.s_net == target->s_net) {
- if (r->flags & RTF_HOST) {
- /*
- * if this host route is for the target,
- * the we're done
- */
- if (r->target.s_node == target->s_node)
- goto out;
- } else
- /*
- * this route will work if there isn't a
- * direct host route, so cache it
- */
- net_route = r;
- }
- }
-
- /*
- * if we found a network route but not a direct host
- * route, then return it
- */
- if (net_route)
- r = net_route;
- else if (atrtr_default.dev)
- r = &atrtr_default;
- else /* No route can be found */
- r = NULL;
-out:
- read_unlock_bh(&atalk_routes_lock);
- return r;
-}
-
-
-/*
- * Given an AppleTalk network, find the device to use. This can be
- * a simple lookup.
- */
-struct net_device *atrtr_get_dev(struct atalk_addr *sa)
-{
- struct atalk_route *atr = atrtr_find(sa);
- return atr ? atr->dev : NULL;
-}
-
-/* Set up a default router */
-static void atrtr_set_default(struct net_device *dev)
-{
- atrtr_default.dev = dev;
- atrtr_default.flags = RTF_UP;
- atrtr_default.gateway.s_net = htons(0);
- atrtr_default.gateway.s_node = 0;
-}
-
-/*
- * Add a router. Basically make sure it looks valid and stuff the
- * entry in the list. While it uses netranges we always set them to one
- * entry to work like netatalk.
- */
-static int atrtr_create(struct rtentry *r, struct net_device *devhint)
-{
- struct sockaddr_at *ta = (struct sockaddr_at *)&r->rt_dst;
- struct sockaddr_at *ga = (struct sockaddr_at *)&r->rt_gateway;
- struct atalk_route *rt;
- struct atalk_iface *iface, *riface;
- int retval = -EINVAL;
-
- /*
- * Fixme: Raise/Lower a routing change semaphore for these
- * operations.
- */
-
- /* Validate the request */
- if (ta->sat_family != AF_APPLETALK ||
- (!devhint && ga->sat_family != AF_APPLETALK))
- goto out;
-
- /* Now walk the routing table and make our decisions */
- write_lock_bh(&atalk_routes_lock);
- for (rt = atalk_routes; rt; rt = rt->next) {
- if (r->rt_flags != rt->flags)
- continue;
-
- if (ta->sat_addr.s_net == rt->target.s_net) {
- if (!(rt->flags & RTF_HOST))
- break;
- if (ta->sat_addr.s_node == rt->target.s_node)
- break;
- }
- }
-
- if (!devhint) {
- riface = NULL;
-
- read_lock_bh(&atalk_interfaces_lock);
- for (iface = atalk_interfaces; iface; iface = iface->next) {
- if (!riface &&
- ntohs(ga->sat_addr.s_net) >=
- ntohs(iface->nets.nr_firstnet) &&
- ntohs(ga->sat_addr.s_net) <=
- ntohs(iface->nets.nr_lastnet))
- riface = iface;
-
- if (ga->sat_addr.s_net == iface->address.s_net &&
- ga->sat_addr.s_node == iface->address.s_node)
- riface = iface;
- }
- read_unlock_bh(&atalk_interfaces_lock);
-
- retval = -ENETUNREACH;
- if (!riface)
- goto out_unlock;
-
- devhint = riface->dev;
- }
-
- if (!rt) {
- rt = kzalloc(sizeof(*rt), GFP_ATOMIC);
-
- retval = -ENOBUFS;
- if (!rt)
- goto out_unlock;
-
- rt->next = atalk_routes;
- atalk_routes = rt;
- }
-
- /* Fill in the routing entry */
- rt->target = ta->sat_addr;
- dev_hold(devhint);
- rt->dev = devhint;
- rt->flags = r->rt_flags;
- rt->gateway = ga->sat_addr;
-
- retval = 0;
-out_unlock:
- write_unlock_bh(&atalk_routes_lock);
-out:
- return retval;
-}
-
-/* Delete a route. Find it and discard it */
-static int atrtr_delete(struct atalk_addr * addr)
-{
- struct atalk_route **r = &atalk_routes;
- int retval = 0;
- struct atalk_route *tmp;
-
- write_lock_bh(&atalk_routes_lock);
- while ((tmp = *r) != NULL) {
- if (tmp->target.s_net == addr->s_net &&
- (!(tmp->flags&RTF_GATEWAY) ||
- tmp->target.s_node == addr->s_node)) {
- *r = tmp->next;
- dev_put(tmp->dev);
- kfree(tmp);
- goto out;
- }
- r = &tmp->next;
- }
- retval = -ENOENT;
-out:
- write_unlock_bh(&atalk_routes_lock);
- return retval;
-}
-
-/*
- * Called when a device is downed. Just throw away any routes
- * via it.
- */
-static void atrtr_device_down(struct net_device *dev)
-{
- struct atalk_route **r = &atalk_routes;
- struct atalk_route *tmp;
-
- write_lock_bh(&atalk_routes_lock);
- while ((tmp = *r) != NULL) {
- if (tmp->dev == dev) {
- *r = tmp->next;
- dev_put(dev);
- kfree(tmp);
- } else
- r = &tmp->next;
- }
- write_unlock_bh(&atalk_routes_lock);
-
- if (atrtr_default.dev == dev)
- atrtr_set_default(NULL);
-}
-
-/* Actually down the interface */
-static inline void atalk_dev_down(struct net_device *dev)
-{
- atrtr_device_down(dev); /* Remove all routes for the device */
- aarp_device_down(dev); /* Remove AARP entries for the device */
- atif_drop_device(dev); /* Remove the device */
-}
-
-/*
- * A device event has occurred. Watch for devices going down and
- * delete our use of them (iface and route).
- */
-static int ddp_device_event(struct notifier_block *this, unsigned long event,
- void *ptr)
-{
- struct net_device *dev = ptr;
-
- if (!net_eq(dev_net(dev), &init_net))
- return NOTIFY_DONE;
-
- if (event == NETDEV_DOWN)
- /* Discard any use of this */
- atalk_dev_down(dev);
-
- return NOTIFY_DONE;
-}
-
-/* ioctl calls. Shouldn't even need touching */
-/* Device configuration ioctl calls */
-static int atif_ioctl(int cmd, void __user *arg)
-{
- static char aarp_mcast[6] = { 0x09, 0x00, 0x00, 0xFF, 0xFF, 0xFF };
- struct ifreq atreq;
- struct atalk_netrange *nr;
- struct sockaddr_at *sa;
- struct net_device *dev;
- struct atalk_iface *atif;
- int ct;
- int limit;
- struct rtentry rtdef;
- int add_route;
-
- if (copy_from_user(&atreq, arg, sizeof(atreq)))
- return -EFAULT;
-
- dev = __dev_get_by_name(&init_net, atreq.ifr_name);
- if (!dev)
- return -ENODEV;
-
- sa = (struct sockaddr_at *)&atreq.ifr_addr;
- atif = atalk_find_dev(dev);
-
- switch (cmd) {
- case SIOCSIFADDR:
- if (!capable(CAP_NET_ADMIN))
- return -EPERM;
- if (sa->sat_family != AF_APPLETALK)
- return -EINVAL;
- if (dev->type != ARPHRD_ETHER &&
- dev->type != ARPHRD_LOOPBACK &&
- dev->type != ARPHRD_LOCALTLK &&
- dev->type != ARPHRD_PPP)
- return -EPROTONOSUPPORT;
-
- nr = (struct atalk_netrange *)&sa->sat_zero[0];
- add_route = 1;
-
- /*
- * if this is a point-to-point iface, and we already
- * have an iface for this AppleTalk address, then we
- * should not add a route
- */
- if ((dev->flags & IFF_POINTOPOINT) &&
- atalk_find_interface(sa->sat_addr.s_net,
- sa->sat_addr.s_node)) {
- printk(KERN_DEBUG "AppleTalk: point-to-point "
- "interface added with "
- "existing address\n");
- add_route = 0;
- }
-
- /*
- * Phase 1 is fine on LocalTalk but we don't do
- * EtherTalk phase 1. Anyone wanting to add it go ahead.
- */
- if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
- return -EPROTONOSUPPORT;
- if (sa->sat_addr.s_node == ATADDR_BCAST ||
- sa->sat_addr.s_node == 254)
- return -EINVAL;
- if (atif) {
- /* Already setting address */
- if (atif->status & ATIF_PROBE)
- return -EBUSY;
-
- atif->address.s_net = sa->sat_addr.s_net;
- atif->address.s_node = sa->sat_addr.s_node;
- atrtr_device_down(dev); /* Flush old routes */
- } else {
- atif = atif_add_device(dev, &sa->sat_addr);
- if (!atif)
- return -ENOMEM;
- }
- atif->nets = *nr;
-
- /*
- * Check if the chosen address is used. If so we
- * error and atalkd will try another.
- */
-
- if (!(dev->flags & IFF_LOOPBACK) &&
- !(dev->flags & IFF_POINTOPOINT) &&
- atif_probe_device(atif) < 0) {
- atif_drop_device(dev);
- return -EADDRINUSE;
- }
-
- /* Hey it worked - add the direct routes */
- sa = (struct sockaddr_at *)&rtdef.rt_gateway;
- sa->sat_family = AF_APPLETALK;
- sa->sat_addr.s_net = atif->address.s_net;
- sa->sat_addr.s_node = atif->address.s_node;
- sa = (struct sockaddr_at *)&rtdef.rt_dst;
- rtdef.rt_flags = RTF_UP;
- sa->sat_family = AF_APPLETALK;
- sa->sat_addr.s_node = ATADDR_ANYNODE;
- if (dev->flags & IFF_LOOPBACK ||
- dev->flags & IFF_POINTOPOINT)
- rtdef.rt_flags |= RTF_HOST;
-
- /* Routerless initial state */
- if (nr->nr_firstnet == htons(0) &&
- nr->nr_lastnet == htons(0xFFFE)) {
- sa->sat_addr.s_net = atif->address.s_net;
- atrtr_create(&rtdef, dev);
- atrtr_set_default(dev);
- } else {
- limit = ntohs(nr->nr_lastnet);
- if (limit - ntohs(nr->nr_firstnet) > 4096) {
- printk(KERN_WARNING "Too many routes/"
- "iface.\n");
- return -EINVAL;
- }
- if (add_route)
- for (ct = ntohs(nr->nr_firstnet);
- ct <= limit; ct++) {
- sa->sat_addr.s_net = htons(ct);
- atrtr_create(&rtdef, dev);
- }
- }
- dev_mc_add_global(dev, aarp_mcast);
- return 0;
-
- case SIOCGIFADDR:
- if (!atif)
- return -EADDRNOTAVAIL;
-
- sa->sat_family = AF_APPLETALK;
- sa->sat_addr = atif->address;
- break;
-
- case SIOCGIFBRDADDR:
- if (!atif)
- return -EADDRNOTAVAIL;
-
- sa->sat_family = AF_APPLETALK;
- sa->sat_addr.s_net = atif->address.s_net;
- sa->sat_addr.s_node = ATADDR_BCAST;
- break;
-
- case SIOCATALKDIFADDR:
- case SIOCDIFADDR:
- if (!capable(CAP_NET_ADMIN))
- return -EPERM;
- if (sa->sat_family != AF_APPLETALK)
- return -EINVAL;
- atalk_dev_down(dev);
- break;
-
- case SIOCSARP:
- if (!capable(CAP_NET_ADMIN))
- return -EPERM;
- if (sa->sat_family != AF_APPLETALK)
- return -EINVAL;
- /*
- * for now, we only support proxy AARP on ELAP;
- * we should be able to do it for LocalTalk, too.
- */
- if (dev->type != ARPHRD_ETHER)
- return -EPROTONOSUPPORT;
-
- /*
- * atif points to the current interface on this network;
- * we aren't concerned about its current status (at
- * least for now), but it has all the settings about
- * the network we're going to probe. Consequently, it
- * must exist.
- */
- if (!atif)
- return -EADDRNOTAVAIL;
-
- nr = (struct atalk_netrange *)&(atif->nets);
- /*
- * Phase 1 is fine on Localtalk but we don't do
- * Ethertalk phase 1. Anyone wanting to add it go ahead.
- */
- if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
- return -EPROTONOSUPPORT;
-
- if (sa->sat_addr.s_node == ATADDR_BCAST ||
- sa->sat_addr.s_node == 254)
- return -EINVAL;
-
- /*
- * Check if the chosen address is used. If so we
- * error and ATCP will try another.
- */
- if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0)
- return -EADDRINUSE;
-
- /*
- * We now have an address on the local network, and
- * the AARP code will defend it for us until we take it
- * down. We don't set up any routes right now, because
- * ATCP will install them manually via SIOCADDRT.
- */
- break;
-
- case SIOCDARP:
- if (!capable(CAP_NET_ADMIN))
- return -EPERM;
- if (sa->sat_family != AF_APPLETALK)
- return -EINVAL;
- if (!atif)
- return -EADDRNOTAVAIL;
-
- /* give to aarp module to remove proxy entry */
- aarp_proxy_remove(atif->dev, &(sa->sat_addr));
- return 0;
- }
-
- return copy_to_user(arg, &atreq, sizeof(atreq)) ? -EFAULT : 0;
-}
-
-/* Routing ioctl() calls */
-static int atrtr_ioctl(unsigned int cmd, void __user *arg)
-{
- struct rtentry rt;
-
- if (copy_from_user(&rt, arg, sizeof(rt)))
- return -EFAULT;
-
- switch (cmd) {
- case SIOCDELRT:
- if (rt.rt_dst.sa_family != AF_APPLETALK)
- return -EINVAL;
- return atrtr_delete(&((struct sockaddr_at *)
- &rt.rt_dst)->sat_addr);
-
- case SIOCADDRT: {
- struct net_device *dev = NULL;
- if (rt.rt_dev) {
- char name[IFNAMSIZ];
- if (copy_from_user(name, rt.rt_dev, IFNAMSIZ-1))
- return -EFAULT;
- name[IFNAMSIZ-1] = '\0';
- dev = __dev_get_by_name(&init_net, name);
- if (!dev)
- return -ENODEV;
- }
- return atrtr_create(&rt, dev);
- }
- }
- return -EINVAL;
-}
-
-/**************************************************************************\
-* *
-* Handling for system calls applied via the various interfaces to an *
-* AppleTalk socket object. *
-* *
-\**************************************************************************/
-
-/*
- * Checksum: This is 'optional'. It's quite likely also a good
- * candidate for assembler hackery 8)
- */
-static unsigned long atalk_sum_partial(const unsigned char *data,
- int len, unsigned long sum)
-{
- /* This ought to be unwrapped neatly. I'll trust gcc for now */
- while (len--) {
- sum += *data++;
- sum = rol16(sum, 1);
- }
- return sum;
-}
-
-/* Checksum skb data -- similar to skb_checksum */
-static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
- int len, unsigned long sum)
-{
- int start = skb_headlen(skb);
- struct sk_buff *frag_iter;
- int i, copy;
-
- /* checksum stuff in header space */
- if ( (copy = start - offset) > 0) {
- if (copy > len)
- copy = len;
- sum = atalk_sum_partial(skb->data + offset, copy, sum);
- if ( (len -= copy) == 0)
- return sum;
-
- offset += copy;
- }
-
- /* checksum stuff in frags */
- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
- int end;
-
- WARN_ON(start > offset + len);
-
- end = start + skb_shinfo(skb)->frags[i].size;
- if ((copy = end - offset) > 0) {
- u8 *vaddr;
- skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
- if (copy > len)
- copy = len;
- vaddr = kmap_skb_frag(frag);
- sum = atalk_sum_partial(vaddr + frag->page_offset +
- offset - start, copy, sum);
- kunmap_skb_frag(vaddr);
-
- if (!(len -= copy))
- return sum;
- offset += copy;
- }
- start = end;
- }
-
- skb_walk_frags(skb, frag_iter) {
- int end;
-
- WARN_ON(start > offset + len);
-
- end = start + frag_iter->len;
- if ((copy = end - offset) > 0) {
- if (copy > len)
- copy = len;
- sum = atalk_sum_skb(frag_iter, offset - start,
- copy, sum);
- if ((len -= copy) == 0)
- return sum;
- offset += copy;
- }
- start = end;
- }
-
- BUG_ON(len > 0);
-
- return sum;
-}
-
-static __be16 atalk_checksum(const struct sk_buff *skb, int len)
-{
- unsigned long sum;
-
- /* skip header 4 bytes */
- sum = atalk_sum_skb(skb, 4, len-4, 0);
-
- /* Use 0xFFFF for 0. 0 itself means none */
- return sum ? htons((unsigned short)sum) : htons(0xFFFF);
-}
-
-static struct proto ddp_proto = {
- .name = "DDP",
- .owner = THIS_MODULE,
- .obj_size = sizeof(struct atalk_sock),
-};
-
-/*
- * Create a socket. Initialise the socket, blank the addresses
- * set the state.
- */
-static int atalk_create(struct net *net, struct socket *sock, int protocol,
- int kern)
-{
- struct sock *sk;
- int rc = -ESOCKTNOSUPPORT;
-
- if (!net_eq(net, &init_net))
- return -EAFNOSUPPORT;
-
- /*
- * We permit SOCK_DGRAM and RAW is an extension. It is trivial to do
- * and gives you the full ELAP frame. Should be handy for CAP 8)
- */
- if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
- goto out;
- rc = -ENOMEM;
- sk = sk_alloc(net, PF_APPLETALK, GFP_KERNEL, &ddp_proto);
- if (!sk)
- goto out;
- rc = 0;
- sock->ops = &atalk_dgram_ops;
- sock_init_data(sock, sk);
-
- /* Checksums on by default */
- sock_set_flag(sk, SOCK_ZAPPED);
-out:
- return rc;
-}
-
-/* Free a socket. No work needed */
-static int atalk_release(struct socket *sock)
-{
- struct sock *sk = sock->sk;
-
- lock_kernel();
- if (sk) {
- sock_orphan(sk);
- sock->sk = NULL;
- atalk_destroy_socket(sk);
- }
- unlock_kernel();
- return 0;
-}
-
-/**
- * atalk_pick_and_bind_port - Pick a source port when one is not given
- * @sk - socket to insert into the tables
- * @sat - address to search for
- *
- * Pick a source port when one is not given. If we can find a suitable free
- * one, we insert the socket into the tables using it.
- *
- * This whole operation must be atomic.
- */
-static int atalk_pick_and_bind_port(struct sock *sk, struct sockaddr_at *sat)
-{
- int retval;
-
- write_lock_bh(&atalk_sockets_lock);
-
- for (sat->sat_port = ATPORT_RESERVED;
- sat->sat_port < ATPORT_LAST;
- sat->sat_port++) {
- struct sock *s;
- struct hlist_node *node;
-
- sk_for_each(s, node, &atalk_sockets) {
- struct atalk_sock *at = at_sk(s);
-
- if (at->src_net == sat->sat_addr.s_net &&
- at->src_node == sat->sat_addr.s_node &&
- at->src_port == sat->sat_port)
- goto try_next_port;
- }
-
- /* Wheee, it's free, assign and insert. */
- __atalk_insert_socket(sk);
- at_sk(sk)->src_port = sat->sat_port;
- retval = 0;
- goto out;
-
-try_next_port:;
- }
-
- retval = -EBUSY;
-out:
- write_unlock_bh(&atalk_sockets_lock);
- return retval;
-}
-
-static int atalk_autobind(struct sock *sk)
-{
- struct atalk_sock *at = at_sk(sk);
- struct sockaddr_at sat;
- struct atalk_addr *ap = atalk_find_primary();
- int n = -EADDRNOTAVAIL;
-
- if (!ap || ap->s_net == htons(ATADDR_ANYNET))
- goto out;
-
- at->src_net = sat.sat_addr.s_net = ap->s_net;
- at->src_node = sat.sat_addr.s_node = ap->s_node;
-
- n = atalk_pick_and_bind_port(sk, &sat);
- if (!n)
- sock_reset_flag(sk, SOCK_ZAPPED);
-out:
- return n;
-}
-
-/* Set the address 'our end' of the connection */
-static int atalk_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
-{
- struct sockaddr_at *addr = (struct sockaddr_at *)uaddr;
- struct sock *sk = sock->sk;
- struct atalk_sock *at = at_sk(sk);
- int err;
-
- if (!sock_flag(sk, SOCK_ZAPPED) ||
- addr_len != sizeof(struct sockaddr_at))
- return -EINVAL;
-
- if (addr->sat_family != AF_APPLETALK)
- return -EAFNOSUPPORT;
-
- lock_kernel();
- if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) {
- struct atalk_addr *ap = atalk_find_primary();
-
- err = -EADDRNOTAVAIL;
- if (!ap)
- goto out;
-
- at->src_net = addr->sat_addr.s_net = ap->s_net;
- at->src_node = addr->sat_addr.s_node= ap->s_node;
- } else {
- err = -EADDRNOTAVAIL;
- if (!atalk_find_interface(addr->sat_addr.s_net,
- addr->sat_addr.s_node))
- goto out;
-
- at->src_net = addr->sat_addr.s_net;
- at->src_node = addr->sat_addr.s_node;
- }
-
- if (addr->sat_port == ATADDR_ANYPORT) {
- err = atalk_pick_and_bind_port(sk, addr);
-
- if (err < 0)
- goto out;
- } else {
- at->src_port = addr->sat_port;
-
- err = -EADDRINUSE;
- if (atalk_find_or_insert_socket(sk, addr))
- goto out;
- }
-
- sock_reset_flag(sk, SOCK_ZAPPED);
- err = 0;
-out:
- unlock_kernel();
- return err;
-}
-
-/* Set the address we talk to */
-static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
- int addr_len, int flags)
-{
- struct sock *sk = sock->sk;
- struct atalk_sock *at = at_sk(sk);
- struct sockaddr_at *addr;
- int err;
-
- sk->sk_state = TCP_CLOSE;
- sock->state = SS_UNCONNECTED;
-
- if (addr_len != sizeof(*addr))
- return -EINVAL;
-
- addr = (struct sockaddr_at *)uaddr;
-
- if (addr->sat_family != AF_APPLETALK)
- return -EAFNOSUPPORT;
-
- if (addr->sat_addr.s_node == ATADDR_BCAST &&
- !sock_flag(sk, SOCK_BROADCAST)) {
-#if 1
- printk(KERN_WARNING "%s is broken and did not set "
- "SO_BROADCAST. It will break when 2.2 is "
- "released.\n",
- current->comm);
-#else
- return -EACCES;
-#endif
- }
-
- lock_kernel();
- err = -EBUSY;
- if (sock_flag(sk, SOCK_ZAPPED))
- if (atalk_autobind(sk) < 0)
- goto out;
-
- err = -ENETUNREACH;
- if (!atrtr_get_dev(&addr->sat_addr))
- goto out;
-
- at->dest_port = addr->sat_port;
- at->dest_net = addr->sat_addr.s_net;
- at->dest_node = addr->sat_addr.s_node;
-
- sock->state = SS_CONNECTED;
- sk->sk_state = TCP_ESTABLISHED;
- err = 0;
-out:
- unlock_kernel();
- return err;
-}
-
-/*
- * Find the name of an AppleTalk socket. Just copy the right
- * fields into the sockaddr.
- */
-static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
- int *uaddr_len, int peer)
-{
- struct sockaddr_at sat;
- struct sock *sk = sock->sk;
- struct atalk_sock *at = at_sk(sk);
- int err;
-
- lock_kernel();
- err = -ENOBUFS;
- if (sock_flag(sk, SOCK_ZAPPED))
- if (atalk_autobind(sk) < 0)
- goto out;
-
- *uaddr_len = sizeof(struct sockaddr_at);
- memset(&sat.sat_zero, 0, sizeof(sat.sat_zero));
-
- if (peer) {
- err = -ENOTCONN;
- if (sk->sk_state != TCP_ESTABLISHED)
- goto out;
-
- sat.sat_addr.s_net = at->dest_net;
- sat.sat_addr.s_node = at->dest_node;
- sat.sat_port = at->dest_port;
- } else {
- sat.sat_addr.s_net = at->src_net;
- sat.sat_addr.s_node = at->src_node;
- sat.sat_port = at->src_port;
- }
-
- err = 0;
- sat.sat_family = AF_APPLETALK;
- memcpy(uaddr, &sat, sizeof(sat));
-
-out:
- unlock_kernel();
- return err;
-}
-
-static unsigned int atalk_poll(struct file *file, struct socket *sock,
- poll_table *wait)
-{
- int err;
- lock_kernel();
- err = datagram_poll(file, sock, wait);
- unlock_kernel();
- return err;
-}
-
-#if defined(CONFIG_IPDDP) || defined(CONFIG_IPDDP_MODULE)
-static __inline__ int is_ip_over_ddp(struct sk_buff *skb)
-{
- return skb->data[12] == 22;
-}
-
-static int handle_ip_over_ddp(struct sk_buff *skb)
-{
- struct net_device *dev = __dev_get_by_name(&init_net, "ipddp0");
- struct net_device_stats *stats;
-
- /* This needs to be able to handle ipddp"N" devices */
- if (!dev) {
- kfree_skb(skb);
- return NET_RX_DROP;
- }
-
- skb->protocol = htons(ETH_P_IP);
- skb_pull(skb, 13);
- skb->dev = dev;
- skb_reset_transport_header(skb);
-
- stats = netdev_priv(dev);
- stats->rx_packets++;
- stats->rx_bytes += skb->len + 13;
- return netif_rx(skb); /* Send the SKB up to a higher place. */
-}
-#else
-/* make it easy for gcc to optimize this test out, i.e. kill the code */
-#define is_ip_over_ddp(skb) 0
-#define handle_ip_over_ddp(skb) 0
-#endif
-
-static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
- struct ddpehdr *ddp, __u16 len_hops, int origlen)
-{
- struct atalk_route *rt;
- struct atalk_addr ta;
-
- /*
- * Don't route multicast, etc., packets, or packets sent to "this
- * network"
- */
- if (skb->pkt_type != PACKET_HOST || !ddp->deh_dnet) {
- /*
- * FIXME:
- *
- * Can it ever happen that a packet is from a PPP iface and
- * needs to be broadcast onto the default network?
- */
- if (dev->type == ARPHRD_PPP)
- printk(KERN_DEBUG "AppleTalk: didn't forward broadcast "
- "packet received from PPP iface\n");
- goto free_it;
- }
-
- ta.s_net = ddp->deh_dnet;
- ta.s_node = ddp->deh_dnode;
-
- /* Route the packet */
- rt = atrtr_find(&ta);
- /* increment hops count */
- len_hops += 1 << 10;
- if (!rt || !(len_hops & (15 << 10)))
- goto free_it;
-
- /* FIXME: use skb->cb to be able to use shared skbs */
-
- /*
- * Route goes through another gateway, so set the target to the
- * gateway instead.
- */
-
- if (rt->flags & RTF_GATEWAY) {
- ta.s_net = rt->gateway.s_net;
- ta.s_node = rt->gateway.s_node;
- }
-
- /* Fix up skb->len field */
- skb_trim(skb, min_t(unsigned int, origlen,
- (rt->dev->hard_header_len +
- ddp_dl->header_length + (len_hops & 1023))));
-
- /* FIXME: use skb->cb to be able to use shared skbs */
- ddp->deh_len_hops = htons(len_hops);
-
- /*
- * Send the buffer onwards
- *
- * Now we must always be careful. If it's come from LocalTalk to
- * EtherTalk it might not fit
- *
- * Order matters here: If a packet has to be copied to make a new
- * headroom (rare hopefully) then it won't need unsharing.
- *
- * Note. ddp-> becomes invalid at the realloc.
- */
- if (skb_headroom(skb) < 22) {
- /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
- struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
- kfree_skb(skb);
- skb = nskb;
- } else
- skb = skb_unshare(skb, GFP_ATOMIC);
-
- /*
- * If the buffer didn't vanish into the lack of space bitbucket we can
- * send it.
- */
- if (skb == NULL)
- goto drop;
-
- if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP)
- return NET_RX_DROP;
- return NET_RX_SUCCESS;
-free_it:
- kfree_skb(skb);
-drop:
- return NET_RX_DROP;
-}
-
-/**
- * atalk_rcv - Receive a packet (in skb) from device dev
- * @skb - packet received
- * @dev - network device where the packet comes from
- * @pt - packet type
- *
- * Receive a packet (in skb) from device dev. This has come from the SNAP
- * decoder, and on entry skb->transport_header is the DDP header, skb->len
- * is the DDP header, skb->len is the DDP length. The physical headers
- * have been extracted. PPP should probably pass frames marked as for this
- * layer. [ie ARPHRD_ETHERTALK]
- */
-static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
- struct packet_type *pt, struct net_device *orig_dev)
-{
- struct ddpehdr *ddp;
- struct sock *sock;
- struct atalk_iface *atif;
- struct sockaddr_at tosat;
- int origlen;
- __u16 len_hops;
-
- if (!net_eq(dev_net(dev), &init_net))
- goto drop;
-
- /* Don't mangle buffer if shared */
- if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
- goto out;
-
- /* Size check and make sure header is contiguous */
- if (!pskb_may_pull(skb, sizeof(*ddp)))
- goto drop;
-
- ddp = ddp_hdr(skb);
-
- len_hops = ntohs(ddp->deh_len_hops);
-
- /* Trim buffer in case of stray trailing data */
- origlen = skb->len;
- skb_trim(skb, min_t(unsigned int, skb->len, len_hops & 1023));
-
- /*
- * Size check to see if ddp->deh_len was crap
- * (Otherwise we'll detonate most spectacularly
- * in the middle of atalk_checksum() or recvmsg()).
- */
- if (skb->len < sizeof(*ddp) || skb->len < (len_hops & 1023)) {
- pr_debug("AppleTalk: dropping corrupted frame (deh_len=%u, "
- "skb->len=%u)\n", len_hops & 1023, skb->len);
- goto drop;
- }
-
- /*
- * Any checksums. Note we don't do htons() on this == is assumed to be
- * valid for net byte orders all over the networking code...
- */
- if (ddp->deh_sum &&
- atalk_checksum(skb, len_hops & 1023) != ddp->deh_sum)
- /* Not a valid AppleTalk frame - dustbin time */
- goto drop;
-
- /* Check the packet is aimed at us */
- if (!ddp->deh_dnet) /* Net 0 is 'this network' */
- atif = atalk_find_anynet(ddp->deh_dnode, dev);
- else
- atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode);
-
- if (!atif) {
- /* Not ours, so we route the packet via the correct
- * AppleTalk iface
- */
- return atalk_route_packet(skb, dev, ddp, len_hops, origlen);
- }
-
- /* if IP over DDP is not selected this code will be optimized out */
- if (is_ip_over_ddp(skb))
- return handle_ip_over_ddp(skb);
- /*
- * Which socket - atalk_search_socket() looks for a *full match*
- * of the <net, node, port> tuple.
- */
- tosat.sat_addr.s_net = ddp->deh_dnet;
- tosat.sat_addr.s_node = ddp->deh_dnode;
- tosat.sat_port = ddp->deh_dport;
-
- sock = atalk_search_socket(&tosat, atif);
- if (!sock) /* But not one of our sockets */
- goto drop;
-
- /* Queue packet (standard) */
- skb->sk = sock;
-
- if (sock_queue_rcv_skb(sock, skb) < 0)
- goto drop;
-
- return NET_RX_SUCCESS;
-
-drop:
- kfree_skb(skb);
-out:
- return NET_RX_DROP;
-
-}
-
-/*
- * Receive a LocalTalk frame. We make some demands on the caller here.
- * Caller must provide enough headroom on the packet to pull the short
- * header and append a long one.
- */
-static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
- struct packet_type *pt, struct net_device *orig_dev)
-{
- if (!net_eq(dev_net(dev), &init_net))
- goto freeit;
-
- /* Expand any short form frames */
- if (skb_mac_header(skb)[2] == 1) {
- struct ddpehdr *ddp;
- /* Find our address */
- struct atalk_addr *ap = atalk_find_dev_addr(dev);
-
- if (!ap || skb->len < sizeof(__be16) || skb->len > 1023)
- goto freeit;
-
- /* Don't mangle buffer if shared */
- if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
- return 0;
-
- /*
- * The push leaves us with a ddephdr not an shdr, and
- * handily the port bytes in the right place preset.
- */
- ddp = (struct ddpehdr *) skb_push(skb, sizeof(*ddp) - 4);
-
- /* Now fill in the long header */
-
- /*
- * These two first. The mac overlays the new source/dest
- * network information so we MUST copy these before
- * we write the network numbers !
- */
-
- ddp->deh_dnode = skb_mac_header(skb)[0]; /* From physical header */
- ddp->deh_snode = skb_mac_header(skb)[1]; /* From physical header */
-
- ddp->deh_dnet = ap->s_net; /* Network number */
- ddp->deh_snet = ap->s_net;
- ddp->deh_sum = 0; /* No checksum */
- /*
- * Not sure about this bit...
- */
- /* Non routable, so force a drop if we slip up later */
- ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10));
- }
- skb_reset_transport_header(skb);
-
- return atalk_rcv(skb, dev, pt, orig_dev);
-freeit:
- kfree_skb(skb);
- return 0;
-}
-
-static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
- size_t len)
-{
- struct sock *sk = sock->sk;
- struct atalk_sock *at = at_sk(sk);
- struct sockaddr_at *usat = (struct sockaddr_at *)msg->msg_name;
- int flags = msg->msg_flags;
- int loopback = 0;
- struct sockaddr_at local_satalk, gsat;
- struct sk_buff *skb;
- struct net_device *dev;
- struct ddpehdr *ddp;
- int size;
- struct atalk_route *rt;
- int err;
-
- if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
- return -EINVAL;
-
- if (len > DDP_MAXSZ)
- return -EMSGSIZE;
-
- lock_kernel();
- if (usat) {
- err = -EBUSY;
- if (sock_flag(sk, SOCK_ZAPPED))
- if (atalk_autobind(sk) < 0)
- goto out;
-
- err = -EINVAL;
- if (msg->msg_namelen < sizeof(*usat) ||
- usat->sat_family != AF_APPLETALK)
- goto out;
-
- err = -EPERM;
- /* netatalk didn't implement this check */
- if (usat->sat_addr.s_node == ATADDR_BCAST &&
- !sock_flag(sk, SOCK_BROADCAST)) {
- goto out;
- }
- } else {
- err = -ENOTCONN;
- if (sk->sk_state != TCP_ESTABLISHED)
- goto out;
- usat = &local_satalk;
- usat->sat_family = AF_APPLETALK;
- usat->sat_port = at->dest_port;
- usat->sat_addr.s_node = at->dest_node;
- usat->sat_addr.s_net = at->dest_net;
- }
-
- /* Build a packet */
- SOCK_DEBUG(sk, "SK %p: Got address.\n", sk);
-
- /* For headers */
- size = sizeof(struct ddpehdr) + len + ddp_dl->header_length;
-
- if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) {
- rt = atrtr_find(&usat->sat_addr);
- } else {
- struct atalk_addr at_hint;
-
- at_hint.s_node = 0;
- at_hint.s_net = at->src_net;
-
- rt = atrtr_find(&at_hint);
- }
- err = ENETUNREACH;
- if (!rt)
- goto out;
-
- dev = rt->dev;
-
- SOCK_DEBUG(sk, "SK %p: Size needed %d, device %s\n",
- sk, size, dev->name);
-
- size += dev->hard_header_len;
- skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err);
- if (!skb)
- goto out;
-
- skb->sk = sk;
- skb_reserve(skb, ddp_dl->header_length);
- skb_reserve(skb, dev->hard_header_len);
- skb->dev = dev;
-
- SOCK_DEBUG(sk, "SK %p: Begin build.\n", sk);
-
- ddp = (struct ddpehdr *)skb_put(skb, sizeof(struct ddpehdr));
- ddp->deh_len_hops = htons(len + sizeof(*ddp));
- ddp->deh_dnet = usat->sat_addr.s_net;
- ddp->deh_snet = at->src_net;
- ddp->deh_dnode = usat->sat_addr.s_node;
- ddp->deh_snode = at->src_node;
- ddp->deh_dport = usat->sat_port;
- ddp->deh_sport = at->src_port;
-
- SOCK_DEBUG(sk, "SK %p: Copy user data (%Zd bytes).\n", sk, len);
-
- err = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
- if (err) {
- kfree_skb(skb);
- err = -EFAULT;
- goto out;
- }
-
- if (sk->sk_no_check == 1)
- ddp->deh_sum = 0;
- else
- ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp));
-
- /*
- * Loopback broadcast packets to non gateway targets (ie routes
- * to group we are in)
- */
- if (ddp->deh_dnode == ATADDR_BCAST &&
- !(rt->flags & RTF_GATEWAY) && !(dev->flags & IFF_LOOPBACK)) {
- struct sk_buff *skb2 = skb_copy(skb, GFP_KERNEL);
-
- if (skb2) {
- loopback = 1;
- SOCK_DEBUG(sk, "SK %p: send out(copy).\n", sk);
- /*
- * If it fails it is queued/sent above in the aarp queue
- */
- aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL);
- }
- }
-
- if (dev->flags & IFF_LOOPBACK || loopback) {
- SOCK_DEBUG(sk, "SK %p: Loop back.\n", sk);
- /* loop back */
- skb_orphan(skb);
- if (ddp->deh_dnode == ATADDR_BCAST) {
- struct atalk_addr at_lo;
-
- at_lo.s_node = 0;
- at_lo.s_net = 0;
-
- rt = atrtr_find(&at_lo);
- if (!rt) {
- kfree_skb(skb);
- err = -ENETUNREACH;
- goto out;
- }
- dev = rt->dev;
- skb->dev = dev;
- }
- ddp_dl->request(ddp_dl, skb, dev->dev_addr);
- } else {
- SOCK_DEBUG(sk, "SK %p: send out.\n", sk);
- if (rt->flags & RTF_GATEWAY) {
- gsat.sat_addr = rt->gateway;
- usat = &gsat;
- }
-
- /*
- * If it fails it is queued/sent above in the aarp queue
- */
- aarp_send_ddp(dev, skb, &usat->sat_addr, NULL);
- }
- SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len);
-
-out:
- unlock_kernel();
- return err ? : len;
-}
-
-static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
- size_t size, int flags)
-{
- struct sock *sk = sock->sk;
- struct sockaddr_at *sat = (struct sockaddr_at *)msg->msg_name;
- struct ddpehdr *ddp;
- int copied = 0;
- int offset = 0;
- int err = 0;
- struct sk_buff *skb;
-
- lock_kernel();
- skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
- flags & MSG_DONTWAIT, &err);
- if (!skb)
- goto out;
-
- /* FIXME: use skb->cb to be able to use shared skbs */
- ddp = ddp_hdr(skb);
- copied = ntohs(ddp->deh_len_hops) & 1023;
-
- if (sk->sk_type != SOCK_RAW) {
- offset = sizeof(*ddp);
- copied -= offset;
- }
-
- if (copied > size) {
- copied = size;
- msg->msg_flags |= MSG_TRUNC;
- }
- err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied);
-
- if (!err) {
- if (sat) {
- sat->sat_family = AF_APPLETALK;
- sat->sat_port = ddp->deh_sport;
- sat->sat_addr.s_node = ddp->deh_snode;
- sat->sat_addr.s_net = ddp->deh_snet;
- }
- msg->msg_namelen = sizeof(*sat);
- }
-
- skb_free_datagram(sk, skb); /* Free the datagram. */
-
-out:
- unlock_kernel();
- return err ? : copied;
-}
-
-
-/*
- * AppleTalk ioctl calls.
- */
-static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
-{
- int rc = -ENOIOCTLCMD;
- struct sock *sk = sock->sk;
- void __user *argp = (void __user *)arg;
-
- switch (cmd) {
- /* Protocol layer */
- case TIOCOUTQ: {
- long amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
-
- if (amount < 0)
- amount = 0;
- rc = put_user(amount, (int __user *)argp);
- break;
- }
- case TIOCINQ: {
- /*
- * These two are safe on a single CPU system as only
- * user tasks fiddle here
- */
- struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
- long amount = 0;
-
- if (skb)
- amount = skb->len - sizeof(struct ddpehdr);
- rc = put_user(amount, (int __user *)argp);
- break;
- }
- case SIOCGSTAMP:
- rc = sock_get_timestamp(sk, argp);
- break;
- case SIOCGSTAMPNS:
- rc = sock_get_timestampns(sk, argp);
- break;
- /* Routing */
- case SIOCADDRT:
- case SIOCDELRT:
- rc = -EPERM;
- if (capable(CAP_NET_ADMIN))
- rc = atrtr_ioctl(cmd, argp);
- break;
- /* Interface */
- case SIOCGIFADDR:
- case SIOCSIFADDR:
- case SIOCGIFBRDADDR:
- case SIOCATALKDIFADDR:
- case SIOCDIFADDR:
- case SIOCSARP: /* proxy AARP */
- case SIOCDARP: /* proxy AARP */
- rtnl_lock();
- rc = atif_ioctl(cmd, argp);
- rtnl_unlock();
- break;
- }
-
- return rc;
-}
-
-
-#ifdef CONFIG_COMPAT
-static int atalk_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
-{
- /*
- * SIOCATALKDIFADDR is a SIOCPROTOPRIVATE ioctl number, so we
- * cannot handle it in common code. The data we access if ifreq
- * here is compatible, so we can simply call the native
- * handler.
- */
- if (cmd == SIOCATALKDIFADDR)
- return atalk_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
-
- return -ENOIOCTLCMD;
-}
-#endif
-
-
-static const struct net_proto_family atalk_family_ops = {
- .family = PF_APPLETALK,
- .create = atalk_create,
- .owner = THIS_MODULE,
-};
-
-static const struct proto_ops atalk_dgram_ops = {
- .family = PF_APPLETALK,
- .owner = THIS_MODULE,
- .release = atalk_release,
- .bind = atalk_bind,
- .connect = atalk_connect,
- .socketpair = sock_no_socketpair,
- .accept = sock_no_accept,
- .getname = atalk_getname,
- .poll = atalk_poll,
- .ioctl = atalk_ioctl,
-#ifdef CONFIG_COMPAT
- .compat_ioctl = atalk_compat_ioctl,
-#endif
- .listen = sock_no_listen,
- .shutdown = sock_no_shutdown,
- .setsockopt = sock_no_setsockopt,
- .getsockopt = sock_no_getsockopt,
- .sendmsg = atalk_sendmsg,
- .recvmsg = atalk_recvmsg,
- .mmap = sock_no_mmap,
- .sendpage = sock_no_sendpage,
-};
-
-static struct notifier_block ddp_notifier = {
- .notifier_call = ddp_device_event,
-};
-
-static struct packet_type ltalk_packet_type __read_mostly = {
- .type = cpu_to_be16(ETH_P_LOCALTALK),
- .func = ltalk_rcv,
-};
-
-static struct packet_type ppptalk_packet_type __read_mostly = {
- .type = cpu_to_be16(ETH_P_PPPTALK),
- .func = atalk_rcv,
-};
-
-static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B };
-
-/* Export symbols for use by drivers when AppleTalk is a module */
-EXPORT_SYMBOL(atrtr_get_dev);
-EXPORT_SYMBOL(atalk_find_dev_addr);
-
-static const char atalk_err_snap[] __initconst =
- KERN_CRIT "Unable to register DDP with SNAP.\n";
-
-/* Called by proto.c on kernel start up */
-static int __init atalk_init(void)
-{
- int rc = proto_register(&ddp_proto, 0);
-
- if (rc != 0)
- goto out;
-
- (void)sock_register(&atalk_family_ops);
- ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
- if (!ddp_dl)
- printk(atalk_err_snap);
-
- dev_add_pack(&ltalk_packet_type);
- dev_add_pack(&ppptalk_packet_type);
-
- register_netdevice_notifier(&ddp_notifier);
- aarp_proto_init();
- atalk_proc_init();
- atalk_register_sysctl();
-out:
- return rc;
-}
-module_init(atalk_init);
-
-/*
- * No explicit module reference count manipulation is needed in the
- * protocol. Socket layer sets module reference count for us
- * and interfaces reference counting is done
- * by the network device layer.
- *
- * Ergo, before the AppleTalk module can be removed, all AppleTalk
- * sockets be closed from user space.
- */
-static void __exit atalk_exit(void)
-{
-#ifdef CONFIG_SYSCTL
- atalk_unregister_sysctl();
-#endif /* CONFIG_SYSCTL */
- atalk_proc_exit();
- aarp_cleanup_module(); /* General aarp clean-up. */
- unregister_netdevice_notifier(&ddp_notifier);
- dev_remove_pack(&ltalk_packet_type);
- dev_remove_pack(&ppptalk_packet_type);
- unregister_snap_client(ddp_dl);
- sock_unregister(PF_APPLETALK);
- proto_unregister(&ddp_proto);
-}
-module_exit(atalk_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Alan Cox <alan@lxorguk.ukuu.org.uk>");
-MODULE_DESCRIPTION("AppleTalk 0.20\n");
-MODULE_ALIAS_NETPROTO(PF_APPLETALK);
diff --git a/drivers/staging/appletalk/dev.c b/drivers/staging/appletalk/dev.c
deleted file mode 100644
index 6c8016f61866..000000000000
--- a/drivers/staging/appletalk/dev.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Moved here from drivers/net/net_init.c, which is:
- * Written 1993,1994,1995 by Donald Becker.
- */
-
-#include <linux/errno.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/if_arp.h>
-#include <linux/if_ltalk.h>
-
-static void ltalk_setup(struct net_device *dev)
-{
- /* Fill in the fields of the device structure with localtalk-generic values. */
-
- dev->type = ARPHRD_LOCALTLK;
- dev->hard_header_len = LTALK_HLEN;
- dev->mtu = LTALK_MTU;
- dev->addr_len = LTALK_ALEN;
- dev->tx_queue_len = 10;
-
- dev->broadcast[0] = 0xFF;
-
- dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP;
-}
-
-/**
- * alloc_ltalkdev - Allocates and sets up an localtalk device
- * @sizeof_priv: Size of additional driver-private structure to be allocated
- * for this localtalk device
- *
- * Fill in the fields of the device structure with localtalk-generic
- * values. Basically does everything except registering the device.
- *
- * Constructs a new net device, complete with a private data area of
- * size @sizeof_priv. A 32-byte (not bit) alignment is enforced for
- * this private data area.
- */
-
-struct net_device *alloc_ltalkdev(int sizeof_priv)
-{
- return alloc_netdev(sizeof_priv, "lt%d", ltalk_setup);
-}
-EXPORT_SYMBOL(alloc_ltalkdev);
diff --git a/drivers/staging/appletalk/sysctl_net_atalk.c b/drivers/staging/appletalk/sysctl_net_atalk.c
deleted file mode 100644
index 4c896b625b2b..000000000000
--- a/drivers/staging/appletalk/sysctl_net_atalk.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * sysctl_net_atalk.c: sysctl interface to net AppleTalk subsystem.
- *
- * Begun April 1, 1996, Mike Shaver.
- * Added /proc/sys/net/atalk directory entry (empty =) ). [MS]
- * Dynamic registration, added aarp entries. (5/30/97 Chris Horn)
- */
-
-#include <linux/sysctl.h>
-#include <net/sock.h>
-#include "atalk.h"
-
-static struct ctl_table atalk_table[] = {
- {
- .procname = "aarp-expiry-time",
- .data = &sysctl_aarp_expiry_time,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "aarp-tick-time",
- .data = &sysctl_aarp_tick_time,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "aarp-retransmit-limit",
- .data = &sysctl_aarp_retransmit_limit,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec,
- },
- {
- .procname = "aarp-resolve-time",
- .data = &sysctl_aarp_resolve_time,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- { },
-};
-
-static struct ctl_path atalk_path[] = {
- { .procname = "net", },
- { .procname = "appletalk", },
- { }
-};
-
-static struct ctl_table_header *atalk_table_header;
-
-void atalk_register_sysctl(void)
-{
- atalk_table_header = register_sysctl_paths(atalk_path, atalk_table);
-}
-
-void atalk_unregister_sysctl(void)
-{
- unregister_sysctl_table(atalk_table_header);
-}