mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	appletalk: remove ipddp driver
After the cops driver is removed, ipddp is now the only CONFIG_DEV_APPLETALK but as far as I can tell, this also has no users and can be removed, making appletalk support purely based on ethertalk, using ethernet hardware. Link: https://lore.kernel.org/netdev/e490dd0c-a65d-4acf-89c6-c06cb48ec880@app.fastmail.com/ Link: https://lore.kernel.org/netdev/9cac4fbd-9557-b0b8-54fa-93f0290a6fb8@schmorgal.com/ Cc: Doug Brown <doug@schmorgal.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://lore.kernel.org/r/20231009141139.1766345-1-arnd@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									f0107b864f
								
							
						
					
					
						commit
						1dab47139e
					
				
					 10 changed files with 31 additions and 533 deletions
				
			
		| 
						 | 
				
			
			@ -59,7 +59,6 @@ Contents:
 | 
			
		|||
   gtp
 | 
			
		||||
   ila
 | 
			
		||||
   ioam6-sysctl
 | 
			
		||||
   ipddp
 | 
			
		||||
   ip_dynaddr
 | 
			
		||||
   ipsec
 | 
			
		||||
   ip-sysctl
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,78 +0,0 @@
 | 
			
		|||
.. SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
 | 
			
		||||
=========================================================
 | 
			
		||||
AppleTalk-IP Decapsulation and AppleTalk-IP Encapsulation
 | 
			
		||||
=========================================================
 | 
			
		||||
 | 
			
		||||
Documentation ipddp.c
 | 
			
		||||
 | 
			
		||||
This file is written by Jay Schulist <jschlst@samba.org>
 | 
			
		||||
 | 
			
		||||
Introduction
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
AppleTalk-IP (IPDDP) is the method computers connected to AppleTalk
 | 
			
		||||
networks can use to communicate via IP. AppleTalk-IP is simply IP datagrams
 | 
			
		||||
inside AppleTalk packets.
 | 
			
		||||
 | 
			
		||||
Through this driver you can either allow your Linux box to communicate
 | 
			
		||||
IP over an AppleTalk network or you can provide IP gatewaying functions
 | 
			
		||||
for your AppleTalk users.
 | 
			
		||||
 | 
			
		||||
You can currently encapsulate or decapsulate AppleTalk-IP on LocalTalk,
 | 
			
		||||
EtherTalk and PPPTalk. The only limit on the protocol is that of what
 | 
			
		||||
kernel AppleTalk layer and drivers are available.
 | 
			
		||||
 | 
			
		||||
Each mode requires its own user space software.
 | 
			
		||||
 | 
			
		||||
Compiling AppleTalk-IP Decapsulation/Encapsulation
 | 
			
		||||
==================================================
 | 
			
		||||
 | 
			
		||||
AppleTalk-IP decapsulation needs to be compiled into your kernel. You
 | 
			
		||||
will need to turn on AppleTalk-IP driver support. Then you will need to
 | 
			
		||||
select ONE of the two options; IP to AppleTalk-IP encapsulation support or
 | 
			
		||||
AppleTalk-IP to IP decapsulation support. If you compile the driver
 | 
			
		||||
statically you will only be able to use the driver for the function you have
 | 
			
		||||
enabled in the kernel. If you compile the driver as a module you can
 | 
			
		||||
select what mode you want it to run in via a module loading param.
 | 
			
		||||
ipddp_mode=1 for AppleTalk-IP encapsulation and ipddp_mode=2 for
 | 
			
		||||
AppleTalk-IP to IP decapsulation.
 | 
			
		||||
 | 
			
		||||
Basic instructions for user space tools
 | 
			
		||||
=======================================
 | 
			
		||||
 | 
			
		||||
I will briefly describe the operation of the tools, but you will
 | 
			
		||||
need to consult the supporting documentation for each set of tools.
 | 
			
		||||
 | 
			
		||||
Decapsulation - You will need to download a software package called
 | 
			
		||||
MacGate. In this distribution there will be a tool called MacRoute
 | 
			
		||||
