A simple packet distribution node type that acts like an Ethernet hub.

This commit is contained in:
ru 2004-04-17 12:42:17 +00:00
parent b78e16a878
commit 20bc31e876
8 changed files with 223 additions and 0 deletions

View File

@ -170,6 +170,7 @@ MAN= aac.4 \
ng_h4.4 \
ng_hci.4 \
ng_hole.4 \
ng_hub.4 \
ng_iface.4 \
ng_ip_input.4 \
ng_ksocket.4 \

View File

@ -195,6 +195,8 @@ Example script showing how to set up a bridging network
.Xr bridge 4 ,
.Xr netgraph 4 ,
.Xr ng_ether 4 ,
.Xr ng_hub 4 ,
.Xr ng_one2many 4 ,
.Xr ngctl 8
.Sh HISTORY
The

66
share/man/man4/ng_hub.4 Normal file
View File

@ -0,0 +1,66 @@
.\" Copyright (c) 2004 Ruslan Ermilov
.\" 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.
.\"
.\" $FreeBSD$
.\"
.Dd April 17, 2004
.Dt NG_HUB 4
.Os
.Sh NAME
.Nm ng_hub
.Nd packet distribution netgraph node type
.Sh SYNOPSIS
.In netgraph/ng_hub.h
.Sh DESCRIPTION
The
.Nm hub
node type provides a simple mechanism for distributing packets over
several links.
Packets received on any of the hooks are forwarded out the other hooks.
Packets are not altered in any way.
.Sh HOOKS
A
.Nm hub
node accepts any request to connect, regardless of the hook name,
as long as the name is unique.
.Sh CONTROL MESSAGES
This node type supports only the generic control messages.
.Sh SHUTDOWN
This node shuts down upon receipt of a
.Dv NGM_SHUTDOWN
control message, or when all hooks have been disconnected.
.Sh SEE ALSO
.Xr netgraph 4 ,
.Xr ng_bridge 4 ,
.Xr ng_ether 4 ,
.Xr ng_one2many 4 ,
.Xr ngctl 8 ,
.Xr nghook 8
.Sh HISTORY
The
.Nm
node type appeared in
.Fx 5.3 .
.Sh AUTHORS
.An Ruslan Ermilov Aq ru@FreeBSD.org

View File

@ -228,6 +228,7 @@ A good candidate is Cisco's Etherchannel.
.Xr netgraph 4 ,
.Xr ng_bridge 4 ,
.Xr ng_ether 4 ,
.Xr ng_hub 4 ,
.Xr ngctl 8
.Sh HISTORY
The

View File

@ -17,6 +17,7 @@ SUBDIR= UI \
gif \
gif_demux \
hole \
hub \
iface \
ip_input \
ksocket \

View File

@ -0,0 +1,6 @@
# $FreeBSD$
KMOD= ng_hub
SRCS= ng_hub.c
.include <bsd.kmod.mk>

110
sys/netgraph/ng_hub.c Normal file
View File

@ -0,0 +1,110 @@
/*-
* Copyright (c) 2004 Ruslan Ermilov
* 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.
*
* $FreeBSD$
*/
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/kernel.h>
#include <sys/mbuf.h>
#include <sys/systm.h>
#include <netgraph/ng_message.h>
#include <netgraph/ng_hub.h>
#include <netgraph/netgraph.h>
static ng_constructor_t ng_hub_constructor;
static ng_rcvdata_t ng_hub_rcvdata;
static ng_disconnect_t ng_hub_disconnect;
static struct ng_type ng_hub_typestruct = {
.version = NG_ABI_VERSION,
.name = NG_HUB_NODE_TYPE,
.constructor = ng_hub_constructor,
.rcvdata = ng_hub_rcvdata,
.disconnect = ng_hub_disconnect,
};
NETGRAPH_INIT(hub, &ng_hub_typestruct);
static int
ng_hub_constructor(node_p node)
{
return (0);
}
static int
ng_hub_rcvdata(hook_p hook, item_p item)
{
const node_p node = NG_HOOK_NODE(hook);
int error = 0;
hook_p hook2;
struct mbuf * const m = NGI_M(item), *m2;
meta_p const meta = NGI_META(item);
meta_p meta2;
int nhooks;
if ((nhooks = NG_NODE_NUMHOOKS(node)) == 1) {
NG_FREE_ITEM(item);
return (0);
}
LIST_FOREACH(hook2, &node->nd_hooks, hk_hooks) {
if (hook2 == hook)
continue;
if (--nhooks == 1)
NG_FWD_ITEM_HOOK(error, item, hook2);
else {
if ((m2 = m_dup(m, M_DONTWAIT)) == NULL) {
NG_FREE_ITEM(item);
return (ENOBUFS);
}
if (meta != NULL) {
if ((meta2 = ng_copy_meta(meta)) == NULL) {
m_freem(m2);
NG_FREE_ITEM(item);
return (ENOMEM);
}
} else
meta2 = NULL;
NG_SEND_DATA(error, hook2, m2, meta2);
if (error)
break;
}
}
return (error);
}
static int
ng_hub_disconnect(hook_p hook)
{
if (NG_NODE_NUMHOOKS(NG_HOOK_NODE(hook)) == 0 &&
NG_NODE_IS_VALID(NG_HOOK_NODE(hook)))
ng_rmnode_self(NG_HOOK_NODE(hook));
return (0);
}

36
sys/netgraph/ng_hub.h Normal file
View File

@ -0,0 +1,36 @@
/*-
* Copyright (c) 2004 Ruslan Ermilov
* 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.
*
* $FreeBSD$
*/
#ifndef _NETGRAPH_NG_HUB_H_
#define _NETGRAPH_NG_HUB_H_
/* Node type name and magic cookie. */
#define NG_HUB_NODE_TYPE "hub"
#define NGM_HUB_COOKIE 1082189597
#endif /* _NETGRAPH_NG_HUB_H_ */