summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>1999-11-05 02:18:08 +0000
committerjulian <julian@FreeBSD.org>1999-11-05 02:18:08 +0000
commitf3be8b4e84953c69305f0c048a260a0d4ab83f71 (patch)
tree74ca5f49021d9864519ed64d34f586f71760d92c /sys
parent034b0d2ccc94f20f14ffbbd93863ec6e8db5b4f8 (diff)
downloadFreeBSD-src-f3be8b4e84953c69305f0c048a260a0d4ab83f71.zip
FreeBSD-src-f3be8b4e84953c69305f0c048a260a0d4ab83f71.tar.gz
Add the option for a socket node to shut down when the last hook
to an adjoining node is removed. Also move file scope definitions back within the file, and remove un-needed include file.
Diffstat (limited to 'sys')
-rw-r--r--sys/netgraph/ng_socket.c57
-rw-r--r--sys/netgraph/ng_socket.h8
-rw-r--r--sys/netgraph/ng_socketvar.h63
3 files changed, 63 insertions, 65 deletions
diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
index a8cb703..87538bc 100644
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -69,7 +69,6 @@
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <netgraph/ng_socket.h>
-#include <netgraph/ng_socketvar.h>
/*
* It's Ascii-art time!
@@ -97,12 +96,31 @@
* +----------------+
*/
+/* Netgraph protocol control block for each socket */
+struct ngpcb {
+ struct socket *ng_socket; /* the socket */
+ struct ngsock *sockdata; /* netgraph info */
+ LIST_ENTRY(ngpcb) socks; /* linked list of sockets */
+ int type; /* NG_CONTROL or NG_DATA */
+};
+
+/* Per-node private data */
+struct ngsock {
+ struct ng_node *node; /* the associated netgraph node */
+ struct ngpcb *datasock; /* optional data socket */
+ struct ngpcb *ctlsock; /* optional control socket */
+ int flags;
+ int refs;
+};
+#define NGS_FLAG_NOLINGER 1 /* close with last hook */
+
/* Netgraph node methods */
static ng_constructor_t ngs_constructor;
static ng_rcvmsg_t ngs_rcvmsg;
static ng_shutdown_t ngs_rmnode;
static ng_newhook_t ngs_newhook;
static ng_rcvdata_t ngs_rcvdata;
+static ng_disconnect_t ngs_disconnect;
/* Internal methods */
static int ng_attach_data(struct socket *so);
@@ -132,7 +150,7 @@ static struct ng_type typestruct = {
NULL,
ngs_rcvdata,
ngs_rcvdata,
- NULL,
+ ngs_disconnect
};
NETGRAPH_INIT(socket, &typestruct);
@@ -706,6 +724,7 @@ ngs_newhook(node_p node, hook_p hook, const char *name)
/*
* Incoming messages get passed up to the control socket.
+ * Unless they are for us specifically (socket_type)
*/
static int
ngs_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
@@ -724,6 +743,22 @@ ngs_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
return (EINVAL);
}
+ if (msg->header.typecookie == NGM_SOCKET_COOKIE) {
+ switch (msg->header.cmd) {
+ case NGM_SOCK_CMD_NOLINGER:
+ sockdata->flags |= NGS_FLAG_NOLINGER;
+ break;
+ case NGM_SOCK_CMD_LINGER:
+ sockdata->flags &= ~NGS_FLAG_NOLINGER;
+ break;
+ default:
+ error = EINVAL; /* unknown command */
+ }
+ /* Free the message and return */
+ FREE(msg, M_NETGRAPH);
+ return(error);
+
+ }
/* Get the return address into a sockaddr */
if ((retaddr == NULL) || (*retaddr == '\0'))
retaddr = "";
@@ -786,6 +821,24 @@ ngs_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
}
/*
+ * Dook disconnection
+ *
+ * For this type, removal of the last link destroys the node
+ * if the NOLINGER flag is set.
+ */
+static int
+ngs_disconnect(hook_p hook)
+{
+ struct ngsock *const sockdata = hook->node->private;
+
+ if ((sockdata->flags & NGS_FLAG_NOLINGER )
+ && (hook->node->numhooks == 0)) {
+ ng_rmnode(hook->node);
+ }
+ return (0);
+}
+
+/*
* Do local shutdown processing.
* In this case, that involves making sure the socket
* knows we should be shutting down.
diff --git a/sys/netgraph/ng_socket.h b/sys/netgraph/ng_socket.h
index a84d12a..1aacdf3 100644
--- a/sys/netgraph/ng_socket.h
+++ b/sys/netgraph/ng_socket.h
@@ -51,6 +51,14 @@
#define NG_DATA 1
#define NG_CONTROL 2
+/* Commands */
+enum {
+ NGM_SOCK_CMD_NOLINGER = 1, /* close the soket on with last hook */
+ NGM_SOCK_CMD_LINGER /* Keep socket even if 0 hooks */
+};
+
+
+
/* Netgraph version of struct sockaddr */
struct sockaddr_ng {
u_char sg_len; /* total length */
diff --git a/sys/netgraph/ng_socketvar.h b/sys/netgraph/ng_socketvar.h
deleted file mode 100644
index 5451524..0000000
--- a/sys/netgraph/ng_socketvar.h
+++ /dev/null
@@ -1,63 +0,0 @@
-
-/*
- * netgraph.h
- *
- * Copyright (c) 1996-1999 Whistle Communications, Inc.
- * All rights reserved.
- *
- * Subject to the following obligations and disclaimer of warranty, use and
- * redistribution of this software, in source or object code forms, with or
- * without modifications are expressly permitted by Whistle Communications;
- * provided, however, that:
- * 1. Any and all reproductions of the source or object code must include the
- * copyright notice above and the following disclaimer of warranties; and
- * 2. No rights are granted, in any manner or form, to use Whistle
- * Communications, Inc. trademarks, including the mark "WHISTLE
- * COMMUNICATIONS" on advertising, endorsements, or otherwise except as
- * such appears in the above copyright notice or in the software.
- *
- * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
- * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
- * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
- * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
- * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
- * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
- * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
- * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
- * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
- * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER 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 WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Julian Elischer <julian@whistle.com>
- *
- * $FreeBSD$
- * $Whistle: ng_socketvar.h,v 1.1 1999/01/20 21:35:39 archie Exp $
- */
-
-#ifndef _NETGRAPH_NG_SOCKETVAR_H_
-#define _NETGRAPH_NG_SOCKETVAR_H_ 1
-
-/* Netgraph protocol control block for each socket */
-struct ngpcb {
- struct socket *ng_socket; /* the socket */
- struct ngsock *sockdata; /* netgraph info */
- LIST_ENTRY(ngpcb) socks; /* linked list of sockets */
- int type; /* NG_CONTROL or NG_DATA */
-};
-
-/* Per-node private data */
-struct ngsock {
- struct ng_node *node; /* the associated netgraph node */
- struct ngpcb *datasock; /* optional data socket */
- struct ngpcb *ctlsock; /* optional control socket */
- int refs;
-};
-
-#endif /* _NETGRAPH_NG_SOCKETVAR_H_ */
-
OpenPOWER on IntegriCloud