net: wan: Delete the DLCI / SDLA drivers
The DLCI driver (dlci.c) implements the Frame Relay protocol. However,
we already have another newer and better implementation of Frame Relay
provided by the HDLC_FR driver (hdlc_fr.c).
The DLCI driver's implementation of Frame Relay is used by only one
hardware driver in the kernel - the SDLA driver (sdla.c).
The SDLA driver provides Frame Relay support for the Sangoma S50x devices.
However, the vendor provides their own driver (along with their own
multi-WAN-protocol implementations including Frame Relay), called WANPIPE.
I believe most users of the hardware would use the vendor-provided WANPIPE
driver instead.
(The WANPIPE driver was even once in the kernel, but was deleted in
commit 8db60bcf30 ("[WAN]: Remove broken and unmaintained Sangoma
drivers.") because the vendor no longer updated the in-kernel WANPIPE
driver.)
Cc: Mike McLagan <mike.mclagan@linux.org>
Signed-off-by: Xie He <xie.he.0141@gmail.com>
Link: https://lore.kernel.org/r/20201114150921.685594-1-xie.he.0141@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									fccf111e47
								
							
						
					
					
						commit
						f73659192b
					
				
							
								
								
									
										9
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								CREDITS
									
									
									
									
									
								
							| @ -2499,15 +2499,6 @@ W: http://www.rdrop.com/users/paulmck/ | |||||||
| D: RCU and variants | D: RCU and variants | ||||||
| D: rcutorture module | D: rcutorture module | ||||||
| 
 | 
 | ||||||
| N: Mike McLagan |  | ||||||
| E: mike.mclagan@linux.org |  | ||||||
| W: http://www.invlogic.com/~mmclagan |  | ||||||
| D: DLCI/FRAD drivers for Sangoma SDLAs |  | ||||||
| S: Innovative Logic Corp |  | ||||||
| S: Post Office Box 1068 |  | ||||||
| S: Laurel, Maryland 20732 |  | ||||||
| S: USA |  | ||||||
| 
 |  | ||||||
| N: Bradley McLean | N: Bradley McLean | ||||||
| E: brad@bradpc.gaylord.com | E: brad@bradpc.gaylord.com | ||||||
| D: Device driver hacker | D: Device driver hacker | ||||||
|  | |||||||
| @ -1,44 +0,0 @@ | |||||||
| .. SPDX-License-Identifier: GPL-2.0 |  | ||||||
| 
 |  | ||||||
| ================ |  | ||||||
| Frame Relay (FR) |  | ||||||
| ================ |  | ||||||
| 
 |  | ||||||
| Frame Relay (FR) support for linux is built into a two tiered system of device |  | ||||||
| drivers.  The upper layer implements RFC1490 FR specification, and uses the |  | ||||||
| Data Link Connection Identifier (DLCI) as its hardware address.  Usually these |  | ||||||
| are assigned by your network supplier, they give you the number/numbers of |  | ||||||
| the Virtual Connections (VC) assigned to you. |  | ||||||
| 
 |  | ||||||
| Each DLCI is a point-to-point link between your machine and a remote one. |  | ||||||
| As such, a separate device is needed to accommodate the routing.  Within the |  | ||||||
| net-tools archives is 'dlcicfg'.  This program will communicate with the |  | ||||||
| base "DLCI" device, and create new net devices named 'dlci00', 'dlci01'... |  | ||||||
| The configuration script will ask you how many DLCIs you need, as well as |  | ||||||
| how many DLCIs you want to assign to each Frame Relay Access Device (FRAD). |  | ||||||
| 
 |  | ||||||
| The DLCI uses a number of function calls to communicate with the FRAD, all |  | ||||||
| of which are stored in the FRAD's private data area.  assoc/deassoc, |  | ||||||
| activate/deactivate and dlci_config.  The DLCI supplies a receive function |  | ||||||
| to the FRAD to accept incoming packets. |  | ||||||
| 
 |  | ||||||
| With this initial offering, only 1 FRAD driver is available.  With many thanks |  | ||||||
| to Sangoma Technologies, David Mandelstam & Gene Kozin, the S502A, S502E & |  | ||||||
| S508 are supported.  This driver is currently set up for only FR, but as |  | ||||||
| Sangoma makes more firmware modules available, it can be updated to provide |  | ||||||
| them as well. |  | ||||||
| 
 |  | ||||||
| Configuration of the FRAD makes use of another net-tools program, 'fradcfg'. |  | ||||||
| This program makes use of a configuration file (which dlcicfg can also read) |  | ||||||
| to specify the types of boards to be configured as FRADs, as well as perform |  | ||||||
| any board specific configuration.  The Sangoma module of fradcfg loads the |  | ||||||
| FR firmware into the card, sets the irq/port/memory information, and provides |  | ||||||
| an initial configuration. |  | ||||||
| 
 |  | ||||||
| Additional FRAD device drivers can be added as hardware is available. |  | ||||||
| 
 |  | ||||||
| At this time, the dlcicfg and fradcfg programs have not been incorporated into |  | ||||||
| the net-tools distribution.  They can be found at ftp.invlogic.com, in |  | ||||||
| /pub/linux.  Note that with OS/2 FTPD, you end up in /pub by default, so just |  | ||||||
| use 'cd linux'.  v0.10 is for use on pre-2.0.3 and earlier, v0.15 is for |  | ||||||
| pre-2.0.4 and later. |  | ||||||
| @ -6905,12 +6905,6 @@ S:	Maintained | |||||||
| W:	http://floatingpoint.sourceforge.net/emulator/index.html | W:	http://floatingpoint.sourceforge.net/emulator/index.html | ||||||
| F:	arch/x86/math-emu/ | F:	arch/x86/math-emu/ | ||||||
| 
 | 
 | ||||||
| FRAME RELAY DLCI/FRAD (Sangoma drivers too) |  | ||||||
| L:	netdev@vger.kernel.org |  | ||||||
| S:	Orphan |  | ||||||
| F:	drivers/net/wan/dlci.c |  | ||||||
| F:	drivers/net/wan/sdla.c |  | ||||||
| 
 |  | ||||||
| FRAMEBUFFER LAYER | FRAMEBUFFER LAYER | ||||||
| M:	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | M:	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | ||||||
| L:	dri-devel@lists.freedesktop.org | L:	dri-devel@lists.freedesktop.org | ||||||
|  | |||||||
| @ -141,7 +141,6 @@ CONFIG_HDLC_CISCO=m | |||||||
| CONFIG_HDLC_FR=m | CONFIG_HDLC_FR=m | ||||||
| CONFIG_HDLC_PPP=m | CONFIG_HDLC_PPP=m | ||||||
| CONFIG_HDLC_X25=m | CONFIG_HDLC_X25=m | ||||||
| CONFIG_DLCI=m |  | ||||||
| CONFIG_WAN_ROUTER_DRIVERS=m | CONFIG_WAN_ROUTER_DRIVERS=m | ||||||
| CONFIG_ATM_TCP=m | CONFIG_ATM_TCP=m | ||||||
| # CONFIG_INPUT_KEYBOARD is not set | # CONFIG_INPUT_KEYBOARD is not set | ||||||
|  | |||||||
| @ -228,7 +228,6 @@ CONFIG_FARSYNC=m | |||||||
| CONFIG_DSCC4=m | CONFIG_DSCC4=m | ||||||
| CONFIG_DSCC4_PCISYNC=y | CONFIG_DSCC4_PCISYNC=y | ||||||
| CONFIG_DSCC4_PCI_RST=y | CONFIG_DSCC4_PCI_RST=y | ||||||
| CONFIG_DLCI=m |  | ||||||
| CONFIG_LAPBETHER=m | CONFIG_LAPBETHER=m | ||||||
| # CONFIG_INPUT_KEYBOARD is not set | # CONFIG_INPUT_KEYBOARD is not set | ||||||
| # CONFIG_INPUT_MOUSE is not set | # CONFIG_INPUT_MOUSE is not set | ||||||
|  | |||||||
| @ -378,7 +378,6 @@ CONFIG_FARSYNC=m | |||||||
| CONFIG_DSCC4=m | CONFIG_DSCC4=m | ||||||
| CONFIG_DSCC4_PCISYNC=y | CONFIG_DSCC4_PCISYNC=y | ||||||
| CONFIG_DSCC4_PCI_RST=y | CONFIG_DSCC4_PCI_RST=y | ||||||
| CONFIG_DLCI=m |  | ||||||
| CONFIG_LAPBETHER=m | CONFIG_LAPBETHER=m | ||||||
| # CONFIG_KEYBOARD_ATKBD is not set | # CONFIG_KEYBOARD_ATKBD is not set | ||||||
| CONFIG_KEYBOARD_GPIO=y | CONFIG_KEYBOARD_GPIO=y | ||||||
|  | |||||||
| @ -321,51 +321,6 @@ config IXP4XX_HSS | |||||||
| 	  Say Y here if you want to use built-in HSS ports | 	  Say Y here if you want to use built-in HSS ports | ||||||
| 	  on IXP4xx processor. | 	  on IXP4xx processor. | ||||||
| 
 | 
 | ||||||
| config DLCI |  | ||||||
| 	tristate "Frame Relay DLCI support" |  | ||||||
| 	help |  | ||||||
| 	  Support for the Frame Relay protocol. |  | ||||||
| 
 |  | ||||||
| 	  Frame Relay is a fast low-cost way to connect to a remote Internet |  | ||||||
| 	  access provider or to form a private wide area network. The one |  | ||||||
| 	  physical line from your box to the local "switch" (i.e. the entry |  | ||||||
| 	  point to the Frame Relay network, usually at the phone company) can |  | ||||||
| 	  carry several logical point-to-point connections to other computers |  | ||||||
| 	  connected to the Frame Relay network. For a general explanation of |  | ||||||
| 	  the protocol, check out <http://www.mplsforum.org/>. |  | ||||||
| 
 |  | ||||||
| 	  To use frame relay, you need supporting hardware (called FRAD) and |  | ||||||
| 	  certain programs from the net-tools package as explained in |  | ||||||
| 	  <file:Documentation/networking/framerelay.rst>. |  | ||||||
| 
 |  | ||||||
| 	  To compile this driver as a module, choose M here: the |  | ||||||
| 	  module will be called dlci. |  | ||||||
| 
 |  | ||||||
| config DLCI_MAX |  | ||||||
| 	int "Max DLCI per device" |  | ||||||
| 	depends on DLCI |  | ||||||
| 	default "8" |  | ||||||
| 	help |  | ||||||
| 	  How many logical point-to-point frame relay connections (the |  | ||||||
| 	  identifiers of which are called DCLIs) should be handled by each |  | ||||||
| 	  of your hardware frame relay access devices. |  | ||||||
| 
 |  | ||||||
| 	  Go with the default. |  | ||||||
| 
 |  | ||||||
| config SDLA |  | ||||||
| 	tristate "SDLA (Sangoma S502/S508) support" |  | ||||||
| 	depends on DLCI && ISA |  | ||||||
| 	help |  | ||||||
| 	  Driver for the Sangoma S502A, S502E, and S508 Frame Relay Access |  | ||||||
| 	  Devices. |  | ||||||
| 
 |  | ||||||
| 	  These are multi-protocol cards, but only Frame Relay is supported |  | ||||||
| 	  by the driver at this time. Please read |  | ||||||
| 	  <file:Documentation/networking/framerelay.rst>. |  | ||||||
| 
 |  | ||||||
| 	  To compile this driver as a module, choose M here: the |  | ||||||
| 	  module will be called sdla. |  | ||||||
| 
 |  | ||||||
| # X.25 network drivers | # X.25 network drivers | ||||||
| config LAPBETHER | config LAPBETHER | ||||||
| 	tristate "LAPB over Ethernet driver" | 	tristate "LAPB over Ethernet driver" | ||||||
|  | |||||||
| @ -21,8 +21,6 @@ obj-$(CONFIG_FARSYNC)		+= farsync.o | |||||||
| 
 | 
 | ||||||
| obj-$(CONFIG_LANMEDIA)		+= lmc/ | obj-$(CONFIG_LANMEDIA)		+= lmc/ | ||||||
| 
 | 
 | ||||||
| obj-$(CONFIG_DLCI)		+= dlci.o  |  | ||||||
| obj-$(CONFIG_SDLA)		+= sdla.o |  | ||||||
| obj-$(CONFIG_LAPBETHER)		+= lapbether.o | obj-$(CONFIG_LAPBETHER)		+= lapbether.o | ||||||
| obj-$(CONFIG_SBNI)		+= sbni.o | obj-$(CONFIG_SBNI)		+= sbni.o | ||||||
| obj-$(CONFIG_N2)		+= n2.o | obj-$(CONFIG_N2)		+= n2.o | ||||||
|  | |||||||
| @ -1,541 +0,0 @@ | |||||||
| // SPDX-License-Identifier: GPL-2.0-or-later
 |  | ||||||
| /*
 |  | ||||||
|  * DLCI		Implementation of Frame Relay protocol for Linux, according to |  | ||||||
|  *		RFC 1490.  This generic device provides en/decapsulation for an |  | ||||||
|  *		underlying hardware driver.  Routes & IPs are assigned to these |  | ||||||
|  *		interfaces.  Requires 'dlcicfg' program to create usable  |  | ||||||
|  *		interfaces, the initial one, 'dlci' is for IOCTL use only. |  | ||||||
|  * |  | ||||||
|  * Version:	@(#)dlci.c	0.35	4 Jan 1997 |  | ||||||
|  * |  | ||||||
|  * Author:	Mike McLagan <mike.mclagan@linux.org> |  | ||||||
|  * |  | ||||||
|  * Changes: |  | ||||||
|  * |  | ||||||
|  *		0.15	Mike Mclagan	Packet freeing, bug in kmalloc call |  | ||||||
|  *					DLCI_RET handling |  | ||||||
|  *		0.20	Mike McLagan	More conservative on which packets |  | ||||||
|  *					are returned for retry and which are |  | ||||||
|  *					are dropped.  If DLCI_RET_DROP is |  | ||||||
|  *					returned from the FRAD, the packet is |  | ||||||
|  *				 	sent back to Linux for re-transmission |  | ||||||
|  *		0.25	Mike McLagan	Converted to use SIOC IOCTL calls |  | ||||||
|  *		0.30	Jim Freeman	Fixed to allow IPX traffic |  | ||||||
|  *		0.35	Michael Elizabeth	Fixed incorrect memcpy_fromfs |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |  | ||||||
| 
 |  | ||||||
| #include <linux/module.h> |  | ||||||
| #include <linux/kernel.h> |  | ||||||
| #include <linux/types.h> |  | ||||||
| #include <linux/fcntl.h> |  | ||||||
| #include <linux/interrupt.h> |  | ||||||
| #include <linux/ptrace.h> |  | ||||||
| #include <linux/ioport.h> |  | ||||||
| #include <linux/in.h> |  | ||||||
| #include <linux/init.h> |  | ||||||
| #include <linux/slab.h> |  | ||||||
| #include <linux/string.h> |  | ||||||
| #include <linux/errno.h> |  | ||||||
| #include <linux/netdevice.h> |  | ||||||
| #include <linux/skbuff.h> |  | ||||||
| #include <linux/if_arp.h> |  | ||||||
| #include <linux/if_frad.h> |  | ||||||
| #include <linux/bitops.h> |  | ||||||
| 
 |  | ||||||
| #include <net/sock.h> |  | ||||||
| 
 |  | ||||||
| #include <asm/io.h> |  | ||||||
| #include <asm/dma.h> |  | ||||||
| #include <linux/uaccess.h> |  | ||||||
| 
 |  | ||||||
| static const char version[] = "DLCI driver v0.35, 4 Jan 1997, mike.mclagan@linux.org"; |  | ||||||
| 
 |  | ||||||
| static LIST_HEAD(dlci_devs); |  | ||||||
| 
 |  | ||||||
| static void dlci_setup(struct net_device *); |  | ||||||
| 
 |  | ||||||
| /* 
 |  | ||||||
|  * these encapsulate the RFC 1490 requirements as well as  |  | ||||||
|  * deal with packet transmission and reception, working with |  | ||||||
|  * the upper network layers  |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| static int dlci_header(struct sk_buff *skb, struct net_device *dev,  |  | ||||||
| 		       unsigned short type, const void *daddr, |  | ||||||
| 		       const void *saddr, unsigned len) |  | ||||||
| { |  | ||||||
| 	struct frhdr		hdr; |  | ||||||
| 	unsigned int		hlen; |  | ||||||
| 	char			*dest; |  | ||||||
| 
 |  | ||||||
| 	hdr.control = FRAD_I_UI; |  | ||||||
| 	switch (type) |  | ||||||
| 	{ |  | ||||||
| 		case ETH_P_IP: |  | ||||||
| 			hdr.IP_NLPID = FRAD_P_IP; |  | ||||||
| 			hlen = sizeof(hdr.control) + sizeof(hdr.IP_NLPID); |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 		/* feel free to add other types, if necessary */ |  | ||||||
| 
 |  | ||||||
| 		default: |  | ||||||
| 			hdr.pad = FRAD_P_PADDING; |  | ||||||
| 			hdr.NLPID = FRAD_P_SNAP; |  | ||||||
| 			memset(hdr.OUI, 0, sizeof(hdr.OUI)); |  | ||||||
| 			hdr.PID = htons(type); |  | ||||||
| 			hlen = sizeof(hdr); |  | ||||||
| 			break; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	dest = skb_push(skb, hlen); |  | ||||||
| 	if (!dest) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	memcpy(dest, &hdr, hlen); |  | ||||||
| 
 |  | ||||||
| 	return hlen; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void dlci_receive(struct sk_buff *skb, struct net_device *dev) |  | ||||||
| { |  | ||||||
| 	struct frhdr		*hdr; |  | ||||||
| 	int					process, header; |  | ||||||
| 
 |  | ||||||
| 	if (!pskb_may_pull(skb, sizeof(*hdr))) { |  | ||||||
| 		netdev_notice(dev, "invalid data no header\n"); |  | ||||||
| 		dev->stats.rx_errors++; |  | ||||||
| 		kfree_skb(skb); |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	hdr = (struct frhdr *) skb->data; |  | ||||||
| 	process = 0; |  | ||||||
| 	header = 0; |  | ||||||
| 	skb->dev = dev; |  | ||||||
| 
 |  | ||||||
| 	if (hdr->control != FRAD_I_UI) |  | ||||||
| 	{ |  | ||||||
| 		netdev_notice(dev, "Invalid header flag 0x%02X\n", |  | ||||||
| 			      hdr->control); |  | ||||||
| 		dev->stats.rx_errors++; |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 		switch (hdr->IP_NLPID) |  | ||||||
| 		{ |  | ||||||
| 			case FRAD_P_PADDING: |  | ||||||
| 				if (hdr->NLPID != FRAD_P_SNAP) |  | ||||||
| 				{ |  | ||||||
| 					netdev_notice(dev, "Unsupported NLPID 0x%02X\n", |  | ||||||
| 						      hdr->NLPID); |  | ||||||
| 					dev->stats.rx_errors++; |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 	  |  | ||||||
| 				if (hdr->OUI[0] + hdr->OUI[1] + hdr->OUI[2] != 0) |  | ||||||
| 				{ |  | ||||||
| 					netdev_notice(dev, "Unsupported organizationally unique identifier 0x%02X-%02X-%02X\n", |  | ||||||
| 						      hdr->OUI[0], |  | ||||||
| 						      hdr->OUI[1], |  | ||||||
| 						      hdr->OUI[2]); |  | ||||||
| 					dev->stats.rx_errors++; |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				/* at this point, it's an EtherType frame */ |  | ||||||
| 				header = sizeof(struct frhdr); |  | ||||||
| 				/* Already in network order ! */ |  | ||||||
| 				skb->protocol = hdr->PID; |  | ||||||
| 				process = 1; |  | ||||||
| 				break; |  | ||||||
| 
 |  | ||||||
| 			case FRAD_P_IP: |  | ||||||
| 				header = sizeof(hdr->control) + sizeof(hdr->IP_NLPID); |  | ||||||
| 				skb->protocol = htons(ETH_P_IP); |  | ||||||
| 				process = 1; |  | ||||||
| 				break; |  | ||||||
| 
 |  | ||||||
| 			case FRAD_P_SNAP: |  | ||||||
| 			case FRAD_P_Q933: |  | ||||||
| 			case FRAD_P_CLNP: |  | ||||||
| 				netdev_notice(dev, "Unsupported NLPID 0x%02X\n", |  | ||||||
| 					      hdr->pad); |  | ||||||
| 				dev->stats.rx_errors++; |  | ||||||
| 				break; |  | ||||||
| 
 |  | ||||||
| 			default: |  | ||||||
| 				netdev_notice(dev, "Invalid pad byte 0x%02X\n", |  | ||||||
| 					      hdr->pad); |  | ||||||
| 				dev->stats.rx_errors++; |  | ||||||
| 				break;				 |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	if (process) |  | ||||||
| 	{ |  | ||||||
| 		/* we've set up the protocol, so discard the header */ |  | ||||||
| 		skb_reset_mac_header(skb); |  | ||||||
| 		skb_pull(skb, header); |  | ||||||
| 		dev->stats.rx_bytes += skb->len; |  | ||||||
| 		netif_rx(skb); |  | ||||||
| 		dev->stats.rx_packets++; |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 		dev_kfree_skb(skb); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static netdev_tx_t dlci_transmit(struct sk_buff *skb, struct net_device *dev) |  | ||||||
| { |  | ||||||
| 	struct dlci_local *dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	if (skb) { |  | ||||||
| 		struct netdev_queue *txq = skb_get_tx_queue(dev, skb); |  | ||||||
| 		netdev_start_xmit(skb, dlp->slave, txq, false); |  | ||||||
| 	} |  | ||||||
| 	return NETDEV_TX_OK; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) |  | ||||||
| { |  | ||||||
| 	struct dlci_conf	config; |  | ||||||
| 	struct dlci_local	*dlp; |  | ||||||
| 	struct frad_local	*flp; |  | ||||||
| 	int			err; |  | ||||||
| 
 |  | ||||||
| 	dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	flp = netdev_priv(dlp->slave); |  | ||||||
| 
 |  | ||||||
| 	if (!get) |  | ||||||
| 	{ |  | ||||||
| 		if (copy_from_user(&config, conf, sizeof(struct dlci_conf))) |  | ||||||
| 			return -EFAULT; |  | ||||||
| 		if (config.flags & ~DLCI_VALID_FLAGS) |  | ||||||
| 			return -EINVAL; |  | ||||||
| 		memcpy(&dlp->config, &config, sizeof(struct dlci_conf)); |  | ||||||
| 		dlp->configured = 1; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = (*flp->dlci_conf)(dlp->slave, dev, get); |  | ||||||
| 	if (err) |  | ||||||
| 		return err; |  | ||||||
| 
 |  | ||||||
| 	if (get) |  | ||||||
| 	{ |  | ||||||
| 		if (copy_to_user(conf, &dlp->config, sizeof(struct dlci_conf))) |  | ||||||
| 			return -EFAULT; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |  | ||||||
| { |  | ||||||
| 	struct dlci_local *dlp; |  | ||||||
| 
 |  | ||||||
| 	if (!capable(CAP_NET_ADMIN)) |  | ||||||
| 		return -EPERM; |  | ||||||
| 
 |  | ||||||
| 	dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	switch (cmd) |  | ||||||
| 	{ |  | ||||||
| 		case DLCI_GET_SLAVE: |  | ||||||
| 			if (!*(short *)(dev->dev_addr)) |  | ||||||
| 				return -EINVAL; |  | ||||||
| 
 |  | ||||||
| 			strncpy(ifr->ifr_slave, dlp->slave->name, sizeof(ifr->ifr_slave)); |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 		case DLCI_GET_CONF: |  | ||||||
| 		case DLCI_SET_CONF: |  | ||||||
| 			if (!*(short *)(dev->dev_addr)) |  | ||||||
| 				return -EINVAL; |  | ||||||
| 
 |  | ||||||
| 			return dlci_config(dev, ifr->ifr_data, cmd == DLCI_GET_CONF); |  | ||||||
| 
 |  | ||||||
| 		default:  |  | ||||||
| 			return -EOPNOTSUPP; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_change_mtu(struct net_device *dev, int new_mtu) |  | ||||||
| { |  | ||||||
| 	struct dlci_local *dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	return dev_set_mtu(dlp->slave, new_mtu); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_open(struct net_device *dev) |  | ||||||
| { |  | ||||||
| 	struct dlci_local	*dlp; |  | ||||||
| 	struct frad_local	*flp; |  | ||||||
| 	int			err; |  | ||||||
| 
 |  | ||||||
| 	dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	if (!*(short *)(dev->dev_addr)) |  | ||||||
| 		return -EINVAL; |  | ||||||
| 
 |  | ||||||
| 	if (!netif_running(dlp->slave)) |  | ||||||
| 		return -ENOTCONN; |  | ||||||
| 
 |  | ||||||
| 	flp = netdev_priv(dlp->slave); |  | ||||||
| 	err = (*flp->activate)(dlp->slave, dev); |  | ||||||
| 	if (err) |  | ||||||
| 		return err; |  | ||||||
| 
 |  | ||||||
| 	netif_start_queue(dev); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_close(struct net_device *dev) |  | ||||||
| { |  | ||||||
| 	struct dlci_local	*dlp; |  | ||||||
| 	struct frad_local	*flp; |  | ||||||
| 
 |  | ||||||
| 	netif_stop_queue(dev); |  | ||||||
| 
 |  | ||||||
| 	dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	flp = netdev_priv(dlp->slave); |  | ||||||
| 	(*flp->deactivate)(dlp->slave, dev); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_add(struct dlci_add *dlci) |  | ||||||
| { |  | ||||||
| 	struct net_device	*master, *slave; |  | ||||||
| 	struct dlci_local	*dlp; |  | ||||||
| 	struct frad_local	*flp; |  | ||||||
| 	int			err = -EINVAL; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	/* validate slave device */ |  | ||||||
| 	slave = dev_get_by_name(&init_net, dlci->devname); |  | ||||||
| 	if (!slave) |  | ||||||
| 		return -ENODEV; |  | ||||||
| 
 |  | ||||||
| 	if (slave->type != ARPHRD_FRAD || netdev_priv(slave) == NULL) |  | ||||||
| 		goto err1; |  | ||||||
| 
 |  | ||||||
| 	/* create device name */ |  | ||||||
| 	master = alloc_netdev(sizeof(struct dlci_local), "dlci%d", |  | ||||||
| 			      NET_NAME_UNKNOWN, dlci_setup); |  | ||||||
| 	if (!master) { |  | ||||||
| 		err = -ENOMEM; |  | ||||||
| 		goto err1; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* make sure same slave not already registered */ |  | ||||||
| 	rtnl_lock(); |  | ||||||
| 	list_for_each_entry(dlp, &dlci_devs, list) { |  | ||||||
| 		if (dlp->slave == slave) { |  | ||||||
| 			err = -EBUSY; |  | ||||||
| 			goto err2; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	*(short *)(master->dev_addr) = dlci->dlci; |  | ||||||
| 
 |  | ||||||
| 	dlp = netdev_priv(master); |  | ||||||
| 	dlp->slave = slave; |  | ||||||
| 	dlp->master = master; |  | ||||||
| 
 |  | ||||||
| 	flp = netdev_priv(slave); |  | ||||||
| 	err = (*flp->assoc)(slave, master); |  | ||||||
| 	if (err < 0) |  | ||||||
| 		goto err2; |  | ||||||
| 
 |  | ||||||
| 	err = register_netdevice(master); |  | ||||||
| 	if (err < 0)  |  | ||||||
| 		goto err2; |  | ||||||
| 
 |  | ||||||
| 	strcpy(dlci->devname, master->name); |  | ||||||
| 
 |  | ||||||
| 	list_add(&dlp->list, &dlci_devs); |  | ||||||
| 	rtnl_unlock(); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| 
 |  | ||||||
|  err2: |  | ||||||
| 	rtnl_unlock(); |  | ||||||
| 	free_netdev(master); |  | ||||||
|  err1: |  | ||||||
| 	dev_put(slave); |  | ||||||
| 	return err; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_del(struct dlci_add *dlci) |  | ||||||
| { |  | ||||||
| 	struct dlci_local	*dlp; |  | ||||||
| 	struct frad_local	*flp; |  | ||||||
| 	struct net_device	*master, *slave; |  | ||||||
| 	int			err; |  | ||||||
| 	bool			found = false; |  | ||||||
| 
 |  | ||||||
| 	rtnl_lock(); |  | ||||||
| 
 |  | ||||||
| 	/* validate slave device */ |  | ||||||
| 	master = __dev_get_by_name(&init_net, dlci->devname); |  | ||||||
| 	if (!master) { |  | ||||||
| 		err = -ENODEV; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	list_for_each_entry(dlp, &dlci_devs, list) { |  | ||||||
| 		if (dlp->master == master) { |  | ||||||
| 			found = true; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if (!found) { |  | ||||||
| 		err = -ENODEV; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (netif_running(master)) { |  | ||||||
| 		err = -EBUSY; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	dlp = netdev_priv(master); |  | ||||||
| 	slave = dlp->slave; |  | ||||||
| 	flp = netdev_priv(slave); |  | ||||||
| 
 |  | ||||||
| 	err = (*flp->deassoc)(slave, master); |  | ||||||
| 	if (!err) { |  | ||||||
| 		list_del(&dlp->list); |  | ||||||
| 
 |  | ||||||
| 		unregister_netdevice(master); |  | ||||||
| 
 |  | ||||||
| 		dev_put(slave); |  | ||||||
| 	} |  | ||||||
| out: |  | ||||||
| 	rtnl_unlock(); |  | ||||||
| 	return err; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int dlci_ioctl(unsigned int cmd, void __user *arg) |  | ||||||
| { |  | ||||||
| 	struct dlci_add add; |  | ||||||
| 	int err; |  | ||||||
| 	 |  | ||||||
| 	if (!capable(CAP_NET_ADMIN)) |  | ||||||
| 		return -EPERM; |  | ||||||
| 
 |  | ||||||
| 	if (copy_from_user(&add, arg, sizeof(struct dlci_add))) |  | ||||||
| 		return -EFAULT; |  | ||||||
| 
 |  | ||||||
| 	switch (cmd) |  | ||||||
| 	{ |  | ||||||
| 		case SIOCADDDLCI: |  | ||||||
| 			err = dlci_add(&add); |  | ||||||
| 
 |  | ||||||
| 			if (!err) |  | ||||||
| 				if (copy_to_user(arg, &add, sizeof(struct dlci_add))) |  | ||||||
| 					return -EFAULT; |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 		case SIOCDELDLCI: |  | ||||||
| 			err = dlci_del(&add); |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 		default: |  | ||||||
| 			err = -EINVAL; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return err; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static const struct header_ops dlci_header_ops = { |  | ||||||
| 	.create	= dlci_header, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static const struct net_device_ops dlci_netdev_ops = { |  | ||||||
| 	.ndo_open	= dlci_open, |  | ||||||
| 	.ndo_stop	= dlci_close, |  | ||||||
| 	.ndo_do_ioctl	= dlci_dev_ioctl, |  | ||||||
| 	.ndo_start_xmit	= dlci_transmit, |  | ||||||
| 	.ndo_change_mtu	= dlci_change_mtu, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void dlci_setup(struct net_device *dev) |  | ||||||
| { |  | ||||||
| 	struct dlci_local *dlp = netdev_priv(dev); |  | ||||||
| 
 |  | ||||||
| 	dev->flags		= 0; |  | ||||||
| 	dev->header_ops		= &dlci_header_ops; |  | ||||||
| 	dev->netdev_ops		= &dlci_netdev_ops; |  | ||||||
| 	dev->needs_free_netdev	= true; |  | ||||||
| 
 |  | ||||||
| 	dlp->receive		= dlci_receive; |  | ||||||
| 
 |  | ||||||
| 	dev->type		= ARPHRD_DLCI; |  | ||||||
| 	dev->hard_header_len	= sizeof(struct frhdr); |  | ||||||
| 	dev->addr_len		= sizeof(short); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* if slave is unregistering, then cleanup master */ |  | ||||||
| static int dlci_dev_event(struct notifier_block *unused, |  | ||||||
| 			  unsigned long event, void *ptr) |  | ||||||
| { |  | ||||||
| 	struct net_device *dev = netdev_notifier_info_to_dev(ptr); |  | ||||||
| 
 |  | ||||||
| 	if (dev_net(dev) != &init_net) |  | ||||||
| 		return NOTIFY_DONE; |  | ||||||
| 
 |  | ||||||
| 	if (event == NETDEV_UNREGISTER) { |  | ||||||
| 		struct dlci_local *dlp; |  | ||||||
| 
 |  | ||||||
| 		list_for_each_entry(dlp, &dlci_devs, list) { |  | ||||||
| 			if (dlp->slave == dev) { |  | ||||||
| 				list_del(&dlp->list); |  | ||||||
| 				unregister_netdevice(dlp->master); |  | ||||||
| 				dev_put(dlp->slave); |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return NOTIFY_DONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct notifier_block dlci_notifier = { |  | ||||||
| 	.notifier_call = dlci_dev_event, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static int __init init_dlci(void) |  | ||||||
| { |  | ||||||
| 	dlci_ioctl_set(dlci_ioctl); |  | ||||||
| 	register_netdevice_notifier(&dlci_notifier); |  | ||||||
| 
 |  | ||||||
| 	printk("%s.\n", version); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void __exit dlci_exit(void) |  | ||||||
| { |  | ||||||
| 	struct dlci_local	*dlp, *nxt; |  | ||||||
| 	 |  | ||||||
| 	dlci_ioctl_set(NULL); |  | ||||||
| 	unregister_netdevice_notifier(&dlci_notifier); |  | ||||||
| 
 |  | ||||||
| 	rtnl_lock(); |  | ||||||
| 	list_for_each_entry_safe(dlp, nxt, &dlci_devs, list) { |  | ||||||
| 		unregister_netdevice(dlp->master); |  | ||||||
| 		dev_put(dlp->slave); |  | ||||||
| 	} |  | ||||||
| 	rtnl_unlock(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| module_init(init_dlci); |  | ||||||
| module_exit(dlci_exit); |  | ||||||
| 
 |  | ||||||
| MODULE_AUTHOR("Mike McLagan"); |  | ||||||
| MODULE_DESCRIPTION("Frame Relay DLCI layer"); |  | ||||||
| MODULE_LICENSE("GPL"); |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,92 +0,0 @@ | |||||||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ |  | ||||||
| /*
 |  | ||||||
|  * DLCI/FRAD	Definitions for Frame Relay Access Devices.  DLCI devices are |  | ||||||
|  *		created for each DLCI associated with a FRAD.  The FRAD driver |  | ||||||
|  *		is not truly a network device, but the lower level device |  | ||||||
|  *		handler.  This allows other FRAD manufacturers to use the DLCI |  | ||||||
|  *		code, including its RFC1490 encapsulation alongside the current |  | ||||||
|  *		implementation for the Sangoma cards. |  | ||||||
|  * |  | ||||||
|  * Version:	@(#)if_ifrad.h	0.15	31 Mar 96 |  | ||||||
|  * |  | ||||||
|  * Author:	Mike McLagan <mike.mclagan@linux.org> |  | ||||||
|  * |  | ||||||
|  * Changes: |  | ||||||
|  *		0.15	Mike McLagan	changed structure defs (packed) |  | ||||||
|  *					re-arranged flags |  | ||||||
|  *					added DLCI_RET vars |  | ||||||
|  */ |  | ||||||
| #ifndef _FRAD_H_ |  | ||||||
| #define _FRAD_H_ |  | ||||||
| 
 |  | ||||||
| #include <uapi/linux/if_frad.h> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #if defined(CONFIG_DLCI) || defined(CONFIG_DLCI_MODULE) |  | ||||||
| 
 |  | ||||||
| /* these are the fields of an RFC 1490 header */ |  | ||||||
| struct frhdr |  | ||||||
| { |  | ||||||
|    unsigned char  control; |  | ||||||
| 
 |  | ||||||
|    /* for IP packets, this can be the NLPID */ |  | ||||||
|    unsigned char  pad; |  | ||||||
| 
 |  | ||||||
|    unsigned char  NLPID; |  | ||||||
|    unsigned char  OUI[3]; |  | ||||||
|    __be16 PID; |  | ||||||
| 
 |  | ||||||
| #define IP_NLPID pad  |  | ||||||
| } __packed; |  | ||||||
| 
 |  | ||||||
| /* see RFC 1490 for the definition of the following */ |  | ||||||
| #define FRAD_I_UI		0x03 |  | ||||||
| 
 |  | ||||||
| #define FRAD_P_PADDING		0x00 |  | ||||||
| #define FRAD_P_Q933		0x08 |  | ||||||
| #define FRAD_P_SNAP		0x80 |  | ||||||
| #define FRAD_P_CLNP		0x81 |  | ||||||
| #define FRAD_P_IP		0xCC |  | ||||||
| 
 |  | ||||||
| struct dlci_local |  | ||||||
| { |  | ||||||
|    struct net_device      *master; |  | ||||||
|    struct net_device      *slave; |  | ||||||
|    struct dlci_conf       config; |  | ||||||
|    int                    configured; |  | ||||||
|    struct list_head	  list; |  | ||||||
| 
 |  | ||||||
|    /* callback function */ |  | ||||||
|    void              (*receive)(struct sk_buff *skb, struct net_device *); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| struct frad_local |  | ||||||
| { |  | ||||||
|    /* devices which this FRAD is slaved to */ |  | ||||||
|    struct net_device     *master[CONFIG_DLCI_MAX]; |  | ||||||
|    short             dlci[CONFIG_DLCI_MAX]; |  | ||||||
| 
 |  | ||||||
|    struct frad_conf  config; |  | ||||||
|    int               configured;	/* has this device been configured */ |  | ||||||
|    int               initialized;	/* mem_start, port, irq set ? */ |  | ||||||
| 
 |  | ||||||
|    /* callback functions */ |  | ||||||
|    int               (*activate)(struct net_device *, struct net_device *); |  | ||||||
|    int               (*deactivate)(struct net_device *, struct net_device *); |  | ||||||
|    int               (*assoc)(struct net_device *, struct net_device *); |  | ||||||
|    int               (*deassoc)(struct net_device *, struct net_device *); |  | ||||||
|    int               (*dlci_conf)(struct net_device *, struct net_device *, int get); |  | ||||||
| 
 |  | ||||||
|    /* fields that are used by the Sangoma SDLA cards */ |  | ||||||
|    struct timer_list timer; |  | ||||||
|    struct net_device *dev; |  | ||||||
|    int               type;		/* adapter type */ |  | ||||||
|    int               state;		/* state of the S502/8 control latch */ |  | ||||||
|    int               buffer;		/* current buffer for S508 firmware */ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #endif /* CONFIG_DLCI || CONFIG_DLCI_MODULE */ |  | ||||||
| 
 |  | ||||||
| extern void dlci_ioctl_set(int (*hook)(unsigned int, void __user *)); |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
| @ -1,240 +0,0 @@ | |||||||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ |  | ||||||
| /*
 |  | ||||||
|  * INET		An implementation of the TCP/IP protocol suite for the LINUX |  | ||||||
|  *		operating system.  INET is implemented using the  BSD Socket |  | ||||||
|  *		interface as the means of communication with the user level. |  | ||||||
|  * |  | ||||||
|  *		Global definitions for the Frame relay interface. |  | ||||||
|  * |  | ||||||
|  * Version:	@(#)if_ifrad.h	0.20	13 Apr 96 |  | ||||||
|  * |  | ||||||
|  * Author:	Mike McLagan <mike.mclagan@linux.org> |  | ||||||
|  * |  | ||||||
|  * Changes: |  | ||||||
|  *		0.15	Mike McLagan	Structure packing |  | ||||||
|  * |  | ||||||
|  *		0.20	Mike McLagan	New flags for S508 buffer handling |  | ||||||
|  */ |  | ||||||
| #ifndef SDLA_H |  | ||||||
| #define SDLA_H |  | ||||||
| 
 |  | ||||||
| #include <uapi/linux/sdla.h> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* important Z80 window addresses */ |  | ||||||
| #define SDLA_CONTROL_WND		0xE000 |  | ||||||
| 
 |  | ||||||
| #define SDLA_502_CMD_BUF		0xEF60 |  | ||||||
| #define SDLA_502_RCV_BUF		0xA900 |  | ||||||
| #define	SDLA_502_TXN_AVAIL		0xFFF1 |  | ||||||
| #define SDLA_502_RCV_AVAIL		0xFFF2 |  | ||||||
| #define SDLA_502_EVENT_FLAGS		0xFFF3 |  | ||||||
| #define SDLA_502_MDM_STATUS		0xFFF4 |  | ||||||
| #define SDLA_502_IRQ_INTERFACE		0xFFFD |  | ||||||
| #define SDLA_502_IRQ_PERMISSION		0xFFFE |  | ||||||
| #define SDLA_502_DATA_OFS		0x0010 |  | ||||||
| 
 |  | ||||||
| #define SDLA_508_CMD_BUF		0xE000 |  | ||||||
| #define SDLA_508_TXBUF_INFO		0xF100 |  | ||||||
| #define SDLA_508_RXBUF_INFO		0xF120 |  | ||||||
| #define SDLA_508_EVENT_FLAGS		0xF003 |  | ||||||
| #define SDLA_508_MDM_STATUS		0xF004 |  | ||||||
| #define SDLA_508_IRQ_INTERFACE		0xF010 |  | ||||||
| #define SDLA_508_IRQ_PERMISSION		0xF011 |  | ||||||
| #define SDLA_508_TSE_OFFSET		0xF012 |  | ||||||
| 
 |  | ||||||
| /* Event flags */ |  | ||||||
| #define SDLA_EVENT_STATUS		0x01 |  | ||||||
| #define SDLA_EVENT_DLCI_STATUS		0x02 |  | ||||||
| #define SDLA_EVENT_BAD_DLCI		0x04 |  | ||||||
| #define SDLA_EVENT_LINK_DOWN		0x40 |  | ||||||
| 
 |  | ||||||
| /* IRQ Trigger flags */ |  | ||||||
| #define SDLA_INTR_RX			0x01 |  | ||||||
| #define SDLA_INTR_TX			0x02 |  | ||||||
| #define SDLA_INTR_MODEM			0x04 |  | ||||||
| #define SDLA_INTR_COMPLETE		0x08 |  | ||||||
| #define SDLA_INTR_STATUS		0x10 |  | ||||||
| #define SDLA_INTR_TIMER			0x20 |  | ||||||
| 
 |  | ||||||
| /* DLCI status bits */ |  | ||||||
| #define SDLA_DLCI_DELETED		0x01 |  | ||||||
| #define SDLA_DLCI_ACTIVE		0x02 |  | ||||||
| #define SDLA_DLCI_WAITING		0x04 |  | ||||||
| #define SDLA_DLCI_NEW			0x08 |  | ||||||
| #define SDLA_DLCI_INCLUDED		0x40 |  | ||||||
| 
 |  | ||||||
| /* valid command codes */ |  | ||||||
| #define	SDLA_INFORMATION_WRITE		0x01 |  | ||||||
| #define	SDLA_INFORMATION_READ		0x02 |  | ||||||
| #define SDLA_ISSUE_IN_CHANNEL_SIGNAL	0x03 |  | ||||||
| #define	SDLA_SET_DLCI_CONFIGURATION	0x10 |  | ||||||
| #define	SDLA_READ_DLCI_CONFIGURATION	0x11 |  | ||||||
| #define	SDLA_DISABLE_COMMUNICATIONS	0x12 |  | ||||||
| #define	SDLA_ENABLE_COMMUNICATIONS	0x13 |  | ||||||
| #define	SDLA_READ_DLC_STATUS		0x14 |  | ||||||
| #define	SDLA_READ_DLC_STATISTICS	0x15 |  | ||||||
| #define	SDLA_FLUSH_DLC_STATISTICS	0x16 |  | ||||||
| #define	SDLA_LIST_ACTIVE_DLCI		0x17 |  | ||||||
| #define	SDLA_FLUSH_INFORMATION_BUFFERS	0x18 |  | ||||||
| #define	SDLA_ADD_DLCI			0x20 |  | ||||||
| #define	SDLA_DELETE_DLCI		0x21 |  | ||||||
| #define	SDLA_ACTIVATE_DLCI		0x22 |  | ||||||
| #define	SDLA_DEACTIVATE_DLCI		0x23 |  | ||||||
| #define	SDLA_READ_MODEM_STATUS		0x30 |  | ||||||
| #define	SDLA_SET_MODEM_STATUS		0x31 |  | ||||||
| #define	SDLA_READ_COMMS_ERR_STATS	0x32 |  | ||||||
| #define SDLA_FLUSH_COMMS_ERR_STATS	0x33 |  | ||||||
| #define	SDLA_READ_CODE_VERSION		0x40 |  | ||||||
| #define SDLA_SET_IRQ_TRIGGER		0x50 |  | ||||||
| #define SDLA_GET_IRQ_TRIGGER		0x51 |  | ||||||
| 
 |  | ||||||
| /* In channel signal types */ |  | ||||||
| #define SDLA_ICS_LINK_VERIFY		0x02 |  | ||||||
| #define SDLA_ICS_STATUS_ENQ		0x03 |  | ||||||
| 
 |  | ||||||
| /* modem status flags */ |  | ||||||
| #define SDLA_MODEM_DTR_HIGH		0x01 |  | ||||||
| #define SDLA_MODEM_RTS_HIGH		0x02 |  | ||||||
| #define SDLA_MODEM_DCD_HIGH		0x08 |  | ||||||
| #define SDLA_MODEM_CTS_HIGH		0x20 |  | ||||||
| 
 |  | ||||||
| /* used for RET_MODEM interpretation */ |  | ||||||
| #define SDLA_MODEM_DCD_LOW		0x01 |  | ||||||
| #define SDLA_MODEM_CTS_LOW		0x02 |  | ||||||
| 
 |  | ||||||
| /* return codes */ |  | ||||||
| #define SDLA_RET_OK			0x00 |  | ||||||
| #define SDLA_RET_COMMUNICATIONS		0x01 |  | ||||||
| #define SDLA_RET_CHANNEL_INACTIVE	0x02 |  | ||||||
| #define SDLA_RET_DLCI_INACTIVE		0x03 |  | ||||||
| #define SDLA_RET_DLCI_CONFIG		0x04 |  | ||||||
| #define SDLA_RET_BUF_TOO_BIG		0x05 |  | ||||||
| #define SDLA_RET_NO_DATA		0x05 |  | ||||||
| #define SDLA_RET_BUF_OVERSIZE		0x06 |  | ||||||
| #define SDLA_RET_CIR_OVERFLOW		0x07 |  | ||||||
| #define SDLA_RET_NO_BUFS		0x08 |  | ||||||
| #define SDLA_RET_TIMEOUT		0x0A |  | ||||||
| #define SDLA_RET_MODEM			0x10 |  | ||||||
| #define SDLA_RET_CHANNEL_OFF		0x11 |  | ||||||
| #define SDLA_RET_CHANNEL_ON		0x12 |  | ||||||
| #define SDLA_RET_DLCI_STATUS		0x13 |  | ||||||
| #define SDLA_RET_DLCI_UNKNOWN       	0x14 |  | ||||||
| #define SDLA_RET_COMMAND_INVALID    	0x1F |  | ||||||
| 
 |  | ||||||
| /* Configuration flags */ |  | ||||||
| #define SDLA_DIRECT_RECV		0x0080 |  | ||||||
| #define SDLA_TX_NO_EXCEPT		0x0020 |  | ||||||
| #define SDLA_NO_ICF_MSGS		0x1000 |  | ||||||
| #define SDLA_TX50_RX50			0x0000 |  | ||||||
| #define SDLA_TX70_RX30			0x2000 |  | ||||||
| #define SDLA_TX30_RX70			0x4000 |  | ||||||
| 
 |  | ||||||
| /* IRQ selection flags */ |  | ||||||
| #define SDLA_IRQ_RECEIVE		0x01 |  | ||||||
| #define SDLA_IRQ_TRANSMIT		0x02 |  | ||||||
| #define SDLA_IRQ_MODEM_STAT		0x04 |  | ||||||
| #define SDLA_IRQ_COMMAND		0x08 |  | ||||||
| #define SDLA_IRQ_CHANNEL		0x10 |  | ||||||
| #define SDLA_IRQ_TIMER			0x20 |  | ||||||
| 
 |  | ||||||
| /* definitions for PC memory mapping */ |  | ||||||
| #define SDLA_8K_WINDOW			0x01 |  | ||||||
| #define SDLA_S502_SEG_A			0x10 |  | ||||||
| #define SDLA_S502_SEG_C			0x20 |  | ||||||
| #define SDLA_S502_SEG_D			0x00 |  | ||||||
| #define SDLA_S502_SEG_E			0x30 |  | ||||||
| #define SDLA_S507_SEG_A			0x00 |  | ||||||
| #define SDLA_S507_SEG_B			0x40 |  | ||||||
| #define SDLA_S507_SEG_C			0x80 |  | ||||||
| #define SDLA_S507_SEG_E			0xC0 |  | ||||||
| #define SDLA_S508_SEG_A			0x00 |  | ||||||
| #define SDLA_S508_SEG_C			0x10 |  | ||||||
| #define SDLA_S508_SEG_D			0x08 |  | ||||||
| #define SDLA_S508_SEG_E			0x18 |  | ||||||
| 
 |  | ||||||
| /* SDLA adapter port constants */ |  | ||||||
| #define SDLA_IO_EXTENTS			0x04 |  | ||||||
| 	 |  | ||||||
| #define SDLA_REG_CONTROL		0x00 |  | ||||||
| #define SDLA_REG_PC_WINDOW		0x01	/* offset for PC window select latch */ |  | ||||||
| #define SDLA_REG_Z80_WINDOW 		0x02	/* offset for Z80 window select latch */ |  | ||||||
| #define SDLA_REG_Z80_CONTROL		0x03	/* offset for Z80 control latch */ |  | ||||||
| 	 |  | ||||||
| #define SDLA_S502_STS			0x00	/* status reg for 502, 502E, 507 */ |  | ||||||
| #define SDLA_S508_GNRL			0x00	/* general purp. reg for 508 */ |  | ||||||
| #define SDLA_S508_STS			0x01	/* status reg for 508 */ |  | ||||||
| #define SDLA_S508_IDR			0x02	/* ID reg for 508 */ |  | ||||||
| 	 |  | ||||||
| /* control register flags */ |  | ||||||
| #define SDLA_S502A_START		0x00	/* start the CPU */ |  | ||||||
| #define SDLA_S502A_INTREQ		0x02 |  | ||||||
| #define SDLA_S502A_INTEN		0x04 |  | ||||||
| #define SDLA_S502A_HALT			0x08	/* halt the CPU */	 |  | ||||||
| #define SDLA_S502A_NMI			0x10	/* issue an NMI to the CPU */ |  | ||||||
| 
 |  | ||||||
| #define SDLA_S502E_CPUEN		0x01 |  | ||||||
| #define SDLA_S502E_ENABLE		0x02 |  | ||||||
| #define SDLA_S502E_INTACK		0x04 |  | ||||||
| 	 |  | ||||||
| #define SDLA_S507_ENABLE		0x01 |  | ||||||
| #define SDLA_S507_IRQ3			0x00 |  | ||||||
| #define SDLA_S507_IRQ4			0x20 |  | ||||||
| #define SDLA_S507_IRQ5			0x40 |  | ||||||
| #define SDLA_S507_IRQ7			0x60 |  | ||||||
| #define SDLA_S507_IRQ10			0x80 |  | ||||||
| #define SDLA_S507_IRQ11			0xA0 |  | ||||||
| #define SDLA_S507_IRQ12			0xC0 |  | ||||||
| #define SDLA_S507_IRQ15			0xE0 |  | ||||||
| 	 |  | ||||||
| #define SDLA_HALT			0x00 |  | ||||||
| #define SDLA_CPUEN			0x02 |  | ||||||
| #define SDLA_MEMEN			0x04 |  | ||||||
| #define SDLA_S507_EPROMWR		0x08 |  | ||||||
| #define SDLA_S507_EPROMCLK		0x10 |  | ||||||
| #define SDLA_S508_INTRQ			0x08 |  | ||||||
| #define SDLA_S508_INTEN			0x10 |  | ||||||
| 
 |  | ||||||
| struct sdla_cmd { |  | ||||||
|    char  opp_flag; |  | ||||||
|    char  cmd; |  | ||||||
|    short length; |  | ||||||
|    char  retval; |  | ||||||
|    short dlci; |  | ||||||
|    char  flags; |  | ||||||
|    short rxlost_int; |  | ||||||
|    long  rxlost_app; |  | ||||||
|    char  reserve[2]; |  | ||||||
|    char  data[SDLA_MAX_DATA];	/* transfer data buffer */ |  | ||||||
| } __attribute__((packed)); |  | ||||||
| 
 |  | ||||||
| struct intr_info { |  | ||||||
|    char  flags; |  | ||||||
|    short txlen; |  | ||||||
|    char  irq; |  | ||||||
|    char  flags2; |  | ||||||
|    short timeout; |  | ||||||
| } __attribute__((packed)); |  | ||||||
| 
 |  | ||||||
| /* found in the 508's control window at RXBUF_INFO */ |  | ||||||
| struct buf_info { |  | ||||||
|    unsigned short rse_num; |  | ||||||
|    unsigned long  rse_base; |  | ||||||
|    unsigned long  rse_next; |  | ||||||
|    unsigned long  buf_base; |  | ||||||
|    unsigned short reserved; |  | ||||||
|    unsigned long  buf_top; |  | ||||||
| } __attribute__((packed)); |  | ||||||
| 
 |  | ||||||
| /* structure pointed to by rse_base in RXBUF_INFO struct */ |  | ||||||
| struct buf_entry { |  | ||||||
|    char  opp_flag; |  | ||||||
|    short length; |  | ||||||
|    short dlci; |  | ||||||
|    char  flags; |  | ||||||
|    short timestamp; |  | ||||||
|    short reserved[2]; |  | ||||||
|    long  buf_addr; |  | ||||||
| } __attribute__((packed)); |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
| @ -1,123 +0,0 @@ | |||||||
| /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ |  | ||||||
| /*
 |  | ||||||
|  * DLCI/FRAD	Definitions for Frame Relay Access Devices.  DLCI devices are |  | ||||||
|  *		created for each DLCI associated with a FRAD.  The FRAD driver |  | ||||||
|  *		is not truly a network device, but the lower level device |  | ||||||
|  *		handler.  This allows other FRAD manufacturers to use the DLCI |  | ||||||
|  *		code, including its RFC1490 encapsulation alongside the current |  | ||||||
|  *		implementation for the Sangoma cards. |  | ||||||
|  * |  | ||||||
|  * Version:	@(#)if_ifrad.h	0.15	31 Mar 96 |  | ||||||
|  * |  | ||||||
|  * Author:	Mike McLagan <mike.mclagan@linux.org> |  | ||||||
|  * |  | ||||||
|  * Changes: |  | ||||||
|  *		0.15	Mike McLagan	changed structure defs (packed) |  | ||||||
|  *					re-arranged flags |  | ||||||
|  *					added DLCI_RET vars |  | ||||||
|  * |  | ||||||
|  *		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. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef _UAPI_FRAD_H_ |  | ||||||
| #define _UAPI_FRAD_H_ |  | ||||||
| 
 |  | ||||||
| #include <linux/if.h> |  | ||||||
| 
 |  | ||||||
| /* Structures and constants associated with the DLCI device driver */ |  | ||||||
| 
 |  | ||||||
| struct dlci_add |  | ||||||
| { |  | ||||||
|    char  devname[IFNAMSIZ]; |  | ||||||
|    short dlci; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #define DLCI_GET_CONF	(SIOCDEVPRIVATE + 2) |  | ||||||
| #define DLCI_SET_CONF	(SIOCDEVPRIVATE + 3) |  | ||||||
| 
 |  | ||||||
| /* 
 |  | ||||||
|  * These are related to the Sangoma SDLA and should remain in order.  |  | ||||||
|  * Code within the SDLA module is based on the specifics of this  |  | ||||||
|  * structure.  Change at your own peril. |  | ||||||
|  */ |  | ||||||
| struct dlci_conf { |  | ||||||
|    short flags; |  | ||||||
|    short CIR_fwd; |  | ||||||
|    short Bc_fwd; |  | ||||||
|    short Be_fwd; |  | ||||||
|    short CIR_bwd; |  | ||||||
|    short Bc_bwd; |  | ||||||
|    short Be_bwd;  |  | ||||||
| 
 |  | ||||||
| /* these are part of the status read */ |  | ||||||
|    short Tc_fwd; |  | ||||||
|    short Tc_bwd; |  | ||||||
|    short Tf_max; |  | ||||||
|    short Tb_max; |  | ||||||
| 
 |  | ||||||
| /* add any new fields here above is a mirror of sdla_dlci_conf */ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #define DLCI_GET_SLAVE	(SIOCDEVPRIVATE + 4) |  | ||||||
| 
 |  | ||||||
| /* configuration flags for DLCI */ |  | ||||||
| #define DLCI_IGNORE_CIR_OUT	0x0001 |  | ||||||
| #define DLCI_ACCOUNT_CIR_IN	0x0002 |  | ||||||
| #define DLCI_BUFFER_IF		0x0008 |  | ||||||
| 
 |  | ||||||
| #define DLCI_VALID_FLAGS	0x000B |  | ||||||
| 
 |  | ||||||
| /* defines for the actual Frame Relay hardware */ |  | ||||||
| #define FRAD_GET_CONF	(SIOCDEVPRIVATE) |  | ||||||
| #define FRAD_SET_CONF	(SIOCDEVPRIVATE + 1) |  | ||||||
| 
 |  | ||||||
| #define FRAD_LAST_IOCTL	FRAD_SET_CONF |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Based on the setup for the Sangoma SDLA.  If changes are  |  | ||||||
|  * necessary to this structure, a routine will need to be  |  | ||||||
|  * added to that module to copy fields. |  | ||||||
|  */ |  | ||||||
| struct frad_conf  |  | ||||||
| { |  | ||||||
|    short station; |  | ||||||
|    short flags; |  | ||||||
|    short kbaud; |  | ||||||
|    short clocking; |  | ||||||
|    short mtu; |  | ||||||
|    short T391; |  | ||||||
|    short T392; |  | ||||||
|    short N391; |  | ||||||
|    short N392; |  | ||||||
|    short N393; |  | ||||||
|    short CIR_fwd; |  | ||||||
|    short Bc_fwd; |  | ||||||
|    short Be_fwd; |  | ||||||
|    short CIR_bwd; |  | ||||||
|    short Bc_bwd; |  | ||||||
|    short Be_bwd; |  | ||||||
| 
 |  | ||||||
| /* Add new fields here, above is a mirror of the sdla_conf */ |  | ||||||
| 
 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #define FRAD_STATION_CPE	0x0000 |  | ||||||
| #define FRAD_STATION_NODE	0x0001 |  | ||||||
| 
 |  | ||||||
| #define FRAD_TX_IGNORE_CIR	0x0001 |  | ||||||
| #define FRAD_RX_ACCOUNT_CIR	0x0002 |  | ||||||
| #define FRAD_DROP_ABORTED	0x0004 |  | ||||||
| #define FRAD_BUFFERIF		0x0008 |  | ||||||
| #define FRAD_STATS		0x0010 |  | ||||||
| #define FRAD_MCI		0x0100 |  | ||||||
| #define FRAD_AUTODLCI		0x8000 |  | ||||||
| #define FRAD_VALID_FLAGS	0x811F |  | ||||||
| 
 |  | ||||||
| #define FRAD_CLOCK_INT		0x0001 |  | ||||||
| #define FRAD_CLOCK_EXT		0x0000 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #endif /* _UAPI_FRAD_H_ */ |  | ||||||
| @ -1,117 +0,0 @@ | |||||||
| /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ |  | ||||||
| /*
 |  | ||||||
|  * INET		An implementation of the TCP/IP protocol suite for the LINUX |  | ||||||
|  *		operating system.  INET is implemented using the  BSD Socket |  | ||||||
|  *		interface as the means of communication with the user level. |  | ||||||
|  * |  | ||||||
|  *		Global definitions for the Frame relay interface. |  | ||||||
|  * |  | ||||||
|  * Version:	@(#)if_ifrad.h	0.20	13 Apr 96 |  | ||||||
|  * |  | ||||||
|  * Author:	Mike McLagan <mike.mclagan@linux.org> |  | ||||||
|  * |  | ||||||
|  * Changes: |  | ||||||
|  *		0.15	Mike McLagan	Structure packing |  | ||||||
|  * |  | ||||||
|  *		0.20	Mike McLagan	New flags for S508 buffer handling |  | ||||||
|  * |  | ||||||
|  *		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. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef _UAPISDLA_H |  | ||||||
| #define _UAPISDLA_H |  | ||||||
| 
 |  | ||||||
| /* adapter type */ |  | ||||||
| #define SDLA_TYPES |  | ||||||
| #define SDLA_S502A			5020 |  | ||||||
| #define SDLA_S502E			5021 |  | ||||||
| #define SDLA_S503			5030 |  | ||||||
| #define SDLA_S507			5070 |  | ||||||
| #define SDLA_S508			5080 |  | ||||||
| #define SDLA_S509			5090 |  | ||||||
| #define SDLA_UNKNOWN			-1 |  | ||||||
| 
 |  | ||||||
| /* port selection flags for the S508 */ |  | ||||||
| #define SDLA_S508_PORT_V35		0x00 |  | ||||||
| #define SDLA_S508_PORT_RS232		0x02 |  | ||||||
| 
 |  | ||||||
| /* Z80 CPU speeds */ |  | ||||||
| #define SDLA_CPU_3M			0x00 |  | ||||||
| #define SDLA_CPU_5M			0x01 |  | ||||||
| #define SDLA_CPU_7M			0x02 |  | ||||||
| #define SDLA_CPU_8M			0x03 |  | ||||||
| #define SDLA_CPU_10M			0x04 |  | ||||||
| #define SDLA_CPU_16M			0x05 |  | ||||||
| #define SDLA_CPU_12M			0x06 |  | ||||||
| 
 |  | ||||||
| /* some private IOCTLs */ |  | ||||||
| #define SDLA_IDENTIFY			(FRAD_LAST_IOCTL + 1) |  | ||||||
| #define SDLA_CPUSPEED			(FRAD_LAST_IOCTL + 2) |  | ||||||
| #define SDLA_PROTOCOL			(FRAD_LAST_IOCTL + 3) |  | ||||||
| 
 |  | ||||||
| #define SDLA_CLEARMEM			(FRAD_LAST_IOCTL + 4) |  | ||||||
| #define SDLA_WRITEMEM			(FRAD_LAST_IOCTL + 5) |  | ||||||
| #define SDLA_READMEM			(FRAD_LAST_IOCTL + 6) |  | ||||||
| 
 |  | ||||||
| struct sdla_mem { |  | ||||||
|    int  addr; |  | ||||||
|    int  len; |  | ||||||
|    void __user *data; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #define SDLA_START			(FRAD_LAST_IOCTL + 7) |  | ||||||
| #define SDLA_STOP			(FRAD_LAST_IOCTL + 8) |  | ||||||
| 
 |  | ||||||
| /* some offsets in the Z80's memory space */ |  | ||||||
| #define SDLA_NMIADDR			0x0000 |  | ||||||
| #define SDLA_CONF_ADDR			0x0010 |  | ||||||
| #define SDLA_S502A_NMIADDR		0x0066 |  | ||||||
| #define SDLA_CODE_BASEADDR		0x0100 |  | ||||||
| #define SDLA_WINDOW_SIZE		0x2000 |  | ||||||
| #define SDLA_ADDR_MASK			0x1FFF |  | ||||||
| 
 |  | ||||||
| /* largest handleable block of data */ |  | ||||||
| #define SDLA_MAX_DATA			4080 |  | ||||||
| #define SDLA_MAX_MTU			4072	/* MAX_DATA - sizeof(fradhdr) */ |  | ||||||
| #define SDLA_MAX_DLCI			24 |  | ||||||
| 
 |  | ||||||
| /* this should be the same as frad_conf */ |  | ||||||
| struct sdla_conf { |  | ||||||
|    short station; |  | ||||||
|    short config; |  | ||||||
|    short kbaud; |  | ||||||
|    short clocking; |  | ||||||
|    short max_frm; |  | ||||||
|    short T391; |  | ||||||
|    short T392; |  | ||||||
|    short N391; |  | ||||||
|    short N392; |  | ||||||
|    short N393; |  | ||||||
|    short CIR_fwd; |  | ||||||
|    short Bc_fwd; |  | ||||||
|    short Be_fwd; |  | ||||||
|    short CIR_bwd; |  | ||||||
|    short Bc_bwd; |  | ||||||
|    short Be_bwd; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /* this should be the same as dlci_conf */ |  | ||||||
| struct sdla_dlci_conf { |  | ||||||
|    short config; |  | ||||||
|    short CIR_fwd; |  | ||||||
|    short Bc_fwd; |  | ||||||
|    short Be_fwd; |  | ||||||
|    short CIR_bwd; |  | ||||||
|    short Bc_bwd; |  | ||||||
|    short Be_bwd;  |  | ||||||
|    short Tc_fwd; |  | ||||||
|    short Tc_bwd; |  | ||||||
|    short Tf_max; |  | ||||||
|    short Tb_max; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #endif /* _UAPISDLA_H */ |  | ||||||
							
								
								
									
										25
									
								
								net/socket.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								net/socket.c
									
									
									
									
									
								
							| @ -64,7 +64,6 @@ | |||||||
| #include <linux/seq_file.h> | #include <linux/seq_file.h> | ||||||
| #include <linux/mutex.h> | #include <linux/mutex.h> | ||||||
| #include <linux/if_bridge.h> | #include <linux/if_bridge.h> | ||||||
| #include <linux/if_frad.h> |  | ||||||
| #include <linux/if_vlan.h> | #include <linux/if_vlan.h> | ||||||
| #include <linux/ptp_classify.h> | #include <linux/ptp_classify.h> | ||||||
| #include <linux/init.h> | #include <linux/init.h> | ||||||
| @ -1027,17 +1026,6 @@ void vlan_ioctl_set(int (*hook) (struct net *, void __user *)) | |||||||
| } | } | ||||||
| EXPORT_SYMBOL(vlan_ioctl_set); | EXPORT_SYMBOL(vlan_ioctl_set); | ||||||
| 
 | 
 | ||||||
| static DEFINE_MUTEX(dlci_ioctl_mutex); |  | ||||||
| static int (*dlci_ioctl_hook) (unsigned int, void __user *); |  | ||||||
| 
 |  | ||||||
| void dlci_ioctl_set(int (*hook) (unsigned int, void __user *)) |  | ||||||
| { |  | ||||||
| 	mutex_lock(&dlci_ioctl_mutex); |  | ||||||
| 	dlci_ioctl_hook = hook; |  | ||||||
| 	mutex_unlock(&dlci_ioctl_mutex); |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(dlci_ioctl_set); |  | ||||||
| 
 |  | ||||||
| static long sock_do_ioctl(struct net *net, struct socket *sock, | static long sock_do_ioctl(struct net *net, struct socket *sock, | ||||||
| 			  unsigned int cmd, unsigned long arg) | 			  unsigned int cmd, unsigned long arg) | ||||||
| { | { | ||||||
| @ -1156,17 +1144,6 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||||||
| 				err = vlan_ioctl_hook(net, argp); | 				err = vlan_ioctl_hook(net, argp); | ||||||
| 			mutex_unlock(&vlan_ioctl_mutex); | 			mutex_unlock(&vlan_ioctl_mutex); | ||||||
| 			break; | 			break; | ||||||
| 		case SIOCADDDLCI: |  | ||||||
| 		case SIOCDELDLCI: |  | ||||||
| 			err = -ENOPKG; |  | ||||||
| 			if (!dlci_ioctl_hook) |  | ||||||
| 				request_module("dlci"); |  | ||||||
| 
 |  | ||||||
| 			mutex_lock(&dlci_ioctl_mutex); |  | ||||||
| 			if (dlci_ioctl_hook) |  | ||||||
| 				err = dlci_ioctl_hook(cmd, argp); |  | ||||||
| 			mutex_unlock(&dlci_ioctl_mutex); |  | ||||||
| 			break; |  | ||||||
| 		case SIOCGSKNS: | 		case SIOCGSKNS: | ||||||
| 			err = -EPERM; | 			err = -EPERM; | ||||||
| 			if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) | 			if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) | ||||||
| @ -3427,8 +3404,6 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock, | |||||||
| 	case SIOCBRDELBR: | 	case SIOCBRDELBR: | ||||||
| 	case SIOCGIFVLAN: | 	case SIOCGIFVLAN: | ||||||
| 	case SIOCSIFVLAN: | 	case SIOCSIFVLAN: | ||||||
| 	case SIOCADDDLCI: |  | ||||||
| 	case SIOCDELDLCI: |  | ||||||
| 	case SIOCGSKNS: | 	case SIOCGSKNS: | ||||||
| 	case SIOCGSTAMP_NEW: | 	case SIOCGSTAMP_NEW: | ||||||
| 	case SIOCGSTAMPNS_NEW: | 	case SIOCGSTAMPNS_NEW: | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user