git: 79a100e28e3c - main - bluetooth: complete removal of ng_h4

Warner Losh imp at FreeBSD.org
Thu Sep 30 02:00:14 UTC 2021


The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=79a100e28e3c814773bb4c1826cfa25fbe31140e

commit 79a100e28e3c814773bb4c1826cfa25fbe31140e
Author:     Warner Losh <imp at FreeBSD.org>
AuthorDate: 2021-09-05 18:41:16 +0000
Commit:     Warner Losh <imp at FreeBSD.org>
CommitDate: 2021-09-30 02:00:02 +0000

    bluetooth: complete removal of ng_h4
    
    The ng_h4 module was disconnected 13 years ago when the tty later was
    locked by Ed. It completely fails to compile, and has a number of false
    positives for Giant use. Remove it for lack of interest. Bluetooth has
    largely (completely?) moved on from bluetooth over UART transport.
    
    OK'd by:                emax
    Sponsored by:           Netflix
    Differential Revision:  https://reviews.freebsd.org/D31846
---
 ObsoleteFiles.inc                              |    3 +
 share/man/man4/Makefile                        |    1 -
 share/man/man4/netgraph.4                      |    3 +-
 share/man/man4/ng_h4.4                         |  123 ---
 share/man/man5/bluetooth.device.conf.5         |    3 +-
 sys/conf/files                                 |    1 -
 sys/modules/netgraph/bluetooth/h4/Makefile     |   12 -
 sys/netgraph/bluetooth/drivers/h4/TODO         |   13 -
 sys/netgraph/bluetooth/drivers/h4/ng_h4.c      | 1020 ------------------------
 sys/netgraph/bluetooth/drivers/h4/ng_h4_prse.h |  125 ---
 sys/netgraph/bluetooth/drivers/h4/ng_h4_var.h  |  104 ---
 sys/netgraph/bluetooth/include/ng_h4.h         |  114 ---
 12 files changed, 5 insertions(+), 1517 deletions(-)

diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 19e0428a5017..4a0d2fe1b7ea 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -40,6 +40,9 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20210929: Remove ng_h4
+OLD_FILES+=usr/share/man/man4/ng_h4.4.gz
+
 # 20210923: rename boot(9) to kern_reboot(9)
 OLD_FILES+=usr/share/man/man9/boot.9.gz
 
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index 4dad9b11ec22..421de8728a05 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -353,7 +353,6 @@ MAN=	aac.4 \
 	ng_frame_relay.4 \
 	ng_gif.4 \
 	ng_gif_demux.4 \
-	ng_h4.4 \
 	ng_hci.4 \
 	ng_hole.4 \
 	ng_hub.4 \
diff --git a/share/man/man4/netgraph.4 b/share/man/man4/netgraph.4
index 6b850e27762a..bed412193f6b 100644
--- a/share/man/man4/netgraph.4
+++ b/share/man/man4/netgraph.4
@@ -36,7 +36,7 @@
 .\" $Whistle: netgraph.4,v 1.7 1999/01/28 23:54:52 julian Exp $
 .\" $FreeBSD$
 .\"
-.Dd January 9, 2021
+.Dd September 29, 2021
 .Dt NETGRAPH 4
 .Os
 .Sh NAME
@@ -1433,7 +1433,6 @@ common networking problems, solved using
 .Xr ng_frame_relay 4 ,
 .Xr ng_gif 4 ,
 .Xr ng_gif_demux 4 ,
-.Xr ng_h4 4 ,
 .Xr ng_hci 4 ,
 .Xr ng_hole 4 ,
 .Xr ng_hub 4 ,