which enables you to add routes to the kernel for your Macs by hand.
 | 
			
		||||
Also the tool MacRegGateWay is included to register the
 | 
			
		||||
proper IP Gateway and IP addresses for your machine. Included in this
 | 
			
		||||
distribution is a patch to netatalk-1.4b2+asun2.0a17.2 (available from
 | 
			
		||||
ftp.u.washington.edu/pub/user-supported/asun/) this patch is optional
 | 
			
		||||
but it allows automatic adding and deleting of routes for Macs. (Handy
 | 
			
		||||
for locations with large Mac installations)
 | 
			
		||||
 | 
			
		||||
Encapsulation - You will need to download a software daemon called ipddpd.
 | 
			
		||||
This software expects there to be an AppleTalk-IP gateway on the network.
 | 
			
		||||
You will also need to add the proper routes to route your Linux box's IP
 | 
			
		||||
traffic out the ipddp interface.
 | 
			
		||||
 | 
			
		||||
Common Uses of ipddp.c
 | 
			
		||||
----------------------
 | 
			
		||||
Of course AppleTalk-IP decapsulation and encapsulation, but specifically
 | 
			
		||||
decapsulation is being used most for connecting LocalTalk networks to
 | 
			
		||||
IP networks. Although it has been used on EtherTalk networks to allow
 | 
			
		||||
Macs that are only able to tunnel IP over EtherTalk.
 | 
			
		||||
 | 
			
		||||
Encapsulation has been used to allow a Linux box stuck on a LocalTalk
 | 
			
		||||
network to use IP. It should work equally well if you are stuck on an
 | 
			
		||||
EtherTalk only network.
 | 
			
		||||
 | 
			
		||||
Further Assistance
 | 
			
		||||
-------------------
 | 
			
		||||
You can contact me (Jay Schulist <jschlst@samba.org>) with any
 | 
			
		||||
questions regarding decapsulation or encapsulation. Bradford W. Johnson
 | 
			
		||||
<johns393@maroon.tc.umn.edu> originally wrote the ipddp.c driver for IP
 | 
			
		||||
encapsulation in AppleTalk.
 | 
			
		||||
| 
						 | 
				
			
			@ -1459,7 +1459,6 @@ F:	drivers/hwmon/applesmc.c
 | 
			
		|||
APPLETALK NETWORK LAYER
 | 
			
		||||
L:	netdev@vger.kernel.org
 | 
			
		||||
S:	Odd fixes
 | 
			
		||||
F:	drivers/net/appletalk/
 | 
			
		||||
F:	include/linux/atalk.h
 | 
			
		||||
F:	include/uapi/linux/atalk.h
 | 
			
		||||
F:	net/appletalk/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,6 @@ obj-$(CONFIG_MHI_NET) += mhi_net.o
 | 
			
		|||
# Networking Drivers
 | 
			
		||||
#
 | 
			
		||||
obj-$(CONFIG_ARCNET) += arcnet/
 | 
			
		||||
obj-$(CONFIG_DEV_APPLETALK) += appletalk/
 | 
			
		||||
obj-$(CONFIG_CAIF) += caif/
 | 
			
		||||
obj-$(CONFIG_CAN) += can/
 | 
			
		||||
obj-$(CONFIG_NET_DSA) += dsa/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,72 +0,0 @@
 | 
			
		|||
# SPDX-License-Identifier: GPL-2.0-only
 | 
			
		||||
#
 | 
			
		||||
# Appletalk driver configuration
 | 
			
		||||
#
 | 
			
		||||
