Lines Matching +full:sync +full:- +full:flag
5 /*-
6 * Copyright (c) 1996-1999 Whistle Communications, Inc.
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
43 * This node type implements a PPP style sync <-> async converter.
76 hook_p sync; /* Synchronous side */ member
79 u_char *abuf; /* Buffer to encode sync into */
184 sc->amode = MODE_HUNT; in nga_constructor()
185 sc->cfg.accm = ~0; in nga_constructor()
186 sc->cfg.amru = NG_ASYNC_DEFAULT_MRU; in nga_constructor()
187 sc->cfg.smru = NG_ASYNC_DEFAULT_MRU; in nga_constructor()
188 sc->abuf = malloc(ASYNC_BUF_SIZE(sc->cfg.smru), in nga_constructor()
190 sc->sbuf = malloc(SYNC_BUF_SIZE(sc->cfg.amru), in nga_constructor()
193 sc->node = node; in nga_constructor()
213 hookp = &sc->async; in nga_newhook()
224 hookp = &sc->sync; in nga_newhook()
242 if (hook == sc->sync) in nga_rcvdata()
244 if (hook == sc->async) in nga_rcvdata()
261 switch (msg->header.typecookie) { in nga_rcvmsg()
263 switch (msg->header.cmd) { in nga_rcvmsg()
265 NG_MKRESPONSE(resp, msg, sizeof(sc->stats), M_NOWAIT); in nga_rcvmsg()
268 *((struct ng_async_stat *) resp->data) = sc->stats; in nga_rcvmsg()
271 bzero(&sc->stats, sizeof(sc->stats)); in nga_rcvmsg()
276 (struct ng_async_cfg *) msg->data; in nga_rcvmsg()
279 if (msg->header.arglen != sizeof(*cfg)) in nga_rcvmsg()
281 if (cfg->amru < NG_ASYNC_MIN_MRU in nga_rcvmsg()
282 || cfg->amru > NG_ASYNC_MAX_MRU in nga_rcvmsg()
283 || cfg->smru < NG_ASYNC_MIN_MRU in nga_rcvmsg()
284 || cfg->smru > NG_ASYNC_MAX_MRU) in nga_rcvmsg()
286 cfg->enabled = !!cfg->enabled; /* normalize */ in nga_rcvmsg()
287 if (cfg->smru > sc->cfg.smru) { /* reallocate buffer */ in nga_rcvmsg()
288 buf = malloc(ASYNC_BUF_SIZE(cfg->smru), in nga_rcvmsg()
292 free(sc->abuf, M_NETGRAPH_ASYNC); in nga_rcvmsg()
293 sc->abuf = buf; in nga_rcvmsg()
295 if (cfg->amru > sc->cfg.amru) { /* reallocate buffer */ in nga_rcvmsg()
296 buf = malloc(SYNC_BUF_SIZE(cfg->amru), in nga_rcvmsg()
300 free(sc->sbuf, M_NETGRAPH_ASYNC); in nga_rcvmsg()
301 sc->sbuf = buf; in nga_rcvmsg()
302 sc->amode = MODE_HUNT; in nga_rcvmsg()
303 sc->slen = 0; in nga_rcvmsg()
305 if (!cfg->enabled) { in nga_rcvmsg()
306 sc->amode = MODE_HUNT; in nga_rcvmsg()
307 sc->slen = 0; in nga_rcvmsg()
309 sc->cfg = *cfg; in nga_rcvmsg()
313 NG_MKRESPONSE(resp, msg, sizeof(sc->cfg), M_NOWAIT); in nga_rcvmsg()
316 *((struct ng_async_cfg *) resp->data) = sc->cfg; in nga_rcvmsg()
339 free(sc->abuf, M_NETGRAPH_ASYNC); in nga_shutdown()
340 free(sc->sbuf, M_NETGRAPH_ASYNC); in nga_shutdown()
357 if (hook == sc->async) in nga_disconnect()
358 hookp = &sc->async; in nga_disconnect()
359 else if (hook == sc->sync) in nga_disconnect()
360 hookp = &sc->sync; in nga_disconnect()
366 bzero(&sc->stats, sizeof(sc->stats)); in nga_disconnect()
367 sc->lasttime = 0; in nga_disconnect()
388 sc->abuf[(*len)++] = PPP_ESCAPE; in nga_async_add()
391 sc->abuf[(*len)++] = x; in nga_async_add()
410 if (!sc->cfg.enabled) { in nga_rcv_sync()
411 NG_FWD_ITEM_HOOK(error, item, sc->async ); in nga_rcv_sync()
416 rcvif = m->m_pkthdr.rcvif; in nga_rcv_sync()
419 accm = sc->cfg.accm; in nga_rcv_sync()
420 if (m->m_pkthdr.len >= 4) { in nga_rcv_sync()
435 if (m->m_pkthdr.len > sc->cfg.smru) { in nga_rcv_sync()
436 sc->stats.syncOverflows++; in nga_rcv_sync()
443 sc->stats.syncFrames++; in nga_rcv_sync()
444 sc->stats.syncOctets += m->m_pkthdr.len; in nga_rcv_sync()
450 /* Add beginning sync flag if it's been long enough to need one */ in nga_rcv_sync()
452 if (time.tv_sec >= sc->lasttime + 1) { in nga_rcv_sync()
453 sc->abuf[alen++] = PPP_FLAG; in nga_rcv_sync()
454 sc->lasttime = time.tv_sec; in nga_rcv_sync()
459 while (m->m_len > 0) { in nga_rcv_sync()
461 m->m_data++; in nga_rcv_sync()
462 m->m_len--; in nga_rcv_sync()
467 /* Add checksum and final sync flag */ in nga_rcv_sync()
471 sc->abuf[alen++] = PPP_FLAG; in nga_rcv_sync()
474 if (!(m = m_devget(sc->abuf, alen, 0, rcvif, NULL))) { in nga_rcv_sync()
478 NG_FWD_NEW_DATA(error, item, sc->async, m); in nga_rcv_sync()
495 if (!sc->cfg.enabled) { in nga_rcv_async()
496 NG_FWD_ITEM_HOOK(error, item, sc->sync); in nga_rcv_async()
500 rcvif = m->m_pkthdr.rcvif; in nga_rcv_async()
504 for (; m->m_len > 0; m->m_data++, m->m_len--) { in nga_rcv_async()
507 sc->stats.asyncOctets++; in nga_rcv_async()
508 if (ch == PPP_FLAG) { /* Flag overrides everything */ in nga_rcv_async()
512 if (sc->slen < 2) { in nga_rcv_async()
513 if (sc->slen > 0) in nga_rcv_async()
514 sc->stats.asyncRunts++; in nga_rcv_async()
519 if (sc->fcs != PPP_GOODFCS) { in nga_rcv_async()
520 sc->stats.asyncBadCheckSums++; in nga_rcv_async()
523 sc->slen -= 2; in nga_rcv_async()
526 if (sc->slen >= 2 in nga_rcv_async()
527 && sc->sbuf[0] == PPP_ALLSTATIONS in nga_rcv_async()
528 && sc->sbuf[1] == PPP_UI) in nga_rcv_async()
532 if (sc->slen - skip > sc->cfg.amru) { in nga_rcv_async()
533 sc->stats.asyncOverflows++; in nga_rcv_async()
538 if ((n = m_devget(sc->sbuf + skip, in nga_rcv_async()
539 sc->slen - skip, 0, rcvif, NULL))) { in nga_rcv_async()
540 if (item) { /* sets NULL -> item */ in nga_rcv_async()
542 sc->sync, n); in nga_rcv_async()
545 sc->sync ,n); in nga_rcv_async()
548 sc->stats.asyncFrames++; in nga_rcv_async()
550 sc->amode = MODE_NORMAL; in nga_rcv_async()
551 sc->fcs = PPP_INITFCS; in nga_rcv_async()
552 sc->slen = 0; in nga_rcv_async()
555 switch (sc->amode) { in nga_rcv_async()
558 sc->amode = MODE_ESC; in nga_rcv_async()
564 sc->amode = MODE_NORMAL; in nga_rcv_async()
572 if (sc->slen >= SYNC_BUF_SIZE(sc->cfg.amru)) { in nga_rcv_async()
573 sc->stats.asyncOverflows++; in nga_rcv_async()
574 sc->amode = MODE_HUNT; in nga_rcv_async()
575 sc->slen = 0; in nga_rcv_async()
577 sc->sbuf[sc->slen++] = ch; in nga_rcv_async()
578 sc->fcs = PPP_FCS(sc->fcs, ch); in nga_rcv_async()