38#include <sys/kernel.h>
39#include <sys/malloc.h>
42#include <sys/syslog.h>
43#include <sys/socket.h>
44#include <sys/socketvar.h>
45#include <sys/callout.h>
47#include <sys/stdint.h>
48#include <machine/stdarg.h>
53#include <netnatm/saal/sscopdef.h>
56#include <netnatm/saal/sscop.h>
58#define DDD printf("%s: %d\n", __func__, __LINE__)
61#define VERBOSE(P,M,F) \
63 if (sscop_getdebug((P)->sscop) & (M)) \
213 struct SSCOP_MBUF_T *, u_int, u_int);
215 struct SSCOP_MBUF_T *, u_int);
217 struct SSCOP_MBUF_T *);
221static const struct sscop_funcs sscop_funcs = {
229sscop_verbose(
struct sscop *sscop,
void *arg,
const char *fmt, ...)
234 printf(
"sscop(%p): ", sscop);
249 p = malloc(
sizeof(*p), M_NG_SSCOP, M_WAITOK | M_ZERO);
251 if ((p->
sscop = sscop_create(node, &sscop_funcs)) == NULL) {
270 free(
priv, M_NG_SSCOP);
308 "flow control stopped"));
316 if (space > window) {
318 "flow control opened window by %u messages",
320 (void)sscop_window(
priv->
sscop, space - window);
333 if (space > window) {
335 "flow control opened window by %u messages",
337 (void)sscop_window(
priv->
sscop, space - window);
379 sbuf_new(&sbuf, arg, len, 0);
382 sbuf_printf(&sbuf,
"upper hook: %s connected to %s:%s\n",
387 sbuf_printf(&sbuf,
"upper hook: <not connected>\n");
390 sbuf_printf(&sbuf,
"lower hook: %s connected to %s:%s\n",
395 sbuf_printf(&sbuf,
"lower hook: <not connected>\n");
398 sbuf_printf(&sbuf,
"manage hook: %s connected to %s:%s\n",
403 sbuf_printf(&sbuf,
"manage hook: <not connected>\n");
405 sbuf_printf(&sbuf,
"sscop state: %s\n",
407 sscop_statename(sscop_getstate(
priv->
sscop)));
409 sbuf_printf(&sbuf,
"input packets: %ju\n",
411 sbuf_printf(&sbuf,
"input dropped: %ju\n",
413 sbuf_printf(&sbuf,
"output packets: %ju\n",
415 sbuf_printf(&sbuf,
"output dropped: %ju\n",
417 sbuf_printf(&sbuf,
"aa signals: %ju\n",
419 sbuf_printf(&sbuf,
"aa dropped: %ju\n",
421 sbuf_printf(&sbuf,
"maa signals: %ju\n",
423 sbuf_printf(&sbuf,
"maa dropped: %ju\n",
425 sbuf_printf(&sbuf,
"errors: %ju\n",
427 sbuf_printf(&sbuf,
"data delivered: %ju\n",
429 sbuf_printf(&sbuf,
"window: %u\n",
433 return (sbuf_len(&sbuf));
482 struct sscop_param *p;
489 p = (
struct sscop_param *)resp->
data;
578 *(u_int32_t *)resp->
data =
609 if(strcmp(
name,
"upper") == 0) {
612 }
else if(strcmp(
name,
"lower") == 0) {
614 }
else if(strcmp(
name,
"manage") == 0) {
645 sscop_getstate(
priv->
sscop) != SSCOP_IDLE) {
646 sscop_aasig(
priv->
sscop, SSCOP_RELEASE_request,
721 if (!(m->m_flags & M_PKTHDR)) {
722 printf(
"no pkthdr\n");
726 if (m->m_len < (
int)
sizeof(a) && (m = m_pullup(m,
sizeof(a))) == NULL)
728 bcopy((caddr_t)mtod(m,
struct sscop_arg *), &a,
sizeof(a));
736 struct SSCOP_MBUF_T *m, u_int arg)
754 if (
sig == SSCOP_DATA_indication)
758 MGETHDR(m, M_NOWAIT, MT_DATA);
762 m->m_pkthdr.len = m->m_len;
764 M_PREPEND(m,
sizeof(
struct sscop_arg), M_NOWAIT);
790 if (m->m_len < (
int)
sizeof(a) && (m = m_pullup(m,
sizeof(a))) == NULL)
792 bcopy((caddr_t)mtod(m,
struct sscop_arg *), &a,
sizeof(a));
800 struct SSCOP_MBUF_T *m, u_int err, u_int cnt)
815 if (
sig == SSCOP_MERROR_indication) {
816 MGETHDR(m, M_NOWAIT, MT_DATA);
819 m->m_len =
sizeof(*e);
820 m->m_pkthdr.len = m->m_len;
826 }
else if (m == NULL) {
827 MGETHDR(m, M_NOWAIT, MT_DATA);
830 m->m_len =
sizeof(*a);
831 m->m_pkthdr.len = m->m_len;
836 M_PREPEND(m,
sizeof(*a), M_NOWAIT);
#define NG_HOOK_NODE(hook)
int ng_rcvmsg_t(node_p node, item_p item, hook_p lasthook)
int ng_disconnect_t(hook_p hook)
#define NG_NODE_SET_PRIVATE(node, val)
#define NG_RESPOND_MSG(error, here, item, resp)
#define NG_NODE_IS_VALID(node)
#define NG_NODE_FORCE_WRITER(node)
#define NG_HOOK_PEER(hook)
#define NG_NODE_UNREF(node)
#define NG_NODE_NAME(node)
int ng_rmnode_self(node_p here)
#define NG_SEND_DATA_ONLY(error, hook, m)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
#define NG_HOOK_NAME(hook)
#define NG_FREE_ITEM(item)
#define NG_HOOK_SET_RCVDATA(hook, val)
int ng_constructor_t(node_p node)
#define NG_NODE_NUMHOOKS(node)
#define NGI_GET_MSG(i, m)
#define NG_NODE_PRIVATE(node)
int ng_newhook_t(node_p node, hook_p hook, const char *name)
#define NG_MKRESPONSE(rsp, msg, len, how)
#define NGM_LOW_WATER_PASSED
#define NGM_GENERIC_COOKIE
#define NGM_HIGH_WATER_PASSED
#define NGM_SYNC_QUEUE_STATE
const struct ng_parse_type ng_parse_struct_type
const struct ng_parse_type ng_parse_uint32_type
const struct ng_parse_type ng_parse_hint32_type
static ng_constructor_t ng_sscop_constructor
static ng_shutdown_t ng_sscop_shutdown
static void sscop_send_upper(struct sscop *, void *, enum sscop_aasig, struct SSCOP_MBUF_T *, u_int)
static ng_rcvdata_t ng_sscop_rcvmanage
static ng_newhook_t ng_sscop_newhook
static int flow_lower(node_p node, struct ng_mesg *msg)
static const struct ng_parse_struct_field ng_sscop_setparam_type_info[]
MALLOC_DEFINE(M_NG_SSCOP, "netgraph_sscop", "netgraph sscop node")
static const struct ng_cmdlist ng_sscop_cmdlist[]
static void sscop_send_lower(struct sscop *, void *, struct SSCOP_MBUF_T *)
static const struct ng_parse_type ng_sscop_param_type
static const struct ng_parse_struct_field ng_sscop_setparam_resp_type_info[]
static const struct ng_parse_type ng_sscop_setparam_type
static void sscop_send_manage(struct sscop *, void *, enum sscop_maasig, struct SSCOP_MBUF_T *, u_int, u_int)
NETGRAPH_INIT(sscop, &ng_sscop_typestruct)
MODULE_DEPEND(ng_sscop, ngatmbase, 1, 1, 1)
static struct ng_type ng_sscop_typestruct
static ng_rcvmsg_t ng_sscop_rcvmsg
static ng_rcvdata_t ng_sscop_rcvupper
static int text_status(node_p node, struct priv *priv, char *arg, u_int len)
static const struct ng_parse_struct_field ng_sscop_param_type_info[]
static ng_disconnect_t ng_sscop_disconnect
static int flow_upper(node_p node, struct ng_mesg *msg)
static void sscop_verbose(struct sscop *, void *, const char *,...)
static const struct ng_parse_type ng_sscop_setparam_resp_type
static int ng_sscop_mod_event(module_t, int, void *)
static ng_rcvdata_t ng_sscop_rcvlower
#define NG_SSCOP_SETPARAM_RESP_INFO
#define NG_SSCOP_SETPARAM_INFO
#define NG_SSCOP_NODE_TYPE
#define NG_SSCOP_PARAM_INFO
struct ng_mesg::ng_msghdr header
u_int max_queuelen_packets