53#include <sys/kernel.h>
54#include <sys/malloc.h>
57#include <sys/socket.h>
60#include <netinet/in.h>
61#include <netinet/if_ether.h>
77#define NLPID_SNAP 0x80
78#define NLPID_Q933 0x08
79#define NLPID_CLNP 0x81
80#define NLPID_ESIS 0x82
81#define NLPID_ISIS 0x83
83#define ERROUT(x) do { error = (x); goto done; } while (0)
168 priv = malloc(
sizeof(*
priv), M_NETGRAPH, M_WAITOK | M_ZERO);
190 priv->downlink = hook;
202 priv->ethernet = hook;
232 s = (
char *)msg->
data;
237 if ((strlen(enc->
name) == len) &&
238 !strncmp(enc->
name, s, len))
253 strlcpy((
char *)resp->
data,
priv->enc->name,
254 strlen(
priv->enc->name) + 1);
302#define MAX_ENCAPS_HDR 8
303#define OUICMP(P,A,B,C) ((P)[0]==(A) && (P)[1]==(B) && (P)[2]==(C))
314 if (hook ==
priv->downlink) {
321 ptr = start = mtod(m,
const u_char *);
324 goto switch_on_etype;
337 if (
OUICMP(ptr, 0, 0, 0)) {
341switch_on_etype: etype = ntohs(*((
const u_int16_t *)ptr));
343 m_adj(m, ptr - start);
350 case ETHERTYPE_REVARP:
354 }
else if (
OUICMP(ptr, 0x00, 0x80, 0xc2)) {
361 m_adj(m, ptr - start);
367 m_adj(m, ptr - start);
371 m_adj(m, ptr - start);
381 if ((*ptr & 0x01) == 0x01)
383 m_adj(m, ptr - start);
387 }
else if (hook ==
priv->ppp) {
388 M_PREPEND(m, 2, M_NOWAIT);
391 mtod(m, u_char *)[0] =
HDLC_UI;
394 }
else if (hook ==
priv->inet) {
395 switch (
priv->enc->method) {
397 M_PREPEND(m, 2, M_NOWAIT);
400 mtod(m, u_char *)[0] =
HDLC_UI;
409 M_PREPEND(m, 8, M_NOWAIT);
412 mtod(m, u_char *)[0] =
HDLC_UI;
413 mtod(m, u_char *)[1] = 0x00;
415 bzero((
char *)(mtod(m, u_char *) + 3), 3);
416 *((u_int16_t *)mtod(m, u_int16_t *) + 6/
sizeof(u_int16_t))
417 = htons(ETHERTYPE_IP);
420 M_PREPEND(m, 2, M_NOWAIT);
423 *((u_int16_t *)mtod(m, u_int16_t *)) = htons(ETHERTYPE_IP);
427 }
else if (hook ==
priv->ethernet) {
428 M_PREPEND(m, 8, M_NOWAIT);
431 mtod(m, u_char *)[0] =
HDLC_UI;
432 mtod(m, u_char *)[1] = 0x00;
434 mtod(m, u_char *)[3] = 0x00;
435 mtod(m, u_char *)[4] = 0x80;
436 mtod(m, u_char *)[5] = 0xc2;
437 mtod(m, u_char *)[6] = 0x00;
438 mtod(m, u_char *)[7] = 0x07;
441 panic(
"%s", __func__);
460 free(
priv, M_NETGRAPH);
477 else if (hook ==
priv->downlink)
478 priv->downlink = NULL;
479 else if (hook ==
priv->inet)
481 else if (hook ==
priv->ppp)
483 else if (hook ==
priv->ethernet)
484 priv->ethernet = NULL;
486 panic(
"%s", __func__);
#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_UNREF(node)
int ng_rmnode_self(node_p here)
#define NG_FWD_NEW_DATA(error, item, hook, m)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
#define NG_FREE_ITEM(item)
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)
const struct ng_parse_type ng_parse_string_type
static const struct ng_rfc1490_encap_t ng_rfc1490_encaps[]
#define OUICMP(P, A, B, C)
static ng_constructor_t ng_rfc1490_constructor
static ng_rcvdata_t ng_rfc1490_rcvdata
static const struct ng_cmdlist ng_rfc1490_cmds[]
static ng_newhook_t ng_rfc1490_newhook
struct ng_rfc1490_private * priv_p
static ng_rcvmsg_t ng_rfc1490_rcvmsg
static struct ng_type typestruct
static ng_disconnect_t ng_rfc1490_disconnect
static ng_shutdown_t ng_rfc1490_shutdown
NETGRAPH_INIT(rfc1490, &typestruct)
@ NG_RFC1490_ENCAP_IETF_SNAP
@ NG_RFC1490_ENCAP_IETF_IP
#define NG_RFC1490_HOOK_ETHERNET
#define NG_RFC1490_NODE_TYPE
#define NGM_RFC1490_COOKIE
#define NG_RFC1490_HOOK_INET
#define NG_RFC1490_HOOK_DOWNSTREAM
#define NG_RFC1490_HOOK_PPP
struct ng_mesg::ng_msghdr header
const struct ng_rfc1490_encap_t * enc