Deleted Added
full compact
ng_mppc.c (186189) ng_mppc.c (187405)
1/*
2 * ng_mppc.c
3 */
4
5/*-
6 * Copyright (c) 1996-2000 Whistle Communications, Inc.
7 * All rights reserved.
8 *

--- 24 unchanged lines hidden (view full) ---

33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
36 * OF SUCH DAMAGE.
37 *
38 * Author: Archie Cobbs <archie@freebsd.org>
39 *
40 * $Whistle: ng_mppc.c,v 1.4 1999/11/25 00:10:12 archie Exp $
1/*
2 * ng_mppc.c
3 */
4
5/*-
6 * Copyright (c) 1996-2000 Whistle Communications, Inc.
7 * All rights reserved.
8 *

--- 24 unchanged lines hidden (view full) ---

33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
36 * OF SUCH DAMAGE.
37 *
38 * Author: Archie Cobbs <archie@freebsd.org>
39 *
40 * $Whistle: ng_mppc.c,v 1.4 1999/11/25 00:10:12 archie Exp $
41 * $FreeBSD: head/sys/netgraph/ng_mppc.c 186189 2008-12-16 19:15:31Z mav $
41 * $FreeBSD: head/sys/netgraph/ng_mppc.c 187405 2009-01-18 19:25:36Z mav $
42 */
43
44/*
45 * Microsoft PPP compression (MPPC) and encryption (MPPE) netgraph node type.
46 *
47 * You must define one or both of the NETGRAPH_MPPC_COMPRESSION and/or
48 * NETGRAPH_MPPC_ENCRYPTION options for this node type to be useful.
49 */

--- 415 unchanged lines hidden (view full) ---