diff --git a/share/man/man4/ng_h4.4 b/share/man/man4/ng_h4.4
deleted file mode 100644
index bb539a230eba..000000000000
--- a/share/man/man4/ng_h4.4
+++ /dev/null
@@ -1,123 +0,0 @@
-.\" Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin at yahoo.com>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $Id: ng_h4.4,v 1.2 2003/05/21 19:37:35 max Exp $
-.\" $FreeBSD$
-.\"
-.Dd June 14, 2002
-.Dt NG_H4 4
-.Os
-.Sh NAME
-.Nm ng_h4
-.Nd Netgraph node type that is also an H4 line discipline
-.Sh SYNOPSIS
-.In sys/types.h
-.In netgraph/bluetooth/include/ng_h4.h
-.Sh DESCRIPTION
-The
-.Nm h4
-node type is both a persistent Netgraph node type and a H4 line
-discipline.
-It implements a Bluetooth HCI UART transport layer as
-per chapter H4 of the Bluetooth Specification Book v1.1.
-A new node is created when the corresponding line discipline,
-.Dv H4DISC ,
-is registered on a tty device (see
-.Xr tty 4 ) .
-.Pp
-The node has a single hook called
-.Dv hook .
-Incoming bytes received on the tty device are re-assembled into
-HCI frames (according to the length).
-Full HCI frames are sent out on the hook.
-HCI frames received on
-.Dv hook
-are transmitted out on the tty device.
-No modification to the data is performed in either direction.
-While the line discipline is installed on a tty, the normal
-read and write operations are unavailable, returning
-.Er EIO .
-.Pp
-Information about the node is available via the netgraph
-.Xr ioctl 2
-command
-.Dv NGIOCGINFO .
-This command returns a
-.Vt "struct nodeinfo"
-similar to the
-.Dv NGM_NODEINFO
-.Xr netgraph 4
-control message.
-.Sh HOOKS
-This node type supports the following hooks:
-.Bl -tag -width ".Va hook"
-.It Va hook
-single HCI frame contained in single
-.Vt mbuf
-structure.
-.El
-.Sh CONTROL MESSAGES
-This node type supports the generic control messages, plus the following:
-.Bl -tag -width foo
-.It Dv NGM_H4_NODE_RESET
-Reset the node.
-.It Dv NGM_H4_NODE_GET_STATE
-Returns current receiving state for the node.
-.It Dv NGM_H4_NODE_GET_DEBUG
-Returns an integer containing the current debug level for the node.
-.It Dv NGM_H4_NODE_SET_DEBUG
-This command takes an integer argument and sets current debug level
-for the node.
-.It Dv NGM_H4_NODE_GET_QLEN
-Returns current length of outgoing queue for the node.
-.It Dv NGM_H4_NODE_SET_QLEN
-This command takes an integer argument and sets maximum length of
-outgoing queue for the node.
-.It Dv NGM_H4_NODE_GET_STAT
-Returns various statistic information for the node, such as: number of
-bytes (frames) sent, number of bytes (frames) received and number of
-input (output) errors.
-.It Dv NGM_H4_NODE_RESET_STAT
-Reset all statistic counters to zero.
-.El
-.Sh SHUTDOWN
-This node shuts down when the corresponding device is closed
-(or the line discipline is uninstalled on the device).
-.Sh SEE ALSO
-.Xr ioctl 2 ,
-.Xr netgraph 4 ,
-.Xr tty 4 ,
-.Xr ngctl 8
-.Sh HISTORY
-The
-.Nm h4
-node type was implemented in
-.Fx 5.0 .
-.Sh AUTHORS
-.An Maksim Yevmenkin Aq Mt m_evmenkin at yahoo.com
-.Sh BUGS
-This node still uses
-.Xr spltty 9
-to lock tty layer.
-This is wrong.
diff --git a/share/man/man5/bluetooth.device.conf.5 b/share/man/man5/bluetooth.device.conf.5
index 681bbd693146..f2f5bcdc8685 100644
--- a/share/man/man5/bluetooth.device.conf.5
+++ b/share/man/man5/bluetooth.device.conf.5
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 9, 2021
+.Dd September 29, 2021
 .Dt BLUETOOTH.DEVICE.CONF 5
 .Os
 .Sh NAME
@@ -173,7 +173,6 @@ The
 file should be used to specify configuration parameters overrides for the
 second USB Bluetooth device.
 .Sh SEE ALSO
-.Xr ng_h4 4 ,
 .Xr ng_hci 4 ,
 .Xr ng_l2cap 4 ,
 .Xr ng_ubt 4 ,
diff --git a/sys/conf/files b/sys/conf/files
index 828953628eda..fd91666f3718 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -4253,7 +4253,6 @@ netgraph/atm/sscop/ng_sscop.c optional ngatm_sscop \
 netgraph/atm/uni/ng_uni.c	optional ngatm_uni \
 	compile-with "${NORMAL_C} -I$S/contrib/ngatm"
 netgraph/bluetooth/common/ng_bluetooth.c optional netgraph_bluetooth
