ng_echo.c revision 69922
133965Sjdp
238889Sjdp/*
338889Sjdp * ng_echo.c
433965Sjdp *
533965Sjdp * Copyright (c) 1996-1999 Whistle Communications, Inc.
633965Sjdp * All rights reserved.
733965Sjdp *
833965Sjdp * Subject to the following obligations and disclaimer of warranty, use and
933965Sjdp * redistribution of this software, in source or object code forms, with or
1033965Sjdp * without modifications are expressly permitted by Whistle Communications;
1133965Sjdp * provided, however, that:
1233965Sjdp * 1. Any and all reproductions of the source or object code must include the
1333965Sjdp *    copyright notice above and the following disclaimer of warranties; and
1433965Sjdp * 2. No rights are granted, in any manner or form, to use Whistle
1533965Sjdp *    Communications, Inc. trademarks, including the mark "WHISTLE
1633965Sjdp *    COMMUNICATIONS" on advertising, endorsements, or otherwise except as
1733965Sjdp *    such appears in the above copyright notice or in the software.
1833965Sjdp *
1933965Sjdp * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
2033965Sjdp * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
2133965Sjdp * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
2238889Sjdp * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
2338889Sjdp * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
2438889Sjdp * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
2533965Sjdp * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
2633965Sjdp * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
2733965Sjdp * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
2833965Sjdp * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
2938889Sjdp * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
3038889Sjdp * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
3138889Sjdp * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
3238889Sjdp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3338889Sjdp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3438889Sjdp * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
3538889Sjdp * OF SUCH DAMAGE.
3638889Sjdp *
3738889Sjdp * Author: Julian Elisher <julian@freebsd.org>
3838889Sjdp *
3938889Sjdp * $FreeBSD: head/sys/netgraph/ng_echo.c 69922 2000-12-12 18:52:14Z julian $
4038889Sjdp * $Whistle: ng_echo.c,v 1.13 1999/11/01 09:24:51 julian Exp $
4138889Sjdp */
4238889Sjdp
4338889Sjdp/*
4438889Sjdp * Netgraph "echo" node
4538889Sjdp *
4638889Sjdp * This node simply bounces data and messages back to whence they came.
4738889Sjdp */
4838889Sjdp
4938889Sjdp#include <sys/param.h>
5038889Sjdp#include <sys/kernel.h>
5138889Sjdp#include <sys/malloc.h>
5238889Sjdp#include <sys/mbuf.h>
5338889Sjdp#include <netgraph/ng_message.h>
5438889Sjdp#include <netgraph/netgraph.h>
5538889Sjdp#include <netgraph/ng_echo.h>
5638889Sjdp
5738889Sjdp/* Netgraph methods */
5838889Sjdpstatic ng_rcvmsg_t	nge_rcvmsg;
5938889Sjdpstatic ng_rcvdata_t	nge_rcvdata;
6038889Sjdpstatic ng_disconnect_t	nge_disconnect;
6138889Sjdp
6238889Sjdp/* Netgraph type */
6338889Sjdpstatic struct ng_type typestruct = {
6438889Sjdp	NG_VERSION,
6538889Sjdp	NG_ECHO_NODE_TYPE,
6638889Sjdp	NULL,
6738889Sjdp	NULL,
6838889Sjdp	nge_rcvmsg,
6938889Sjdp	NULL,
7038889Sjdp	NULL,
7138889Sjdp	NULL,
7238889Sjdp	NULL,
7338889Sjdp	nge_rcvdata,
7438889Sjdp	nge_disconnect,
7538889Sjdp	NULL
7638889Sjdp};
7738889SjdpNETGRAPH_INIT(echo, &typestruct);
7838889Sjdp
7938889Sjdp/*
8038889Sjdp * Receive control message. We just bounce it back as a reply.
8138889Sjdp */
8238889Sjdpstatic int
8338889Sjdpnge_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
8438889Sjdp	   struct ng_mesg **rptr, hook_p lasthook)
8538889Sjdp{
8638889Sjdp	if (rptr) {
8738889Sjdp		msg->header.flags |= NGF_RESP;
8838889Sjdp		*rptr = msg;
8938889Sjdp	} else {
9038889Sjdp		FREE(msg, M_NETGRAPH);
9138889Sjdp	}
9238889Sjdp	return (0);
9338889Sjdp}
9438889Sjdp
9538889Sjdp/*
9638889Sjdp * Receive data
9738889Sjdp */
9838889Sjdpstatic int
9938889Sjdpnge_rcvdata(hook_p hook, struct mbuf *m, meta_p meta,
10038889Sjdp		struct mbuf **ret_m, meta_p *ret_meta, struct ng_mesg **resp)
10138889Sjdp{
10238889Sjdp	int error = 0;
10338889Sjdp
10438889Sjdp	NG_SEND_DATA(error, hook, m, meta);
10538889Sjdp	return (error);
10633965Sjdp}
10733965Sjdp
10833965Sjdp/*
10933965Sjdp * Removal of the last link destroys the nodeo
11033965Sjdp */
11133965Sjdpstatic int
11233965Sjdpnge_disconnect(hook_p hook)
11333965Sjdp{
11433965Sjdp	if (hook->node->numhooks == 0)
11533965Sjdp		ng_rmnode(hook->node);
11633965Sjdp	return (0);
11733965Sjdp}
11833965Sjdp
11933965Sjdp