xref: /freebsd/usr.sbin/ppp/acf.c (revision 0f7f3352c8bc463607912e2463d13e52d44a4cae)
1  /*-
2   * Copyright (c) 1999 Brian Somers <brian@Awfulhak.org>
3   * All rights reserved.
4   *
5   * Redistribution and use in source and binary forms, with or without
6   * modification, are permitted provided that the following conditions
7   * are met:
8   * 1. Redistributions of source code must retain the above copyright
9   *    notice, this list of conditions and the following disclaimer.
10   * 2. Redistributions in binary form must reproduce the above copyright
11   *    notice, this list of conditions and the following disclaimer in the
12   *    documentation and/or other materials provided with the distribution.
13   *
14   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24   * SUCH DAMAGE.
25   *
26   * $FreeBSD$
27   */
28  
29  #include <sys/types.h>
30  
31  #include <stdio.h>
32  #include <termios.h>
33  
34  #include "defs.h"
35  #include "layer.h"
36  #include "timer.h"
37  #include "fsm.h"
38  #include "log.h"
39  #include "mbuf.h"
40  #include "acf.h"
41  #include "proto.h"
42  #include "throughput.h"
43  #include "lqr.h"
44  #include "hdlc.h"
45  #include "lcp.h"
46  #include "ccp.h"
47  #include "link.h"
48  #include "descriptor.h"
49  #include "async.h"
50  #include "physical.h"
51  
52  int
53  acf_WrapperOctets(struct lcp *lcp, u_short proto)
54  {
55    return (proto == PROTO_LCP || lcp->his_acfcomp == 0) ? 2 : 0;
56  }
57  
58  static struct mbuf *
59  acf_LayerPush(struct bundle *b __unused, struct link *l, struct mbuf *bp,
60                int pri __unused, u_short *proto)
61  {
62    const u_char cp[2] = { HDLC_ADDR, HDLC_UI };
63  
64    if (*proto == PROTO_LCP || l->lcp.his_acfcomp == 0) {
65      bp = m_prepend(bp, cp, 2, 0);
66      m_settype(bp, MB_ACFOUT);
67    }
68  
69    return bp;
70  }
71  
72  static struct mbuf *
73  acf_LayerPull(struct bundle *b __unused, struct link *l, struct mbuf *bp,
74  	      u_short *proto __unused)
75  {
76    struct physical *p = link2physical(l);
77    u_char cp[2];
78  
79    if (!p) {
80      log_Printf(LogERROR, "Can't Pull an acf packet from a logical link\n");
81      return bp;
82    }
83  
84    if (mbuf_View(bp, cp, 2) == 2) {
85      if (!p->link.lcp.want_acfcomp) {
86        /* We expect the packet not to be compressed */
87        bp = mbuf_Read(bp, cp, 2);
88        if (cp[0] != HDLC_ADDR) {
89          p->hdlc.lqm.ifInErrors++;
90          p->hdlc.stats.badaddr++;
91          log_Printf(LogDEBUG, "acf_LayerPull: addr 0x%02x\n", cp[0]);
92          m_freem(bp);
93          return NULL;
94        }
95        if (cp[1] != HDLC_UI) {
96          p->hdlc.lqm.ifInErrors++;
97          p->hdlc.stats.badcommand++;
98          log_Printf(LogDEBUG, "acf_LayerPull: control 0x%02x\n", cp[1]);
99          m_freem(bp);
100          return NULL;
101        }
102        m_settype(bp, MB_ACFIN);
103      } else if (cp[0] == HDLC_ADDR && cp[1] == HDLC_UI) {
104        /*
105         * We can receive compressed packets, but the peer still sends
106         * uncompressed packets (or maybe this is a PROTO_LCP packet) !
107         */
108        bp = mbuf_Read(bp, cp, 2);
109        m_settype(bp, MB_ACFIN);
110      }
111    }
112  
113    return bp;
114  }
115  
116  struct layer acflayer = { LAYER_ACF, "acf", acf_LayerPush, acf_LayerPull };
117