-netgraph/bluetooth/drivers/h4/ng_h4.c optional netgraph_bluetooth_h4
 netgraph/bluetooth/drivers/ubt/ng_ubt.c optional netgraph_bluetooth_ubt usb
 netgraph/bluetooth/drivers/ubt/ng_ubt_intel.c optional netgraph_bluetooth_ubt usb
 netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c optional netgraph_bluetooth_ubtbcmfw usb
diff --git a/sys/modules/netgraph/bluetooth/h4/Makefile b/sys/modules/netgraph/bluetooth/h4/Makefile
deleted file mode 100644
index 808f44c9dd2c..000000000000
--- a/sys/modules/netgraph/bluetooth/h4/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $Id: Makefile,v 1.1 2002/11/24 20:40:04 max Exp $
-# $FreeBSD$
-
-.PATH: ${SRCTOP}/sys/netgraph/bluetooth/drivers/h4
-
-CFLAGS+=	-I${SRCTOP}/sys/netgraph/bluetooth/include \
-		-I${SRCTOP}/sys/netgraph/bluetooth/drivers/h4
-
-KMOD=		ng_h4
-SRCS=		ng_h4.c
-
-.include <bsd.kmod.mk>
diff --git a/sys/netgraph/bluetooth/drivers/h4/TODO b/sys/netgraph/bluetooth/drivers/h4/TODO
deleted file mode 100644
index 0862688c19d9..000000000000
--- a/sys/netgraph/bluetooth/drivers/h4/TODO
+++ /dev/null
@@ -1,13 +0,0 @@
-$Id: TODO,v 1.2 2004/08/23 18:08:15 max Exp $
-$FreeBSD$
-
-FIXME/TODO list
-
-This is a list of open issues for H4 node
-
-1) Locking/SMP
-
-	External code now uses ng_send_fn to inject data into Netgraph, but
-	i still use splXXX to lock tty level. this is wrong and should be
-	fixed!
-
diff --git a/sys/netgraph/bluetooth/drivers/h4/ng_h4.c b/sys/netgraph/bluetooth/drivers/h4/ng_h4.c
deleted file mode 100644
index 11560b7c6681..000000000000
--- a/sys/netgraph/bluetooth/drivers/h4/ng_h4.c
+++ /dev/null
@@ -1,1020 +0,0 @@
-/*
- * ng_h4.c
- */
-
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin at yahoo.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: ng_h4.c,v 1.10 2005/10/31 17:57:43 max Exp $
- * $FreeBSD$
- * 
- * Based on:
- * ---------
- *
- * FreeBSD: src/sys/netgraph/ng_tty.c
- * Author: Archie Cobbs <archie at freebsd.org>
- *
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/conf.h>
-#include <sys/endian.h>
-#include <sys/errno.h>
-#include <sys/fcntl.h>
-#include <sys/ioccom.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/priv.h>
-#include <sys/socket.h>
-#include <sys/tty.h>
-#include <sys/ttycom.h>
-#include <net/if.h>
-#include <net/if_var.h>
-#include <netgraph/ng_message.h>
-#include <netgraph/netgraph.h>
-#include <netgraph/ng_parse.h>
-#include <netgraph/bluetooth/include/ng_bluetooth.h>
-#include <netgraph/bluetooth/include/ng_hci.h>
-#include <netgraph/bluetooth/include/ng_h4.h>
-#include <netgraph/bluetooth/drivers/h4/ng_h4_var.h>
-#include <netgraph/bluetooth/drivers/h4/ng_h4_prse.h>
-
-/*****************************************************************************
- *****************************************************************************
- ** This node implements a Bluetooth HCI UART transport layer as per chapter
- ** H4 of the Bluetooth Specification Book v1.1. It is a terminal line 
- ** discipline that is also a netgraph node. Installing this line discipline 
- ** on a terminal device instantiates a new netgraph node of this type, which 
- ** allows access to the device via the "hook" hook of the node.
- **
- ** Once the line discipline is installed, you can find out the name of the 
- ** corresponding netgraph node via a NGIOCGINFO ioctl().
- *****************************************************************************
- *****************************************************************************/
-
-/* MALLOC define */
-#ifndef NG_SEPARATE_MALLOC
-MALLOC_DEFINE(M_NETGRAPH_H4, "netgraph_h4", "Netgraph Bluetooth H4 node");
-#else
-#define M_NETGRAPH_H4 M_NETGRAPH
-#endif /* NG_SEPARATE_MALLOC */
-
-/* Line discipline methods */
-static int	ng_h4_open	(struct cdev *, struct tty *);
-static int	ng_h4_close	(struct tty *, int);
-static int	ng_h4_read	(struct tty *, struct uio *, int);
-static int	ng_h4_write	(struct tty *, struct uio *, int);
-static int	ng_h4_input	(int, struct tty *);
-static int	ng_h4_start	(struct tty *);
-static int	ng_h4_ioctl	(struct tty *, u_long, caddr_t, 
-					int, struct thread *);
-
-/* Line discipline descriptor */
-static struct linesw		ng_h4_disc = {
-	ng_h4_open,		/* open */
-	ng_h4_close,		/* close */
-	ng_h4_read,		/* read */
-	ng_h4_write,		/* write */
-	ng_h4_ioctl,		/* ioctl */
-	ng_h4_input,		/* input */
-	ng_h4_start,		/* start */
-	ttymodem		/* modem */
-};
-
-/* Netgraph methods */
-static ng_constructor_t		ng_h4_constructor;
-static ng_rcvmsg_t		ng_h4_rcvmsg;
-static ng_shutdown_t		ng_h4_shutdown;
-static ng_newhook_t		ng_h4_newhook;
-static ng_connect_t		ng_h4_connect;
-static ng_rcvdata_t		ng_h4_rcvdata;
-static ng_disconnect_t		ng_h4_disconnect;
-
-/* Other stuff */
-static void	ng_h4_process_timeout	(node_p, hook_p, void *, int);
-static int	ng_h4_mod_event		(module_t, int, void *);
-
-/* Netgraph node type descriptor */
-static struct ng_type		typestruct = {
-	.version =	NG_ABI_VERSION,
-	.name =		NG_H4_NODE_TYPE,
-	.mod_event =	ng_h4_mod_event,
-	.constructor =	ng_h4_constructor,
-	.rcvmsg =	ng_h4_rcvmsg,
-	.shutdown =	ng_h4_shutdown,
-	.newhook =	ng_h4_newhook,
-	.connect =	ng_h4_connect,
-	.rcvdata =	ng_h4_rcvdata,
-	.disconnect =	ng_h4_disconnect,
-	.cmdlist =	ng_h4_cmdlist
-};
-NETGRAPH_INIT(h4, &typestruct);
-MODULE_VERSION(ng_h4, NG_BLUETOOTH_VERSION);
-
-static int	ng_h4_node = 0;
-
-/*****************************************************************************
- *****************************************************************************
- **			    Line discipline methods
- *****************************************************************************
- *****************************************************************************/
-
-/*
- * Set our line discipline on the tty.
- */
-
-static int
-ng_h4_open(struct cdev *dev, struct tty *tp)
-{
-	struct thread	*td = curthread;
-	char		 name[NG_NODESIZ];
-	ng_h4_info_p	 sc = NULL;
-	int		 error;
-
-	/* Super-user only */
-	error = priv_check(td, PRIV_NETGRAPH_TTY); /* XXX */
-	if (error != 0)
-		return (error);
-
-	/* Initialize private struct */
-	sc = malloc(sizeof(*sc), M_NETGRAPH_H4, M_NOWAIT|M_ZERO);
-	if (sc == NULL)
-		return (ENOMEM);
-
-	sc->tp = tp;
-	sc->debug = NG_H4_WARN_LEVEL;
-
-	sc->state = NG_H4_W4_PKT_IND;
-	sc->want = 1;
-	sc->got = 0;
-
-	mtx_init(&sc->outq.ifq_mtx, "ng_h4 node+queue", NULL, MTX_DEF);
-	IFQ_SET_MAXLEN(&sc->outq, NG_H4_DEFAULTQLEN);
-	ng_callout_init(&sc->timo);
-
-	NG_H4_LOCK(sc);
-
-	/* Setup netgraph node */
-	error = ng_make_node_common(&typestruct, &sc->node);
-	if (error != 0) {
-		NG_H4_UNLOCK(sc);
-
-		printf("%s: Unable to create new node!\n", __func__);
-
-		mtx_destroy(&sc->outq.ifq_mtx);
-		bzero(sc, sizeof(*sc));
-		free(sc, M_NETGRAPH_H4);
-
-		return (error);
-	}
-
-	/* Assign node its name */
-	snprintf(name, sizeof(name), "%s%d", typestruct.name, ng_h4_node ++);
-
-	error = ng_name_node(sc->node, name);
-	if (error != 0) {
-		NG_H4_UNLOCK(sc);
-
-		printf("%s: %s - node name exists?\n", __func__, name);
-
-		NG_NODE_UNREF(sc->node);
-		mtx_destroy(&sc->outq.ifq_mtx);
-		bzero(sc, sizeof(*sc));
-		free(sc, M_NETGRAPH_H4);
-
-		return (error);
-	}
-
-	/* Set back pointers */
-	NG_NODE_SET_PRIVATE(sc->node, sc);
-	tp->t_lsc = (caddr_t) sc;
-
-	/* The node has to be a WRITER because data can change node status */
-	NG_NODE_FORCE_WRITER(sc->node);
-
-	/*
-	 * Pre-allocate cblocks to the an appropriate amount.
-	 * I'm not sure what is appropriate.
-	 */
-
-	ttyflush(tp, FREAD | FWRITE);
-	clist_alloc_cblocks(&tp->t_canq, 0, 0);
-	clist_alloc_cblocks(&tp->t_rawq, 0, 0);
-	clist_alloc_cblocks(&tp->t_outq,
-		MLEN + NG_H4_HIWATER, MLEN + NG_H4_HIWATER);
-
-	NG_H4_UNLOCK(sc);
-
-	return (error);
-} /* ng_h4_open */
-
-/*
- * Line specific close routine, called from device close routine
- * and from ttioctl. This causes the node to be destroyed as well.
- */
-
-static int
-ng_h4_close(struct tty *tp, int flag)
-{
-	ng_h4_info_p	sc = (ng_h4_info_p) tp->t_lsc;
-
-	ttyflush(tp, FREAD | FWRITE);
-	clist_free_cblocks(&tp->t_outq);
-
-	if (sc != NULL) {
-		NG_H4_LOCK(sc);
-
-		if (callout_pending(&sc->timo))
-			ng_uncallout(&sc->timo, sc->node);
-
-		tp->t_lsc = NULL;
-		sc->dying = 1;
-
-		NG_H4_UNLOCK(sc);
-
-		ng_rmnode_self(sc->node);
-	}
-
-	return (0);
-} /* ng_h4_close */
-
-/*
- * Once the device has been turned into a node, we don't allow reading.
- */
-
-static int
-ng_h4_read(struct tty *tp, struct uio *uio, int flag)
-{
-	return (EIO);
-} /* ng_h4_read */
-
-/*
- * Once the device has been turned into a node, we don't allow writing.
- */
-
-static int
-ng_h4_write(struct tty *tp, struct uio *uio, int flag)
-{
-	return (EIO);
-} /* ng_h4_write */
-
-/*
- * We implement the NGIOCGINFO ioctl() defined in ng_message.h.
- */
-
-static int
-ng_h4_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag,
-		struct thread *td)
-{
-	ng_h4_info_p	sc = (ng_h4_info_p) tp->t_lsc;
-	int		error = 0;
-
-	if (sc == NULL)
-		return (ENXIO);
-
-	NG_H4_LOCK(sc);
-
-	switch (cmd) {
-	case NGIOCGINFO:
-#undef	NI
-#define NI(x)	((struct nodeinfo *)(x))
-
-		bzero(data, sizeof(*NI(data)));
-
-		if (NG_NODE_HAS_NAME(sc->node))
-			strncpy(NI(data)->name, NG_NODE_NAME(sc->node), 
-				sizeof(NI(data)->name) - 1);
-
-		strncpy(NI(data)->type, sc->node->nd_type->name, 
-			sizeof(NI(data)->type) - 1);
-
-		NI(data)->id = (u_int32_t) ng_node2ID(sc->node);
-		NI(data)->hooks = NG_NODE_NUMHOOKS(sc->node);
-		break;
-
-	default:
-		error = ENOIOCTL;
-		break;
-	}
-
-	NG_H4_UNLOCK(sc);
-
-	return (error);
-} /* ng_h4_ioctl */
-
-/*
- * Receive data coming from the device. We get one character at a time, which 
- * is kindof silly.
- */
-
-static int
-ng_h4_input(int c, struct tty *tp)
-{
-	ng_h4_info_p	sc = (ng_h4_info_p) tp->t_lsc;
-
-	if (sc == NULL || tp != sc->tp ||
-	    sc->node == NULL || NG_NODE_NOT_VALID(sc->node))
-		return (0);
-
-	NG_H4_LOCK(sc);
-
-	/* Check for error conditions */
-	if ((tp->t_state & TS_CONNECTED) == 0) {
-		NG_H4_INFO("%s: %s - no carrier\n", __func__,
-			NG_NODE_NAME(sc->node));
-
-		sc->state = NG_H4_W4_PKT_IND;
-		sc->want = 1;
-		sc->got = 0;
-
-		NG_H4_UNLOCK(sc);
-
-		return (0); /* XXX Loss of synchronization here! */
-	}
-
-	/* Check for framing error or overrun on this char */
-	if (c & TTY_ERRORMASK) {
-		NG_H4_ERR("%s: %s - line error %#x, c=%#x\n", __func__, 
-			NG_NODE_NAME(sc->node), c & TTY_ERRORMASK,
-			c & TTY_CHARMASK);
-
-		NG_H4_STAT_IERROR(sc->stat);
-
-		sc->state = NG_H4_W4_PKT_IND;
-		sc->want = 1;
-		sc->got = 0;
-
-		NG_H4_UNLOCK(sc);
-
-		return (0); /* XXX Loss of synchronization here! */
-	}
-
-	NG_H4_STAT_BYTES_RECV(sc->stat, 1);
-
-	/* Append char to mbuf */
-	if (sc->got >= sizeof(sc->ibuf)) {
-		NG_H4_ALERT("%s: %s - input buffer overflow, c=%#x, got=%d\n",
-			__func__, NG_NODE_NAME(sc->node), c & TTY_CHARMASK,
-			sc->got);
-
-		NG_H4_STAT_IERROR(sc->stat);
-
-		sc->state = NG_H4_W4_PKT_IND;
-		sc->want = 1;
-		sc->got = 0;
-
-		NG_H4_UNLOCK(sc);
-
-		return (0); /* XXX Loss of synchronization here! */
-	}
-
-	sc->ibuf[sc->got ++] = (c & TTY_CHARMASK);
-
-	NG_H4_INFO("%s: %s - got char %#x, want=%d, got=%d\n", __func__,
-		NG_NODE_NAME(sc->node), c, sc->want, sc->got);
-
-	if (sc->got < sc->want) {
-		NG_H4_UNLOCK(sc);
-
-		return (0); /* Wait for more */
-	}
-
-	switch (sc->state) {
-	/* Got packet indicator */
-	case NG_H4_W4_PKT_IND:
-		NG_H4_INFO("%s: %s - got packet indicator %#x\n", __func__,
-			NG_NODE_NAME(sc->node), sc->ibuf[0]);
-
-		sc->state = NG_H4_W4_PKT_HDR;
-
-		/*
-		 * Since packet indicator included in the packet header
-		 * just set sc->want to sizeof(packet header).
-		 */
-
-		switch (sc->ibuf[0]) {
-		case NG_HCI_ACL_DATA_PKT:
-			sc->want = sizeof(ng_hci_acldata_pkt_t);
-			break;
-
-		case NG_HCI_SCO_DATA_PKT:
-			sc->want = sizeof(ng_hci_scodata_pkt_t);
-			break;
-
-		case NG_HCI_EVENT_PKT:
-			sc->want = sizeof(ng_hci_event_pkt_t);
-			break;
-
-		default:
-			NG_H4_WARN("%s: %s - ignoring unknown packet " \
-				"type=%#x\n", __func__, NG_NODE_NAME(sc->node),
-				sc->ibuf[0]);
-
-			NG_H4_STAT_IERROR(sc->stat);
-
-			sc->state = NG_H4_W4_PKT_IND;
-			sc->want = 1;
-			sc->got = 0;
-			break;
-		}
-		break;
-
-	/* Got packet header */
-	case NG_H4_W4_PKT_HDR:
-		sc->state = NG_H4_W4_PKT_DATA;
-
-		switch (sc->ibuf[0]) {
-		case NG_HCI_ACL_DATA_PKT:
-			c = le16toh(((ng_hci_acldata_pkt_t *)
-				(sc->ibuf))->length);
-			break;
-
-		case NG_HCI_SCO_DATA_PKT:
-			c = ((ng_hci_scodata_pkt_t *)(sc->ibuf))->length;
-			break;
-
-		case NG_HCI_EVENT_PKT:
-			c = ((ng_hci_event_pkt_t *)(sc->ibuf))->length;
-			break;
-
-		default:
-			KASSERT((0), ("Invalid packet type=%#x\n",
-				sc->ibuf[0]));
-			break;
-		}
-
-		NG_H4_INFO("%s: %s - got packet header, packet type=%#x, " \
-			"packet size=%d, payload size=%d\n", __func__, 
-			NG_NODE_NAME(sc->node), sc->ibuf[0], sc->got, c);
-
-		if (c > 0) {
-			sc->want += c;
-
-			/* 
-			 * Try to prevent possible buffer overrun
-			 *
-			 * XXX I'm *really* confused here. It turns out
-			 * that Xircom card sends us packets with length
-			 * greater then 512 bytes! This is greater then
-			 * our old receive buffer (ibuf) size. In the same
-			 * time the card demands from us *not* to send 
-			 * packets greater then 192 bytes. Weird! How the 
-			 * hell i should know how big *receive* buffer 
-			 * should be? For now increase receiving buffer 
-			 * size to 1K and add the following check.
-			 */
-
-			if (sc->want >= sizeof(sc->ibuf)) {
-				int	b;
-
-				NG_H4_ALERT("%s: %s - packet too big for " \
-					"buffer, type=%#x, got=%d, want=%d, " \
-					"length=%d\n", __func__, 
-					NG_NODE_NAME(sc->node), sc->ibuf[0],
-					sc->got, sc->want, c);
-
-				NG_H4_ALERT("Packet header:\n");
-				for (b = 0; b < sc->got; b++)
-					NG_H4_ALERT("%#x ", sc->ibuf[b]);
-				NG_H4_ALERT("\n");
-
-				/* Reset state */
-				NG_H4_STAT_IERROR(sc->stat);
-
-				sc->state = NG_H4_W4_PKT_IND;
-				sc->want = 1;
-				sc->got = 0;
-			}
-
-			break;
-		}
-
-		/* else FALLTHROUGH and deliver frame */
-		/* XXX Is this true? Should we deliver empty frame? */
-
-	/* Got packet data */
-	case NG_H4_W4_PKT_DATA:
-		NG_H4_INFO("%s: %s - got full packet, packet type=%#x, " \
-			"packet size=%d\n", __func__,
-			NG_NODE_NAME(sc->node), sc->ibuf[0], sc->got);
-
-		if (sc->hook != NULL && NG_HOOK_IS_VALID(sc->hook)) {
-			struct mbuf	*m = NULL;
-
-			MGETHDR(m, M_NOWAIT, MT_DATA);
-			if (m != NULL) {
-				m->m_pkthdr.len = 0;
-
-				/* XXX m_copyback() is stupid */
-				m->m_len = min(MHLEN, sc->got);
-
-				m_copyback(m, 0, sc->got, sc->ibuf);
-				NG_SEND_DATA_ONLY(c, sc->hook, m);
-			} else {
-				NG_H4_ERR("%s: %s - could not get mbuf\n",
-					__func__, NG_NODE_NAME(sc->node));
-
-				NG_H4_STAT_IERROR(sc->stat);
-			}
-		}
-
-		sc->state = NG_H4_W4_PKT_IND;
-		sc->want = 1;
-		sc->got = 0;
-
-		NG_H4_STAT_PCKTS_RECV(sc->stat);
-		break;
-
-	default:
-		KASSERT((0), ("Invalid H4 node state=%d", sc->state));
-		break;
-	}
-
-	NG_H4_UNLOCK(sc);
-
-	return (0);
-} /* ng_h4_input */
-
-/*
- * This is called when the device driver is ready for more output. Called from 
- * tty system. 
- */
-
-static int
-ng_h4_start(struct tty *tp)
-{
-	ng_h4_info_p	 sc = (ng_h4_info_p) tp->t_lsc;
-	struct mbuf	*m = NULL;
-	int		 size;
-
-	if (sc == NULL || tp != sc->tp || 
-	    sc->node == NULL || NG_NODE_NOT_VALID(sc->node))
-		return (0);
-
-#if 0
-	while (tp->t_outq.c_cc < NG_H4_HIWATER) { /* XXX 2.2 specific ? */
-#else
-	while (1) {
-#endif
-		/* Remove first mbuf from queue */
-		IF_DEQUEUE(&sc->outq, m);
-		if (m == NULL)
-			break;
-
-		/* Send as much of it as possible */
-		while (m != NULL) {
-			size = m->m_len - b_to_q(mtod(m, u_char *),
-					m->m_len, &tp->t_outq);
-
-			NG_H4_LOCK(sc);
-			NG_H4_STAT_BYTES_SENT(sc->stat, size);
-			NG_H4_UNLOCK(sc);
-
-			m->m_data += size;
-			m->m_len -= size;
-			if (m->m_len > 0)
-				break;	/* device can't take no more */
-
-			m = m_free(m);
-		}
-
-		/* Put remainder of mbuf chain (if any) back on queue */
-		if (m != NULL) {
-			IF_PREPEND(&sc->outq, m);
-			break;
-		}
-
-		/* Full packet has been sent */
-		NG_H4_LOCK(sc);
-		NG_H4_STAT_PCKTS_SENT(sc->stat);
-		NG_H4_UNLOCK(sc);
-	}
-
-	/* 
-	 * Call output process whether or not there is any output. We are
-	 * being called in lieu of ttstart and must do what it would.
-	 */
-
-	tt_oproc(sc->tp);
-
-	/*
-	 * This timeout is needed for operation on a pseudo-tty, because the
-	 * pty code doesn't call pppstart after it has drained the t_outq.
-	 */
-
-	NG_H4_LOCK(sc);
-
-	if (!IFQ_IS_EMPTY(&sc->outq) && !callout_pending(&sc->timo))
-		ng_callout(&sc->timo, sc->node, NULL, 1,
-			ng_h4_process_timeout, NULL, 0);
-
-	NG_H4_UNLOCK(sc);
-
-	return (0);
-} /* ng_h4_start */
-
-/*****************************************************************************
- *****************************************************************************
- **			    Netgraph node methods
- *****************************************************************************
- *****************************************************************************/
-
-/*
- * Initialize a new node of this type. We only allow nodes to be created as 
- * a result of setting the line discipline on a tty, so always return an error
- * if not.
- */
-
-static int
-ng_h4_constructor(node_p node)
-{
-	return (EOPNOTSUPP);
-} /* ng_h4_constructor */
-
-/*
- * Add a new hook. There can only be one.
- */
-
-static int
-ng_h4_newhook(node_p node, hook_p hook, const char *name)
-{
-	ng_h4_info_p	sc = (ng_h4_info_p) NG_NODE_PRIVATE(node);
-
-	if (strcmp(name, NG_H4_HOOK) != 0)
-		return (EINVAL);
-
-	NG_H4_LOCK(sc);
-
-	if (sc->hook != NULL) {
-		NG_H4_UNLOCK(sc);
-		return (EISCONN);
-	}
-	sc->hook = hook;
-
-	NG_H4_UNLOCK(sc);
-
-	return (0);
-} /* ng_h4_newhook */
-
-/*
- * Connect hook. Just say yes.
- */
-
-static int
-ng_h4_connect(hook_p hook)
-{
-	ng_h4_info_p	sc = (ng_h4_info_p) NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
-
-	if (hook != sc->hook)
-		panic("%s: hook != sc->hook\n", __func__);
-
-	NG_HOOK_FORCE_QUEUE(NG_HOOK_PEER(hook));
-	NG_HOOK_FORCE_QUEUE(hook);
-
-	return (0);
*** 681 LINES SKIPPED ***


More information about the dev-commits-src-all mailing list