config ATALK
 | 
			
		||||
	tristate "Appletalk protocol support"
 | 
			
		||||
	select LLC
 | 
			
		||||
	help
 | 
			
		||||
	  AppleTalk is the protocol that Apple computers can use to communicate
 | 
			
		||||
	  on a network.  If your Linux box is connected to such a network and you
 | 
			
		||||
	  wish to connect to it, say Y.  You will need to use the netatalk package
 | 
			
		||||
	  so that your Linux box can act as a print and file server for Macs as
 | 
			
		||||
	  well as access AppleTalk printers.  Check out
 | 
			
		||||
	  <http://www.zettabyte.net/netatalk/> on the WWW for details.
 | 
			
		||||
	  EtherTalk is the name used for AppleTalk over Ethernet and the
 | 
			
		||||
	  cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
 | 
			
		||||
	  network using serial links.  EtherTalk and LocalTalk are fully
 | 
			
		||||
	  supported by Linux.
 | 
			
		||||
 | 
			
		||||
	  General information about how to connect Linux, Windows machines and
 | 
			
		||||
	  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.  The
 | 
			
		||||
	  NET3-4-HOWTO, available from
 | 
			
		||||
	  <http://www.tldp.org/docs.html#howto>, contains valuable
 | 
			
		||||
	  information as well.
 | 
			
		||||
 | 
			
		||||
	  To compile this driver as a module, choose M here: the module will be
 | 
			
		||||
	  called appletalk. You almost certainly want to compile it as a
 | 
			
		||||
	  module so you can restart your AppleTalk stack without rebooting
 | 
			
		||||
	  your machine. I hear that the GNU boycott of Apple is over, so
 | 
			
		||||
	  even politically correct people are allowed to say Y here.
 | 
			
		||||
 | 
			
		||||
config DEV_APPLETALK
 | 
			
		||||
	tristate "Appletalk interfaces support"
 | 
			
		||||
	depends on ATALK
 | 
			
		||||
	help
 | 
			
		||||
	  AppleTalk is the protocol that Apple computers can use to communicate
 | 
			
		||||
	  on a network.  If your Linux box is connected to such a network, and wish
 | 
			
		||||
	  to do IP over it, or you have a LocalTalk card and wish to use it to
 | 
			
		||||
	  connect to the AppleTalk network, say Y.
 | 
			
		||||
 | 
			
		||||
config IPDDP
 | 
			
		||||
	tristate "Appletalk-IP driver support"
 | 
			
		||||
	depends on DEV_APPLETALK && ATALK
 | 
			
		||||
	help
 | 
			
		||||
	  This allows IP networking for users who only have AppleTalk
 | 
			
		||||
	  networking available. This feature is experimental. With this
 | 
			
		||||
	  driver, you can encapsulate IP inside AppleTalk (e.g. if your Linux
 | 
			
		||||
	  box is stuck on an AppleTalk only network) or decapsulate (e.g. if
 | 
			
		||||
	  you want your Linux box to act as an Internet gateway for a zoo of
 | 
			
		||||
	  AppleTalk connected Macs). Please see the file
 | 
			
		||||
	  <file:Documentation/networking/ipddp.rst> for more information.
 | 
			
		||||
 | 
			
		||||
	  If you say Y here, the AppleTalk-IP support will be compiled into
 | 
			
		||||
	  the kernel. In this case, you can either use encapsulation or
 | 
			
		||||
	  decapsulation, but not both. With the following two questions, you
 | 
			
		||||
	  decide which one you want.
 | 
			
		||||
 | 
			
		||||
	  To compile the AppleTalk-IP support as a module, choose M here: the
 | 
			
		||||
	  module will be called ipddp.
 | 
			
		||||
	  In this case, you will be able to use both encapsulation and
 | 
			
		||||
	  decapsulation simultaneously, by loading two copies of the module
 | 
			
		||||
	  and specifying different values for the module option ipddp_mode.
 | 
			
		||||
 | 
			
		||||
config IPDDP_ENCAP
 | 
			
		||||
	bool "IP to Appletalk-IP Encapsulation support"
 | 
			
		||||
	depends on IPDDP
 | 
			
		||||
	help
 | 
			
		||||
	  If you say Y here, the AppleTalk-IP code will be able to encapsulate
 | 
			
		||||
	  IP packets inside AppleTalk frames; this is useful if your Linux box
 | 
			
		||||
	  is stuck on an AppleTalk network (which hopefully contains a
 | 
			
		||||
	  decapsulator somewhere). Please see
 | 
			
		||||
	  <file:Documentation/networking/ipddp.rst> for more information.
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +0,0 @@
 | 
			
		|||
