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 --- |