aboutsummaryrefslogtreecommitdiff
path: root/sys/netgraph/ng_source.c
diff options
context:
space:
mode:
authorHartmut Brandt <harti@FreeBSD.org>2004-01-26 14:53:16 +0000
committerHartmut Brandt <harti@FreeBSD.org>2004-01-26 14:53:16 +0000
commitf5d15522f7888bf0df38fb6aa494dd6315801832 (patch)
tree22a37c06af7c53e1177738e8fb6fd7cdd16343f4 /sys/netgraph/ng_source.c
parent2cafef3ea4e618ca4702c943f044d86e210aad72 (diff)
downloadsrc-f5d15522f7888bf0df38fb6aa494dd6315801832.tar.gz
src-f5d15522f7888bf0df38fb6aa494dd6315801832.zip
Make ng_source to work with non-ethernet interfaces. We do this by
introducing a START_NOW command. This command does not send and GET_IFINDEX message downstream (to wait for the response from the ETHERNET node), but directly starts the sending process. This allows one to generate traffic as input for any hook on any node.
Notes
Notes: svn path=/head/; revision=125033
Diffstat (limited to 'sys/netgraph/ng_source.c')
-rw-r--r--sys/netgraph/ng_source.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/sys/netgraph/ng_source.c b/sys/netgraph/ng_source.c
index 152699369fed..25f3aa02713f 100644
--- a/sys/netgraph/ng_source.c
+++ b/sys/netgraph/ng_source.c
@@ -189,6 +189,13 @@ static const struct ng_cmdlist ng_source_cmds[] = {
NULL,
NULL
},
+ {
+ NGM_SOURCE_COOKIE,
+ NGM_SOURCE_START_NOW,
+ "start_now",
+ &ng_parse_uint64_type,
+ NULL
+ },
{ 0 }
};
@@ -317,6 +324,30 @@ ng_source_rcvmsg(node_p node, item_p item, hook_p lasthook)
ng_source_start(sc);
}
break;
+ case NGM_SOURCE_START_NOW:
+ {
+ u_int64_t packets = *(u_int64_t *)msg->data;
+ if (sc->output.hook == NULL) {
+ printf("%s: start on node with no output hook\n"
+ , __FUNCTION__);
+ error = EINVAL;
+ break;
+ }
+ if (sc->node->nd_flags & NG_SOURCE_ACTIVE) {
+ error = EBUSY;
+ break;
+ }
+ /* TODO validation of packets */
+ sc->packets = packets;
+ sc->output_ifp = NULL;
+
+ sc->node->nd_flags |= NG_SOURCE_ACTIVE;
+ timevalclear(&sc->stats.elapsedTime);
+ timevalclear(&sc->stats.endTime);
+ getmicrotime(&sc->stats.startTime);
+ sc->intr_ch = timeout(ng_source_intr, sc, 0);
+ }
+ break;
case NGM_SOURCE_STOP:
ng_source_stop(sc);
break;
@@ -600,8 +631,12 @@ ng_source_intr (void *arg)
return;
}
- ifq = &sc->output_ifp->if_snd;
- packets = ifq->ifq_maxlen - ifq->ifq_len;
+ if (sc->output_ifp != NULL) {
+ ifq = &sc->output_ifp->if_snd;
+ packets = ifq->ifq_maxlen - ifq->ifq_len;
+ } else
+ packets = sc->snd_queue.ifq_len;
+
ng_source_send(sc, packets, NULL);
if (sc->packets == 0) {
int s = splnet();