# SPDX-License-Identifier: GPL-2.0-only
 | 
			
		||||
#
 | 
			
		||||
# Makefile for drivers/net/appletalk
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_IPDDP) += ipddp.o
 | 
			
		||||
| 
						 | 
				
			
			@ -1,345 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 *	ipddp.c: IP to Appletalk-IP Encapsulation driver for Linux
 | 
			
		||||
 *		 Appletalk-IP to IP Decapsulation driver for Linux
 | 
			
		||||
 *
 | 
			
		||||
 *	Authors:
 | 
			
		||||
 *      - DDP-IP Encap by: Bradford W. Johnson <johns393@maroon.tc.umn.edu>
 | 
			
		||||
 *	- DDP-IP Decap by: Jay Schulist <jschlst@samba.org>
 | 
			
		||||
 *
 | 
			
		||||
 *	Derived from:
 | 
			
		||||
 *	- Almost all code already existed in net/appletalk/ddp.c I just
 | 
			
		||||
 *	  moved/reorginized it into a driver file. Original IP-over-DDP code
 | 
			
		||||
 *	  was done by Bradford W. Johnson <johns393@maroon.tc.umn.edu>
 | 
			
		||||
 *      - skeleton.c: A network driver outline for linux.
 | 
			
		||||
 *        Written 1993-94 by Donald Becker.
 | 
			
		||||
 *	- dummy.c: A dummy net driver. By Nick Holloway.
 | 
			
		||||
 *	- MacGate: A user space Daemon for Appletalk-IP Decap for
 | 
			
		||||
 *	  Linux by Jay Schulist <jschlst@samba.org>
 | 
			
		||||
 *
 | 
			
		||||
 *      Copyright 1993 United States Government as represented by the
 | 
			
		||||
 *      Director, National Security Agency.
 | 
			
		||||
 *
 | 
			
		||||
 *      This software may be used and distributed according to the terms
 | 
			
		||||
 *      of the GNU General Public License, incorporated herein by reference.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/compat.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#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 <linux/uaccess.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";
 | 
			
		||||
 | 
			
		||||
static struct ipddp_route *ipddp_route_list;
 | 
			
		||||
static DEFINE_SPINLOCK(ipddp_route_lock);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_IPDDP_ENCAP
 | 
			
		||||
static int ipddp_mode = IPDDP_ENCAP;
 | 
			
		||||
#else
 | 
			
		||||
static int ipddp_mode = IPDDP_DECAP;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Index to functions, as function prototypes. */
 | 
			
		||||
static netdev_tx_t ipddp_xmit(struct sk_buff *skb,
 | 
			
		||||
				    struct net_device *dev);
 | 
			
		||||
static int ipddp_create(struct ipddp_route *new_rt);
 | 
			
		||||
static int ipddp_delete(struct ipddp_route *rt);
 | 
			
		||||
static struct ipddp_route* __ipddp_find_route(struct ipddp_route *rt);
 | 
			
		||||
static int ipddp_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
 | 
			
		||||
				void __user *data, int cmd);
 | 
			
		||||
 | 
			
		||||
