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