465static int
466ng_mppc_compress(node_p node, struct mbuf **datap)
467{
468 const priv_p priv = NG_NODE_PRIVATE(node);
469 struct ng_mppc_dir *const d = &priv->xmit;
470 u_int16_t header;
471 struct mbuf *m = *datap;
472
42 */
43
44/*
45 * Microsoft PPP compression (MPPC) and encryption (MPPE) netgraph node type.
46 *
47 * You must define one or both of the NETGRAPH_MPPC_COMPRESSION and/or
48 * NETGRAPH_MPPC_ENCRYPTION options for this node type to be useful.
49 */

--- 415 unchanged lines hidden (view full) ---

465static int
466ng_mppc_compress(node_p node, struct mbuf **datap)
467{
468 const priv_p priv = NG_NODE_PRIVATE(node);
469 struct ng_mppc_dir *const d = &priv->xmit;
470 u_int16_t header;
471 struct mbuf *m = *datap;
472
473 /* We must own the mbuf chain exclusively to modify it. */
474 m = m_unshare(m, M_DONTWAIT);
475 if (m == NULL)
476 return (ENOMEM);
477
473 /* Initialize */
474 header = d->cc;
475
476 /* Always set the flushed bit in stateless mode */
477 if (d->flushed || ((d->cfg.bits & MPPE_STATELESS) != 0)) {
478 header |= MPPC_FLAG_FLUSHED;
479 d->flushed = 0;
480 }

--- 43 unchanged lines hidden (view full) ---

524 if ((rtn & MPPC_EXPANDED) == 0
525 && (rtn & MPPC_COMP_OK) == MPPC_COMP_OK) {
526 outlen -= destCnt;
527 header |= MPPC_FLAG_COMPRESSED;
528 if ((rtn & MPPC_RESTART_HISTORY) != 0)
529 header |= MPPC_FLAG_RESTART;
530
531 /* Replace m by the compresed one. */
478 /* Initialize */
479 header = d->cc;
480
481 /* Always set the flushed bit in stateless mode */
482 if (d->flushed || ((d->cfg.bits & MPPE_STATELESS) != 0)) {
483 header |= MPPC_FLAG_FLUSHED;
484 d->flushed = 0;
485 }

--- 43 unchanged lines hidden (view full) ---

529 if ((rtn & MPPC_EXPANDED) == 0
530 && (rtn & MPPC_COMP_OK) == MPPC_COMP_OK) {
531 outlen -= destCnt;
532 header |= MPPC_FLAG_COMPRESSED;
533 if ((rtn & MPPC_RESTART_HISTORY) != 0)
534 header |= MPPC_FLAG_RESTART;
535
536 /* Replace m by the compresed one. */
532 m_freem(m);
533 m = m_devget((caddr_t)outbuf, outlen, 0, NULL, NULL);
537 m_copyback(m, 0, outlen, (caddr_t)outbuf);
538 if (m->m_pkthdr.len < outlen) {
539 m_freem(m);
540 m = NULL;
541 } else if (outlen < m->m_pkthdr.len)
542 m_adj(m, outlen - m->m_pkthdr.len);
534 }
535 d->flushed = (rtn & MPPC_EXPANDED) != 0
536 || (flags & MPPC_SAVE_HISTORY) == 0;
537
538 free(inbuf, M_NETGRAPH_MPPC);
539 free(outbuf, M_NETGRAPH_MPPC);
540
543 }
544 d->flushed = (rtn & MPPC_EXPANDED) != 0
545 || (flags & MPPC_SAVE_HISTORY) == 0;
546
547 free(inbuf, M_NETGRAPH_MPPC);
548 free(outbuf, M_NETGRAPH_MPPC);
549
541 /* Check m_devget() result. */
550 /* Check mbuf chain reload result. */
542 if (m == NULL) {
543 if (!d->flushed) {
544 MPPC_InitCompressionHistory(d->history);
545 d->flushed = 1;
546 }
547 return (ENOMEM);
548 }
549 }
550#endif
551
552 /* Now encrypt packet (if encryption enabled) */
553#ifdef NETGRAPH_MPPC_ENCRYPTION
554 if ((d->cfg.bits & MPPE_BITS) != 0) {
555 struct mbuf *m1;
556
557 /* Set header bits */
558 header |= MPPC_FLAG_ENCRYPTED;
559
551 if (m == NULL) {
552 if (!d->flushed) {
553 MPPC_InitCompressionHistory(d->history);
554 d->flushed = 1;
555 }
556 return (ENOMEM);
557 }
558 }
559#endif
560
561 /* Now encrypt packet (if encryption enabled) */
562#ifdef NETGRAPH_MPPC_ENCRYPTION
563 if ((d->cfg.bits & MPPE_BITS) != 0) {
564 struct mbuf *m1;
565
566 /* Set header bits */
567 header |= MPPC_FLAG_ENCRYPTED;
568
560 /* We must own the mbuf chain exclusively to modify it. */
561 m = m_unshare(m, M_DONTWAIT);
562 if (m == NULL) {
563 if (!d->flushed) {
564#ifdef NETGRAPH_MPPC_COMPRESSION
565 MPPC_InitCompressionHistory(d->history);
566#endif
567 d->flushed = 1;
568 }
569 return (ENOMEM);
570 }
571
572 /* Update key if it's time */
573 if ((d->cfg.bits & MPPE_STATELESS) != 0
574 || (d->cc & MPPE_UPDATE_MASK) == MPPE_UPDATE_FLAG) {
575 ng_mppc_updatekey(d->cfg.bits,
576 d->cfg.startkey, d->key, &d->rc4);
577 } else if ((header & MPPC_FLAG_FLUSHED) != 0) {
578 /* Need to reset key if we say we did
579 and ng_mppc_updatekey wasn't called to do it also. */

--- 30 unchanged lines hidden (view full) ---

610ng_mppc_decompress(node_p node, struct mbuf **datap)
611{
612 const priv_p priv = NG_NODE_PRIVATE(node);
613 struct ng_mppc_dir *const d = &priv->recv;
614 u_int16_t header, cc;
615 u_int numLost;
616 struct mbuf *m = *datap;
617
569 /* Update key if it's time */
570 if ((d->cfg.bits & MPPE_STATELESS) != 0
571 || (d->cc & MPPE_UPDATE_MASK) == MPPE_UPDATE_FLAG) {
572 ng_mppc_updatekey(d->cfg.bits,
573 d->cfg.startkey, d->key, &d->rc4);
574 } else if ((header & MPPC_FLAG_FLUSHED) != 0) {
575 /* Need to reset key if we say we did
576 and ng_mppc_updatekey wasn't called to do it also. */

--- 30 unchanged lines hidden (view full) ---

607ng_mppc_decompress(node_p node, struct mbuf **datap)
608{
609 const priv_p priv = NG_NODE_PRIVATE(node);
610 struct ng_mppc_dir *const d = &priv->recv;
611 u_int16_t header, cc;
612 u_int numLost;
613 struct mbuf *m = *datap;
614
615 /* We must own the mbuf chain exclusively to modify it. */
616 m = m_unshare(m, M_DONTWAIT);
617 if (m == NULL)
618 return (ENOMEM);
619
618 /* Pull off header */
619 if (m->m_pkthdr.len < MPPC_HDRLEN) {
620 m_freem(m);
621 return (EINVAL);
622 }
623 m_copydata(m, 0, MPPC_HDRLEN, (caddr_t)&header);
624 header = ntohs(header);
625 cc = (header & MPPC_CCOUNT_MASK);

--- 63 unchanged lines hidden (view full) ---

689#ifdef NETGRAPH_MPPC_ENCRYPTION
690 /* Update key if it's time (always in stateless mode) */
691 if ((d->cfg.bits & MPPE_STATELESS) != 0
692 || (d->cc & MPPE_UPDATE_MASK) == MPPE_UPDATE_FLAG) {
693 ng_mppc_updatekey(d->cfg.bits,
694 d->cfg.startkey, d->key, &d->rc4);
695 }
696
620 /* Pull off header */
621 if (m->m_pkthdr.len < MPPC_HDRLEN) {
622 m_freem(m);
623 return (EINVAL);
624 }
625 m_copydata(m, 0, MPPC_HDRLEN, (caddr_t)&header);
626 header = ntohs(header);
627 cc = (header & MPPC_CCOUNT_MASK);

--- 63 unchanged lines hidden (view full) ---

691#ifdef NETGRAPH_MPPC_ENCRYPTION
692 /* Update key if it's time (always in stateless mode) */
693 if ((d->cfg.bits & MPPE_STATELESS) != 0
694 || (d->cc & MPPE_UPDATE_MASK) == MPPE_UPDATE_FLAG) {
695 ng_mppc_updatekey(d->cfg.bits,
696 d->cfg.startkey, d->key, &d->rc4);
697 }
698
697 /* We must own the mbuf chain exclusively to modify it. */
698 m = m_unshare(m, M_DONTWAIT);
699 if (m == NULL)
700 return (ENOMEM);
701
702 /* Decrypt packet */
703 m1 = m;
704 while (m1 != NULL) {
705 rc4_crypt(&d->rc4, mtod(m1, u_char *),
706 mtod(m1, u_char *), m1->m_len);
707 m1 = m1->m_next;
708 }
709#endif

--- 71 unchanged lines hidden (view full) ---

781 free(decompbuf, M_NETGRAPH_MPPC);
782 goto failed;
783 }
784
785 /* Replace compressed data with decompressed data */
786 free(buf, M_NETGRAPH_MPPC);
787 len = decomplen - destCnt;
788
699 /* Decrypt packet */
700 m1 = m;
701 while (m1 != NULL) {
702 rc4_crypt(&d->rc4, mtod(m1, u_char *),
703 mtod(m1, u_char *), m1->m_len);
704 m1 = m1->m_next;
705 }
706#endif

--- 71 unchanged lines hidden (view full) ---

778 free(decompbuf, M_NETGRAPH_MPPC);
779 goto failed;
780 }
781
782 /* Replace compressed data with decompressed data */
783 free(buf, M_NETGRAPH_MPPC);
784 len = decomplen - destCnt;
785
789 m_freem(m);
790 m = m_devget((caddr_t)decompbuf, len, 0, NULL, NULL);
786 m_copyback(m, 0, len, (caddr_t)decompbuf);
787 if (m->m_pkthdr.len < len) {
788 m_freem(m);
789 m = NULL;
790 } else if (len < m->m_pkthdr.len)
791 m_adj(m, len - m->m_pkthdr.len);
791 free(decompbuf, M_NETGRAPH_MPPC);
792 }
793#endif
794
795 /* Return result in an mbuf */
796 *datap = m;
797 return (*datap == NULL ? ENOBUFS : 0);
798}

--- 70 unchanged lines hidden ---
792 free(decompbuf, M_NETGRAPH_MPPC);
793 }
794#endif
795
796 /* Return result in an mbuf */
797 *datap = m;
798 return (*datap == NULL ? ENOBUFS : 0);
799}

--- 70 unchanged lines hidden ---