38#include <sys/kernel.h>
40#include <sys/malloc.h>
42#include <sys/syslog.h>
49#include "opt_netgraph.h"
51static MALLOC_DEFINE(M_NETGRAPH_PRED1,
"netgraph_pred1",
"netgraph pred1 node");
56#define PRED1_TABLE_SIZE 0x10000
57#define PRED1_BUF_SIZE 4096
58#define PPP_INITFCS 0xffff
59#define PPP_GOODFCS 0xf0b8
69#define HASH(x) priv->Hash = (priv->Hash << 4) ^ (x)
95 struct mbuf **resultp);
97 struct mbuf **resultp);
104static uint16_t
Crc16(uint16_t
fcs, u_char *cp,
int len);
178#define ERROUT(x) do { error = (x); goto done; } while (0)
193 priv = malloc(
sizeof(*
priv), M_NETGRAPH_PRED1, M_WAITOK | M_ZERO);
303 struct mbuf *m, *out;
306 if (!
priv->cfg.enable) {
313 if (
priv->compress) {
316 log(LOG_NOTICE,
"%s: error: %d\n", __func__, error);
323 log(LOG_NOTICE,
"%s: error: %d\n", __func__, error);
324 if (
priv->ctrlnode != 0) {
351 free(
priv, M_NETGRAPH_PRED1);
393 inlen = m->m_pkthdr.len;
406 m = m_unshare(m, M_NOWAIT);
413 m_copydata(m, 0, inlen, (caddr_t)(
priv->inbuf + 2));
415 lenn = htons(inlen & 0x7FFF);
429 *(uint16_t *)out = lenn;
435 *(uint16_t *)out = lenn;
440 (out + outlen)[0] =
fcs & 0xFF;
441 (out + outlen)[1] =
fcs >> 8;
447 m_copyback(m, 0, outlen, (caddr_t)out);
448 if (m->m_pkthdr.len < outlen) {
452 }
else if (outlen < m->m_pkthdr.len)
453 m_adj(m, outlen - m->m_pkthdr.len);
469 uint16_t len, len1, cf, lenn;
475 inlen = m->m_pkthdr.len;
484 m = m_unshare(m, M_NOWAIT);
491 m_copydata(m, 0, inlen, (caddr_t)
priv->inbuf);
496 len =
priv->inbuf[0] << 8;
497 len +=
priv->inbuf[1];
511 log(LOG_NOTICE,
"ng_pred1: Comp length error (%d) "
512 "--> len (%d)\n", len, len1);
530 log(LOG_NOTICE,
"ng_pred1: Pred1: Bad CRC-16\n");
535 m_copyback(m, 0, len, (caddr_t)
priv->outbuf);
536 if (m->m_pkthdr.len < len) {
540 }
else if (len < m->m_pkthdr.len)
541 m_adj(m, len - m->m_pkthdr.len);
546 if (len != (inlen - 4)) {
549 log(LOG_NOTICE,
"ng_pred1: Uncomp length error (%d) "
550 "--> len (%d)\n", len, inlen - 4);
589 u_char *flagdest, *orgdest;
595 for (i = 0; i < 8 && len; i++) {
596 if (
priv->GuessTable[
priv->Hash] == *source)
601 priv->GuessTable[
priv->Hash] = *source;
609 return (dest - orgdest);
623 u_char
flags, *orgdest;
629 for (i = 0; i < 8; i++, flags >>= 1) {
634 *dest =
priv->GuessTable[
priv->Hash];
641 priv->GuessTable[
priv->Hash] = *source;
650 return (dest - orgdest);
663 priv->GuessTable[
priv->Hash] = *source;
676Crc16(uint16_t crc, u_char *cp,
int len)
679 crc = (crc >> 8) ^
Crc16Table[(crc ^ *cp++) & 0xff];
684 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
685 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
686 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
687 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
688 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
689 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
690 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
691 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
692 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
693 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
694 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
695 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
696 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
697 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
698 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
699 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
700 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
701 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
702 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
703 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
704 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
705 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
706 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
707 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
708 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
709 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
710 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
711 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
712 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
713 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
714 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
715 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
#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_NODE_UNREF(node)
int ng_rmnode_self(node_p here)
#define NG_FWD_NEW_DATA(error, item, hook, m)
#define NG_SEND_MSG_ID(error, here, msg, ID, retaddr)
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)
#define NG_MKMESSAGE(msg, cookie, cmdid, len, how)
const struct ng_parse_type ng_parse_struct_type
NETGRAPH_INIT(pred1, &ng_pred1_typestruct)
static uint16_t Crc16(uint16_t fcs, u_char *cp, int len)
static int ng_pred1_decompress(node_p node, struct mbuf *m, struct mbuf **resultp)
static void Pred1Init(node_p node)
static const struct ng_parse_type ng_pred1_stat_type
static ng_rcvdata_t ng_pred1_rcvdata
static void Pred1SyncTable(node_p node, u_char *source, int len)
static ng_disconnect_t ng_pred1_disconnect
static ng_constructor_t ng_pred1_constructor
static const uint16_t Crc16Table[]
static ng_rcvmsg_t ng_pred1_rcvmsg
static const struct ng_parse_struct_field ng_pred1_stats_type_fields[]
static const struct ng_cmdlist ng_pred1_cmds[]
static ng_shutdown_t ng_pred1_shutdown
struct ng_pred1_private * priv_p
static const struct ng_parse_type ng_pred1_config_type
static ng_newhook_t ng_pred1_newhook
static int ng_pred1_compress(node_p node, struct mbuf *m, struct mbuf **resultp)
static struct ng_type ng_pred1_typestruct
static int Pred1Decompress(node_p node, u_char *source, u_char *dest, int slen, int dlen)
static int Pred1Compress(node_p node, u_char *source, u_char *dest, int len)
static MALLOC_DEFINE(M_NETGRAPH_PRED1, "netgraph_pred1", "netgraph pred1 node")
static const struct ng_parse_struct_field ng_pred1_config_type_fields[]
#define NG_PRED1_HOOK_DECOMP
#define NG_PRED1_HOOK_COMP
#define NG_PRED1_CONFIG_INFO
#define NG_PRED1_STATS_INFO
#define NG_PRED1_NODE_TYPE
struct ng_mesg::ng_msghdr header
u_char GuessTable[PRED1_TABLE_SIZE]
u_char outbuf[PRED1_BUF_SIZE]
u_char inbuf[PRED1_BUF_SIZE]
struct ng_pred1_config cfg