static const struct net_device_ops ipddp_netdev_ops = {
 | 
			
		||||
	.ndo_start_xmit		= ipddp_xmit,
 | 
			
		||||
	.ndo_siocdevprivate	= ipddp_siocdevprivate,
 | 
			
		||||
	.ndo_set_mac_address 	= eth_mac_addr,
 | 
			
		||||
	.ndo_validate_addr	= eth_validate_addr,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct net_device * __init ipddp_init(void)
 | 
			
		||||
{
 | 
			
		||||
	static unsigned version_printed;
 | 
			
		||||
	struct net_device *dev;
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	dev = alloc_etherdev(0);
 | 
			
		||||
	if (!dev)
 | 
			
		||||
		return ERR_PTR(-ENOMEM);
 | 
			
		||||
 | 
			
		||||
	netif_keep_dst(dev);
 | 
			
		||||
	strcpy(dev->name, "ipddp%d");
 | 
			
		||||
 | 
			
		||||
	if (version_printed++ == 0)
 | 
			
		||||
                printk(version);
 | 
			
		||||
 | 
			
		||||
	/* Initialize the device structure. */
 | 
			
		||||
	dev->netdev_ops = &ipddp_netdev_ops;
 | 
			
		||||
 | 
			
		||||
        dev->type = ARPHRD_IPDDP;       	/* IP over DDP tunnel */
 | 
			
		||||
        dev->mtu = 585;
 | 
			
		||||
        dev->flags |= IFF_NOARP;
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         *      The worst case header we will need is currently a
 | 
			
		||||
         *      ethernet header (14 bytes) and a ddp header (sizeof ddpehdr+1)
 | 
			
		||||
         *      We send over SNAP so that takes another 8 bytes.
 | 
			
		||||
         */
 | 
			
		||||
        dev->hard_header_len = 14+8+sizeof(struct ddpehdr)+1;
 | 
			
		||||
 | 
			
		||||
	err = register_netdev(dev);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		free_netdev(dev);
 | 
			
		||||
		return ERR_PTR(err);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Let the user now what mode we are in */
 | 
			
		||||
	if(ipddp_mode == IPDDP_ENCAP)
 | 
			
		||||
		printk("%s: Appletalk-IP Encap. mode by Bradford W. Johnson <johns393@maroon.tc.umn.edu>\n", 
 | 
			
		||||
			dev->name);
 | 
			
		||||
	if(ipddp_mode == IPDDP_DECAP)
 | 
			
		||||
		printk("%s: Appletalk-IP Decap. mode by Jay Schulist <jschlst@samba.org>\n", 
 | 
			
		||||
			dev->name);
 | 
			
		||||
 | 
			
		||||
        return dev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Transmit LLAP/ELAP frame using aarp_send_ddp.
 | 
			
		||||
 */
 | 
			
		||||
static netdev_tx_t ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
 | 
			
		||||
{
 | 
			
		||||
        struct rtable *rtable = skb_rtable(skb);
 | 
			
		||||
        __be32 paddr = 0;
 | 
			
		||||
        struct ddpehdr *ddp;
 | 
			
		||||
        struct ipddp_route *rt;
 | 
			
		||||
        struct atalk_addr *our_addr;
 | 
			
		||||
 | 
			
		||||
	if (rtable->rt_gw_family == AF_INET)
 | 
			
		||||
		paddr = rtable->rt_gw4;
 | 
			
		||||
 | 
			
		||||
	spin_lock(&ipddp_route_lock);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
         * Find appropriate route to use, based only on IP number.
 | 
			
		||||
         */
 | 
			
		||||
        for(rt = ipddp_route_list; rt != NULL; rt = rt->next)
 | 
			
		||||
        {
 | 
			
		||||
                if(rt->ip == paddr)
 | 
			
		||||
                        break;
 | 
			
		||||
        }
 | 
			
		||||
        if(rt == NULL) {
 | 
			
		||||
		spin_unlock(&ipddp_route_lock);
 | 
			
		||||
                return NETDEV_TX_OK;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        our_addr = atalk_find_dev_addr(rt->dev);
 | 
			
		||||
 | 
			
		||||
	if(ipddp_mode == IPDDP_DECAP)
 | 
			
		||||
		/* 
 | 
			
		||||
		 * Pull off the excess room that should not be there.
 | 
			
		||||
		 * This is due to a hard-header problem. This is the
 | 
			
		||||
		 * quick fix for now though, till it breaks.
 | 
			
		||||
		 */
 | 
			
		||||
		skb_pull(skb, 35-(sizeof(struct ddpehdr)+1));
 | 
			
		||||
 | 
			
		||||
	/* Create the Extended DDP header */
 | 
			
		||||
	ddp = (struct ddpehdr *)skb->data;
 | 
			
		||||
        ddp->deh_len_hops = htons(skb->len + (1<<10));
 | 
			
		||||
        ddp->deh_sum = 0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
         * For Localtalk we need aarp_send_ddp to strip the
 | 
			
		||||
         * long DDP header and place a shot DDP header on it.
 | 
			
		||||
         */
 | 
			
		||||
        if(rt->dev->type == ARPHRD_LOCALTLK)
 | 
			
		||||
        {
 | 
			
		||||
                ddp->deh_dnet  = 0;   /* FIXME more hops?? */
 | 
			
		||||
                ddp->deh_snet  = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
                ddp->deh_dnet  = rt->at.s_net;   /* FIXME more hops?? */
 | 
			
		||||
                ddp->deh_snet  = our_addr->s_net;
 | 
			
		||||
        }
 | 
			
		||||
        ddp->deh_dnode = rt->at.s_node;
 | 
			
		||||
        ddp->deh_snode = our_addr->s_node;
 | 
			
		||||
        ddp->deh_dport = 72;
 | 
			
		||||
        ddp->deh_sport = 72;
 | 
			
		||||
 | 
			
		||||
        *((__u8 *)(ddp+1)) = 22;        	/* ddp type = IP */
 | 
			
		||||
 | 
			
		||||
        skb->protocol = htons(ETH_P_ATALK);     /* Protocol has changed */
 | 
			
		||||
 | 
			
		||||
	dev->stats.tx_packets++;
 | 
			
		||||
	dev->stats.tx_bytes += skb->len;
 | 
			
		||||
 | 
			
		||||
	aarp_send_ddp(rt->dev, skb, &rt->at, NULL);
 | 
			
		||||
 | 
			
		||||
	spin_unlock(&ipddp_route_lock);
 | 
			
		||||
 | 
			
		||||
        return NETDEV_TX_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Create a routing entry. We first verify that the
 | 
			
		||||
 * record does not already exist. If it does we return -EEXIST
 | 
			
		||||
 */
 | 
			
		||||
static int ipddp_create(struct ipddp_route *new_rt)
 | 
			
		||||
{
 | 
			
		||||
        struct ipddp_route *rt = kzalloc(sizeof(*rt), GFP_KERNEL);
 | 
			
		||||
 | 
			
		||||
        if (rt == NULL)
 | 
			
		||||
                return -ENOMEM;
 | 
			
		||||
 | 
			
		||||
        rt->ip = new_rt->ip;
 | 
			
		||||
        rt->at = new_rt->at;
 | 
			
		||||
        rt->next = NULL;
 | 
			
		||||
        if ((rt->dev = atrtr_get_dev(&rt->at)) == NULL) {
 | 
			
		||||
		kfree(rt);
 | 
			
		||||
                return -ENETUNREACH;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	spin_lock_bh(&ipddp_route_lock);
 | 
			
		||||
	if (__ipddp_find_route(rt)) {
 | 
			
		||||
		spin_unlock_bh(&ipddp_route_lock);
 | 
			
		||||
		kfree(rt);
 | 
			
		||||
		return -EEXIST;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        rt->next = ipddp_route_list;
 | 
			
		||||
        ipddp_route_list = rt;
 | 
			
		||||
 | 
			
		||||
	spin_unlock_bh(&ipddp_route_lock);
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Delete a route, we only delete a FULL match.
 | 
			
		||||
 * If route does not exist we return -ENOENT.
 | 
			
		||||
 */
 | 
			
		||||
static int ipddp_delete(struct ipddp_route *rt)
 | 
			
		||||
{
 | 
			
		||||
        struct ipddp_route **r = &ipddp_route_list;
 | 
			
		||||
        struct ipddp_route *tmp;
 | 
			
		||||
 | 
			
		||||
	spin_lock_bh(&ipddp_route_lock);
 | 
			
		||||
        while((tmp = *r) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
                if(tmp->ip == rt->ip &&
 | 
			
		||||
		   tmp->at.s_net == rt->at.s_net &&
 | 
			
		||||
		   tmp->at.s_node == rt->at.s_node)
 | 
			
		||||
                {
 | 
			
		||||
                        *r = tmp->next;
 | 
			
		||||
			spin_unlock_bh(&ipddp_route_lock);
 | 
			
		||||
                        kfree(tmp);
 | 
			
		||||
                        return 0;
 | 
			
		||||
                }
 | 
			
		||||
                r = &tmp->next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	spin_unlock_bh(&ipddp_route_lock);
 | 
			
		||||
        return -ENOENT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Find a routing entry, we only return a FULL match
 | 
			
		||||
 */
 | 
			
		||||
static struct ipddp_route* __ipddp_find_route(struct ipddp_route *rt)
 | 
			
		||||
{
 | 
			
		||||
        struct ipddp_route *f;
 | 
			
		||||
 | 
			
		||||
        for(f = ipddp_route_list; f != NULL; f = f->next)
 | 
			
		||||
        {
 | 
			
		||||
                if(f->ip == rt->ip &&
 | 
			
		||||
		   f->at.s_net == rt->at.s_net &&
 | 
			
		||||
		   f->at.s_node == rt->at.s_node)
 | 
			
		||||
                        return f;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ipddp_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
 | 
			
		||||
				void __user *data, int cmd)
 | 
			
		||||
{
 | 
			
		||||
        struct ipddp_route rcp, rcp2, *rp;
 | 
			
		||||
 | 
			
		||||
	if (in_compat_syscall())
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
        if(!capable(CAP_NET_ADMIN))
 | 
			
		||||
                return -EPERM;
 | 
			
		||||
 | 
			
		||||
	if (copy_from_user(&rcp, data, sizeof(rcp)))
 | 
			
		||||
		return -EFAULT;
 | 
			
		||||
 | 
			
		||||
        switch(cmd)
 | 
			
		||||
        {
 | 
			
		||||
		case SIOCADDIPDDPRT:
 | 
			
		||||
                        return ipddp_create(&rcp);
 | 
			
		||||
 | 
			
		||||
                case SIOCFINDIPDDPRT:
 | 
			
		||||
			spin_lock_bh(&ipddp_route_lock);
 | 
			
		||||
			rp = __ipddp_find_route(&rcp);
 | 
			
		||||
			if (rp) {
 | 
			
		||||
				memset(&rcp2, 0, sizeof(rcp2));
 | 
			
		||||
				rcp2.ip    = rp->ip;
 | 
			
		||||
				rcp2.at    = rp->at;
 | 
			
		||||
				rcp2.flags = rp->flags;
 | 
			
		||||
			}
 | 
			
		||||
			spin_unlock_bh(&ipddp_route_lock);
 | 
			
		||||
 | 
			
		||||
			if (rp) {
 | 
			
		||||
				if (copy_to_user(data, &rcp2,
 | 
			
		||||
						 sizeof(struct ipddp_route)))
 | 
			
		||||
					return -EFAULT;
 | 
			
		||||
				return 0;
 | 
			
		||||
			} else
 | 
			
		||||
				return -ENOENT;
 | 
			
		||||
 | 
			
		||||
                case SIOCDELIPDDPRT:
 | 
			
		||||
                        return ipddp_delete(&rcp);
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                        return -EINVAL;
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct net_device *dev_ipddp;
 | 
			
		||||
 | 
			
		||||
MODULE_LICENSE("GPL");
 | 
			
		||||
module_param(ipddp_mode, int, 0);
 | 
			
		||||
 | 
			
		||||
static int __init ipddp_init_module(void)
 | 
			
		||||
{
 | 
			
		||||
	dev_ipddp = ipddp_init();
 | 
			
		||||
	return PTR_ERR_OR_ZERO(dev_ipddp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __exit ipddp_cleanup_module(void)
 | 
			
		||||
{
 | 
			
		||||
        struct ipddp_route *p;
 | 
			
		||||
 | 
			
		||||
	unregister_netdev(dev_ipddp);
 | 
			
		||||
        free_netdev(dev_ipddp);
 | 
			
		||||
 | 
			
		||||
        while (ipddp_route_list) {
 | 
			
		||||
                p = ipddp_route_list->next;
 | 
			
		||||
                kfree(ipddp_route_list);
 | 
			
		||||
                ipddp_route_list = p;
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module_init(ipddp_init_module);
 | 
			
		||||
module_exit(ipddp_cleanup_module);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,28 +0,0 @@
 | 
			
		|||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
/*
 | 
			
		||||
 *	ipddp.h: Header for IP-over-DDP driver for Linux.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LINUX_IPDDP_H
 | 
			
		||||
#define __LINUX_IPDDP_H
 | 
			
		||||
 | 
			
		||||
#ifdef __KERNEL__
 | 
			
		||||
 | 
			
		||||
#define SIOCADDIPDDPRT   (SIOCDEVPRIVATE)
 | 
			
		||||
#define SIOCDELIPDDPRT   (SIOCDEVPRIVATE+1)
 | 
			
		||||
#define SIOCFINDIPDDPRT  (SIOCDEVPRIVATE+2)
 | 
			
		||||
 | 
			
		||||
struct ipddp_route
 | 
			
		||||
{
 | 
			
		||||
        struct net_device *dev;             /* Carrier device */
 | 
			
		||||
        __be32 ip;                       /* IP address */
 | 
			
		||||
        struct atalk_addr at;              /* Gateway appletalk address */
 | 
			
		||||
        int flags;
 | 
			
		||||
        struct ipddp_route *next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define IPDDP_ENCAP	1
 | 
			
		||||
#define IPDDP_DECAP	2
 | 
			
		||||
 | 
			
		||||
#endif	/* __KERNEL__ */
 | 
			
		||||
#endif	/* __LINUX_IPDDP_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +246,7 @@ source "net/bridge/Kconfig"
 | 
			
		|||
source "net/dsa/Kconfig"
 | 
			
		||||
source "net/8021q/Kconfig"
 | 
			
		||||
source "net/llc/Kconfig"
 | 
			
		||||
source "drivers/net/appletalk/Kconfig"
 | 
			
		||||
source "net/appletalk/Kconfig"
 | 
			
		||||
source "net/x25/Kconfig"
 | 
			
		||||
source "net/lapb/Kconfig"
 | 
			
		||||
source "net/phonet/Kconfig"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								net/appletalk/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								net/appletalk/Kconfig
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
# SPDX-License-Identifier: GPL-2.0-only
 | 
			
		||||
#
 | 
			
		||||
# Appletalk configuration
 | 
			
		||||
#
 | 
			
		||||
config ATALK
 | 
			
		||||
	tristate "Appletalk protocol support"
 | 
			
		||||
	select LLC
 | 
			
		||||
	help
 | 
			
		||||
	  AppleTalk is the protocol that Apple computers can use to communicate
 | 
			
		||||
	  on a network.  If your Linux box is connected to such a network and you
 | 
			
		||||
	  wish to connect to it, say Y.  You will need to use the netatalk package
 | 
			
		||||
	  so that your Linux box can act as a print and file server for Macs as
 | 
			
		||||
	  well as access AppleTalk printers.  Check out
 | 
			
		||||
	  <http://www.zettabyte.net/netatalk/> on the WWW for details.
 | 
			
		||||
	  EtherTalk is the name used for AppleTalk over Ethernet and the
 | 
			
		||||
	  cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
 | 
			
		||||
	  network using serial links.  EtherTalk and LocalTalk are fully
 | 
			
		||||
	  supported by Linux.
 | 
			
		||||
 | 
			
		||||
	  General information about how to connect Linux, Windows machines and
 | 
			
		||||
	  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.  The
 | 
			
		||||
	  NET3-4-HOWTO, available from
 | 
			
		||||
	  <http://www.tldp.org/docs.html#howto>, contains valuable
 | 
			
		||||
	  information as well.
 | 
			
		||||
 | 
			
		||||
	  To compile this driver as a module, choose M here: the module will be
 | 
			
		||||
	  called appletalk. You almost certainly want to compile it as a
 | 
			
		||||
	  module so you can restart your AppleTalk stack without rebooting
 | 
			
		||||
	  your machine. I hear that the GNU boycott of Apple is over, so
 | 
			
		||||
	  even politically correct people are allowed to say Y here.
 | 
			
		||||
		Loading…
	
		Reference in a new issue