summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_source.c
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2002-11-02 02:29:43 +0000
committerjulian <julian@FreeBSD.org>2002-11-02 02:29:43 +0000
commit51d9ccf8413aff3495d50269a8e5584c03016e66 (patch)
tree632a356636d21288d1005df1fd4065ada9a55f5d /sys/netgraph/ng_source.c
parentd3f9b77bdaef0828c3ba0e631c0ff414f012f2af (diff)
downloadFreeBSD-src-51d9ccf8413aff3495d50269a8e5584c03016e66.zip
FreeBSD-src-51d9ccf8413aff3495d50269a8e5584c03016e66.tar.gz
The easy part of converting the ng_source node to -current.
More to come.. does not compile (deliberatly.. logic broken)
Diffstat (limited to 'sys/netgraph/ng_source.c')
-rw-r--r--sys/netgraph/ng_source.c104
1 files changed, 50 insertions, 54 deletions
diff --git a/sys/netgraph/ng_source.c b/sys/netgraph/ng_source.c
index 81b043a..0d3a815 100644
--- a/sys/netgraph/ng_source.c
+++ b/sys/netgraph/ng_source.c
@@ -202,7 +202,6 @@ static struct ng_type ng_source_typestruct = {
NULL, /* findhook */
NULL,
ng_source_rcvdata, /* rcvdata */
- ng_source_rcvdata, /* rcvdataq */
ng_source_disconnect,
ng_source_cmds
};
@@ -212,24 +211,20 @@ NETGRAPH_INIT(source, &ng_source_typestruct);
* Node constructor
*/
static int
-ng_source_constructor(node_p *nodep)
+ng_source_constructor(node_p node)
{
sc_p sc;
- int error = 0;
MALLOC(sc, sc_p, sizeof(*sc), M_NETGRAPH, M_NOWAIT);
if (sc == NULL)
return (ENOMEM);
bzero(sc, sizeof(*sc));
- if ((error = ng_make_node_common(&ng_source_typestruct, nodep))) {
- FREE(sc, M_NETGRAPH);
- return (error);
- }
- (*nodep)->private = sc;
- sc->node = *nodep;
+ NG_NODE_SET_PRIVATE(node, sc);
+ sc->node = node;
sc->snd_queue.ifq_maxlen = 2048; /* XXX not checked */
- callout_handle_init(&sc->intr_ch);
+ callout_handle_init(&sc->intr_ch); /* XXX fix.. will
+ cause problems. */
return (0);
}
@@ -239,15 +234,16 @@ ng_source_constructor(node_p *nodep)
static int
ng_source_newhook(node_p node, hook_p hook, const char *name)
{
- const sc_p sc = node->private;
+ sc_p sc;
+ sc = NG_NODE_PRIVATE(node);
KASSERT(sc != NULL, ("%s: null node private", __FUNCTION__));
if (strcmp(name, NG_SOURCE_HOOK_INPUT) == 0) {
sc->input.hook = hook;
- hook->private = &sc->input;
+ NG_HOOK_SET_PRIVATE(hook, &sc->input);
} else if (strcmp(name, NG_SOURCE_HOOK_OUTPUT) == 0) {
sc->output.hook = hook;
- hook->private = &sc->output;
+ NG_HOOK_SET_PRIVATE(hook, &sc->output);
sc->output_ifp = 0;
bzero(&sc->stats, sizeof(sc->stats));
} else
@@ -259,13 +255,15 @@ ng_source_newhook(node_p node, hook_p hook, const char *name)
* Receive a control message
*/
static int
-ng_source_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
- struct ng_mesg **rptr)
+ng_source_rcvmsg(node_p node, item_p item, hook_p lasthook)
{
- const sc_p sc = node->private;
+ sc_p sc;
struct ng_mesg *resp = NULL;
int error = 0;
+ struct ng_mesg *msg;
+ sc = NG_NODE_PRIVATE(node);
+ NGI_GET_MSG(item, msg);
KASSERT(sc != NULL, ("%s: null node private", __FUNCTION__));
switch (msg->header.typecookie) {
case NGM_SOURCE_COOKIE:
@@ -285,7 +283,7 @@ ng_source_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
}
sc->stats.queueOctets = sc->queueOctets;
sc->stats.queueFrames = sc->snd_queue.ifq_len;
- if ((sc->node->flags & NG_SOURCE_ACTIVE)
+ if ((sc->node->nd_flags & NG_SOURCE_ACTIVE)
&& !timevalisset(&sc->stats.endTime)) {
getmicrotime(&sc->stats.elapsedTime);
timevalsub(&sc->stats.elapsedTime,
@@ -327,13 +325,12 @@ ng_source_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
error = EINVAL;
break;
}
- if (rptr)
- *rptr = resp;
- else if (resp)
- FREE(resp, M_NETGRAPH);
done:
- FREE(msg, M_NETGRAPH);
+ /* Take care of synchronous response, if any */
+ NG_RESPOND_MSG(error, node, item, resp);
+ /* Free the message and return */
+ NG_FREE_MSG(msg);
return (error);
}
@@ -344,33 +341,34 @@ done:
* If data comes in the output hook, discard it.
*/
static int
-ng_source_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
+ng_source_rcvdata(hook_p hook, item_p item)
{
- const sc_p sc = hook->node->private;
- struct source_hookinfo *const hinfo;
+ sc_p sc;
+ struct source_hookinfo *hinfo;
int error = 0;
+ struct mbuf *m;
- hinfo = (struct source_hookinfo *) hook->private;
+ sc = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
+ NGI_GET_M(item, m);
+ NG_FREE_ITEM(item);
+ hinfo = NG_HOOK_PRIVATE(hook);
KASSERT(sc != NULL, ("%s: null node private", __FUNCTION__));
KASSERT(hinfo != NULL, ("%s: null hook info", __FUNCTION__));
/* Which hook? */
if (hinfo == &sc->output) {
/* discard */
- NG_FREE_DATA(m, meta);
+ NG_FREE_M(m);
return (error);
}
KASSERT(hinfo == &sc->input, ("%s: no hook!", __FUNCTION__));
if ((m->m_flags & M_PKTHDR) == 0) {
printf("%s: mbuf without PKTHDR\n", __FUNCTION__);
- NG_FREE_DATA(m, meta);
+ NG_FREE_M(m);
return (EINVAL);
}
- /* XXX we discard the meta data for now */
- NG_FREE_META(meta);
-
/* enque packet */
/* XXX should we check IF_QFULL() ? */
IF_ENQUEUE(&sc->snd_queue, m);
@@ -385,16 +383,15 @@ ng_source_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
static int
ng_source_rmnode(node_p node)
{
- const sc_p sc = node->private;
+ sc_p sc;
+ sc = NG_NODE_PRIVATE(node);
KASSERT(sc != NULL, ("%s: null node private", __FUNCTION__));
- node->flags |= NG_INVALID;
+ node->nd_flags |= NG_INVALID;
ng_source_stop(sc);
- ng_cutlinks(node);
ng_source_clr_data(sc);
- ng_unname(node);
- node->private = NULL;
- ng_unref(sc->node);
+ NG_NODE_SET_PRIVATE(node, NULL);
+ NG_NODE_UNREF(node);
FREE(sc, M_NETGRAPH);
return (0);
}
@@ -405,15 +402,15 @@ ng_source_rmnode(node_p node)
static int
ng_source_disconnect(hook_p hook)
{
- struct source_hookinfo *const hinfo;
+ struct source_hookinfo *hinfo;
sc_p sc;
- hinfo = (struct source_hookinfo *) hook->private;
- sc = (sc_p) hinfo->hook->node->private;
+ hinfo = NG_HOOK_PRIVATE(hook);
+ sc = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
KASSERT(sc != NULL, ("%s: null node private", __FUNCTION__));
hinfo->hook = NULL;
- if (hook->node->numhooks == 0 || hinfo == &sc->output)
- ng_rmnode(hook->node);
+ if (NG_NODE_NUMHOOKS(NG_HOOK_NODE(hook)) == 0 || hinfo == &sc->output)
+ ng_rmnode_self(NG_HOOK_NODE(hook));
return (0);
}
@@ -437,7 +434,9 @@ ng_source_get_output_ifp(sc_p sc)
if (msg == NULL)
return (ENOBUFS);
- error = ng_send_msg(sc->node, msg, NG_SOURCE_HOOK_OUTPUT, &rsp);
+ NG_SEND_MSG_HOOK(error, sc->node, msg, sc->output.hook, NULL);
+ /* error = ng_send_msg(sc->node, msg, NG_SOURCE_HOOK_OUTPUT, &rsp); */
+#warn "oiks"
if (error != 0)
return (error);
@@ -496,7 +495,7 @@ ng_source_set_autosrc(sc_p sc, u_int32_t flag)
return(ENOBUFS);
*(u_int32_t *)msg->data = flag;
- error = ng_send_msg(sc->node, msg, NG_SOURCE_HOOK_OUTPUT, NULL);
+ NG_SEND_MSG_HOOK(error, sc->node, msg, sc->output.hook, NULL);
return (error);
}
@@ -508,7 +507,6 @@ ng_source_clr_data (sc_p sc)
{
struct mbuf *m;
- SPLASSERT(net, __FUNCTION__);
for (;;) {
IF_DEQUEUE(&sc->snd_queue, m);
if (m == NULL)
@@ -524,14 +522,13 @@ ng_source_clr_data (sc_p sc)
static void
ng_source_start (sc_p sc)
{
- SPLASSERT(net, __FUNCTION__);
KASSERT(sc->output.hook != NULL,
("%s: output hook unconnected", __FUNCTION__));
- if ((sc->node->flags & NG_SOURCE_ACTIVE) == 0) {
+ if ((sc->node->nd_flags & NG_SOURCE_ACTIVE) == 0) {
if (sc->output_ifp == NULL && ng_source_get_output_ifp(sc) != 0)
return;
ng_source_set_autosrc(sc, 0);
- sc->node->flags |= NG_SOURCE_ACTIVE;
+ sc->node->nd_flags |= NG_SOURCE_ACTIVE;
timevalclear(&sc->stats.elapsedTime);
timevalclear(&sc->stats.endTime);
getmicrotime(&sc->stats.startTime);
@@ -545,10 +542,9 @@ ng_source_start (sc_p sc)
static void
ng_source_stop (sc_p sc)
{
- SPLASSERT(net, __FUNCTION__);
- if (sc->node->flags & NG_SOURCE_ACTIVE) {
+ if (sc->node->nd_flags & NG_SOURCE_ACTIVE) {
untimeout(ng_source_intr, sc, sc->intr_ch);
- sc->node->flags &= ~NG_SOURCE_ACTIVE;
+ sc->node->nd_flags &= ~NG_SOURCE_ACTIVE;
getmicrotime(&sc->stats.endTime);
sc->stats.elapsedTime = sc->stats.endTime;
timevalsub(&sc->stats.elapsedTime, &sc->stats.startTime);
@@ -565,7 +561,7 @@ ng_source_stop (sc_p sc)
static void
ng_source_intr (void *arg)
{
- const sc_p sc = (sc_p) arg;
+ sc_p sc = (sc_p) arg;
struct ifqueue *ifq;
int packets;
@@ -573,7 +569,7 @@ ng_source_intr (void *arg)
callout_handle_init(&sc->intr_ch);
if (sc->packets == 0 || sc->output.hook == NULL
- || (sc->node->flags & NG_SOURCE_ACTIVE) == 0) {
+ || (sc->node->nd_flags & NG_SOURCE_ACTIVE) == 0) {
ng_source_stop(sc);
return;
}
@@ -603,7 +599,7 @@ ng_source_send (sc_p sc, int tosend, int *sent_p)
KASSERT(sc != NULL, ("%s: null node private", __FUNCTION__));
KASSERT(tosend >= 0, ("%s: negative tosend param", __FUNCTION__));
- KASSERT(sc->node->flags & NG_SOURCE_ACTIVE,
+ KASSERT(sc->node->nd_flags & NG_SOURCE_ACTIVE,
("%s: inactive node", __FUNCTION__));
if ((u_int64_t)tosend > sc->packets)
OpenPOWER on IntegriCloud