summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/netgraph/ng_vjc.c170
-rw-r--r--sys/netgraph/ng_vjc.h14
2 files changed, 177 insertions, 7 deletions
diff --git a/sys/netgraph/ng_vjc.c b/sys/netgraph/ng_vjc.c
index 8667b2b..e3efc17 100644
--- a/sys/netgraph/ng_vjc.c
+++ b/sys/netgraph/ng_vjc.c
@@ -55,6 +55,7 @@
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
+#include <netgraph/ng_parse.h>
#include <netgraph/ng_vjc.h>
#include <netinet/in.h>
@@ -96,8 +97,131 @@ static ng_disconnect_t ng_vjc_disconnect;
/* Helper stuff */
static struct mbuf *ng_vjc_pulluphdrs(struct mbuf *m, int knownTCP);
+/* Parse type for struct ngm_vjc_config */
+static const struct ng_parse_struct_info ng_vjc_config_type_info
+ = NG_VJC_CONFIG_TYPE_INFO;
+static const struct ng_parse_type ng_vjc_config_type = {
+ &ng_parse_struct_type,
+ &ng_vjc_config_type_info
+};
+
+/* Parse type for the 'last_cs' and 'cs_next' fields in struct slcompress,
+ which are pointers converted to integer indices, so parse them that way. */
+#if _MACHINE_ARCH == i386
+#define NG_VJC_TSTATE_PTR_TYPE &ng_parse_uint32_type
+#elif _MACHINE_ARCH == alpha
+#define NG_VJC_TSTATE_PTR_TYPE &ng_parse_uint64_type
+#else
+#error Unspported _MACHINE_ARCH
+#endif
+
+/* Parse type for the 'cs_hdr' field in a struct cstate. Ideally we would
+ like to use a 'struct ip' type instead of a simple array of bytes. */
+static const struct ng_parse_fixedarray_info ng_vjc_cs_hdr_type_info = {
+ &ng_parse_hint8_type,
+ MAX_HDR
+};
+static const struct ng_parse_type ng_vjc_cs_hdr_type = {
+ &ng_parse_fixedarray_type,
+ &ng_vjc_cs_hdr_type_info
+};
+
+/* Parse type for a struct cstate */
+static const struct ng_parse_struct_info ng_vjc_cstate_type_info = {
+ {
+ { "cs_next", NG_VJC_TSTATE_PTR_TYPE },
+ { "cs_hlen", &ng_parse_uint16_type },
+ { "cs_id", &ng_parse_uint8_type },
+ { "cs_filler", &ng_parse_uint8_type },
+ { "cs_hdr", &ng_vjc_cs_hdr_type },
+ { NULL },
+ }
+};
+static const struct ng_parse_type ng_vjc_cstate_type = {
+ &ng_parse_struct_type,
+ &ng_vjc_cstate_type_info
+};
+
+/* Parse type for an array of MAX_STATES struct cstate's, ie, tstate & rstate */
+static const struct ng_parse_fixedarray_info ng_vjc_cstatearray_type_info = {
+ &ng_vjc_cstate_type,
+ MAX_STATES
+};
+static const struct ng_parse_type ng_vjc_cstatearray_type = {
+ &ng_parse_fixedarray_type,
+ &ng_vjc_cstatearray_type_info
+};
+
+/* Parse type for struct slcompress. Keep this in sync with the
+ definition of struct slcompress defined in <net/slcompress.h> */
+static const struct ng_parse_struct_info ng_vjc_slcompress_type_info = {
+ {
+ { "last_cs", NG_VJC_TSTATE_PTR_TYPE },
+ { "last_recv", &ng_parse_uint8_type },
+ { "last_xmit", &ng_parse_uint8_type },
+ { "flags", &ng_parse_hint16_type },
+#ifndef SL_NO_STATS
+ { "sls_packets", &ng_parse_uint32_type },
+ { "sls_compressed", &ng_parse_uint32_type },
+ { "sls_searches", &ng_parse_uint32_type },
+ { "sls_misses", &ng_parse_uint32_type },
+ { "sls_uncompressedin", &ng_parse_uint32_type },
+ { "sls_compressedin", &ng_parse_uint32_type },
+ { "sls_errorin", &ng_parse_uint32_type },
+ { "sls_tossed", &ng_parse_uint32_type },
+#endif
+ { "tstate", &ng_vjc_cstatearray_type },
+ { "rstate", &ng_vjc_cstatearray_type },
+ { NULL },
+ }
+};
+static const struct ng_parse_type ng_vjc_slcompress_type = {
+ &ng_parse_struct_type,
+ &ng_vjc_slcompress_type_info
+};
+
+/* List of commands and how to convert arguments to/from ASCII */
+static const struct ng_cmdlist ng_vjc_cmds[] = {
+ {
+ NGM_VJC_COOKIE,
+ NGM_VJC_SET_CONFIG,
+ "setconfig",
+ &ng_vjc_config_type,
+ NULL
+ },
+ {
+ NGM_VJC_COOKIE,
+ NGM_VJC_GET_CONFIG,
+ "getconfig",
+ NULL,
+ &ng_vjc_config_type,
+ },
+ {
+ NGM_VJC_COOKIE,
+ NGM_VJC_GET_STATE,
+ "getstate",
+ NULL,
+ &ng_vjc_slcompress_type,
+ },
+ {
+ NGM_VJC_COOKIE,
+ NGM_VJC_CLR_STATS,
+ "clrstats",
+ NULL,
+ NULL,
+ },
+ {
+ NGM_VJC_COOKIE,
+ NGM_VJC_RECV_ERROR,
+ "recverror",
+ NULL,
+ NULL,
+ },
+ { 0 }
+};
+
/* Node type descriptor */
-static struct ng_type typestruct = {
+static struct ng_type ng_vjc_typestruct = {
NG_VERSION,
NG_VJC_NODE_TYPE,
NULL,
@@ -110,9 +234,9 @@ static struct ng_type typestruct = {
ng_vjc_rcvdata,
ng_vjc_rcvdata,
ng_vjc_disconnect,
- NULL
+ ng_vjc_cmds
};
-NETGRAPH_INIT(vjc, &typestruct);
+NETGRAPH_INIT(vjc, &ng_vjc_typestruct);
/************************************************************************
NETGRAPH NODE METHODS
@@ -134,7 +258,7 @@ ng_vjc_constructor(node_p *nodep)
bzero(priv, sizeof(*priv));
/* Call generic node constructor */
- if ((error = ng_make_node_common(&typestruct, nodep))) {
+ if ((error = ng_make_node_common(&ng_vjc_typestruct, nodep))) {
FREE(priv, M_NETGRAPH);
return (error);
}
@@ -212,12 +336,46 @@ ng_vjc_rcvmsg(node_p node, struct ng_mesg *msg,
priv->conf = *c;
break;
}
+ case NGM_VJC_GET_CONFIG:
+ {
+ struct ngm_vjc_config *conf;
+
+ NG_MKRESPONSE(resp, msg, sizeof(*conf), M_NOWAIT);
+ if (resp == NULL)
+ ERROUT(ENOMEM);
+ conf = (struct ngm_vjc_config *)resp->data;
+ *conf = priv->conf;
+ break;
+ }
case NGM_VJC_GET_STATE:
- NG_MKRESPONSE(resp, msg, sizeof(priv->slc), M_NOWAIT);
+ {
+ const struct slcompress *const sl0 = &priv->slc;
+ struct slcompress *sl;
+ u_int16_t index;
+ int i;
+
+ /* Get response structure */
+ NG_MKRESPONSE(resp, msg, sizeof(*sl), M_NOWAIT);
if (resp == NULL)
ERROUT(ENOMEM);
- *((struct slcompress *) resp->data) = priv->slc;
+ sl = (struct slcompress *)resp->data;
+ *sl = *sl0;
+
+ /* Replace pointers with integer indicies */
+ if (sl->last_cs != NULL) {
+ index = sl0->last_cs - sl0->tstate;
+ bzero(&sl->last_cs, sizeof(sl->last_cs));
+ *((u_int16_t *)&sl->last_cs) = index;
+ }
+ for (i = 0; i < MAX_STATES; i++) {
+ struct cstate *const cs = &sl->tstate[i];
+
+ index = sl0->tstate[i].cs_next - sl0->tstate;
+ bzero(&cs->cs_next, sizeof(cs->cs_next));
+ *((u_int16_t *)&cs->cs_next) = index;
+ }
break;
+ }
case NGM_VJC_CLR_STATS:
priv->slc.sls_packets = 0;
priv->slc.sls_compressed = 0;
diff --git a/sys/netgraph/ng_vjc.h b/sys/netgraph/ng_vjc.h
index 7d808c9..616f3ab 100644
--- a/sys/netgraph/ng_vjc.h
+++ b/sys/netgraph/ng_vjc.h
@@ -45,7 +45,7 @@
/* Node type name and magic cookie */
#define NG_VJC_NODE_TYPE "vjc"
-#define NGM_VJC_COOKIE 868219209
+#define NGM_VJC_COOKIE 868219210
/* Hook names */
#define NG_VJC_HOOK_IP "ip" /* normal IP traffic */
@@ -65,9 +65,21 @@ struct ngm_vjc_config {
u_char compressCID; /* OK to compress outgoing CID's */
};
+/* Keep this in sync with the above structure definition */
+#define NG_VJC_CONFIG_TYPE_INFO { \
+ { \
+ { "enableComp", &ng_parse_uint8_type }, \
+ { "enableDecomp", &ng_parse_uint8_type }, \
+ { "maxChannel", &ng_parse_uint8_type }, \
+ { "compressCID", &ng_parse_uint8_type }, \
+ { NULL }, \
+ } \
+}
+
/* Netgraph commands */
enum {
NGM_VJC_SET_CONFIG, /* Supply a struct ngm_vjc_config */
+ NGM_VJC_GET_CONFIG, /* Returns a struct ngm_vjc_config */
NGM_VJC_GET_STATE, /* Returns current struct slcompress */
NGM_VJC_CLR_STATS, /* Clears statistics counters */
NGM_VJC_RECV_ERROR, /* Indicate loss of incoming frame */
OpenPOWER on IntegriCloud