1/*-
2 * Copyright (c) 1996 - 2001 Brian Somers <brian@Awfulhak.org>
3 *          based on work by Toshiharu OHNO <tony-o@iij.ad.jp>
4 *                           Internet Initiative Japan, Inc (IIJ)
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD$
29 */
30
31#define	CCP_MAXCODE	CODE_RESETACK
32
33#define	TY_OUI		0	/* OUI */
34#define	TY_PRED1	1	/* Predictor type 1 */
35#define	TY_PRED2	2	/* Predictor type 2 */
36#define	TY_PUDDLE	3	/* Puddle Jumper */
37#define	TY_HWPPC	16	/* Hewlett-Packard PPC */
38#define	TY_STAC		17	/* Stac Electronics LZS */
39#define	TY_MSPPC	18	/* Microsoft PPC */
40#define	TY_MPPE		18	/* Microsoft PPE */
41#define	TY_GAND		19	/* Gandalf FZA */
42#define	TY_V42BIS	20	/* V.42bis compression */
43#define	TY_BSD		21	/* BSD LZW Compress */
44#define	TY_PPPD_DEFLATE	24	/* Deflate (gzip) - (mis) numbered by pppd */
45#define	TY_DEFLATE	26	/* Deflate (gzip) - rfc 1979 */
46
47#define CCP_NEG_DEFLATE		0
48#define CCP_NEG_PRED1		1
49#define CCP_NEG_DEFLATE24	2
50#ifndef NODES
51#define CCP_NEG_MPPE		3
52#define CCP_NEG_TOTAL		4
53#else
54#define CCP_NEG_TOTAL		3
55#endif
56
57#ifndef NODES
58enum mppe_negstate {
59  MPPE_ANYSTATE,
60  MPPE_STATELESS,
61  MPPE_STATEFUL
62};
63#endif
64
65struct mbuf;
66struct link;
67
68struct ccp_config {
69  struct {
70    struct {
71      int winsize;
72    } in, out;
73  } deflate;
74#ifndef NODES
75  struct {
76    int keybits;
77    enum mppe_negstate state;
78    unsigned required : 1;
79  } mppe;
80#endif
81  struct fsm_retry fsm;	/* How often/frequently to resend requests */
82  unsigned neg[CCP_NEG_TOTAL];
83};
84
85struct ccp_opt {
86  struct ccp_opt *next;
87  int algorithm;
88  struct fsm_opt val;
89};
90
91struct ccp {
92  struct fsm fsm;		/* The finite state machine */
93
94  int his_proto;		/* peer's compression protocol */
95  int my_proto;			/* our compression protocol */
96
97  int reset_sent;		/* If != -1, ignore compressed 'till ack */
98  int last_reset;		/* We can receive more (dups) w/ this id */
99
100  struct {
101    int algorithm;		/* Algorithm in use */
102    void *state;		/* Returned by implementations Init() */
103    struct fsm_opt opt;		/* Set by implementation's OptInit() */
104  } in;
105
106  struct {
107    int algorithm;		/* Algorithm in use */
108    void *state;		/* Returned by implementations Init() */
109    struct ccp_opt *opt;	/* Set by implementation's OptInit() */
110  } out;
111
112  u_int32_t his_reject;		/* Request codes rejected by peer */
113  u_int32_t my_reject;		/* Request codes I have rejected */
114
115  u_long uncompout, compout;	/* Outgoing bytes before/after compression */
116  u_long uncompin, compin;	/* Incoming bytes after/before decompression */
117
118  struct ccp_config cfg;
119};
120
121#define fsm2ccp(fp) (fp->proto == PROTO_CCP ? (struct ccp *)fp : NULL)
122
123struct ccp_algorithm {
124  int id;
125  int Neg;					/* ccp_config neg array item */
126  const char *(*Disp)(struct fsm_opt *);	/* Use result immediately !  */
127  int (*Usable)(struct fsm *);			/* Ok to negotiate ? */
128  int (*Required)(struct fsm *);		/* Must negotiate ? */
129  struct {
130    int (*Set)(struct bundle *, struct fsm_opt *, const struct ccp_config *);
131    void *(*Init)(struct bundle *, struct fsm_opt *);
132    void (*Term)(void *);
133    void (*Reset)(void *);
134    struct mbuf *(*Read)(void *, struct ccp *, u_short *, struct mbuf *);
135    void (*DictSetup)(void *, struct ccp *, u_short, struct mbuf *);
136  } i;
137  struct {
138    int MTUOverhead;
139    void (*OptInit)(struct bundle *, struct fsm_opt *,
140                    const struct ccp_config *);
141    int (*Set)(struct bundle *, struct fsm_opt *, const struct ccp_config *);
142    void *(*Init)(struct bundle *, struct fsm_opt *);
143    void (*Term)(void *);
144    int (*Reset)(void *);
145    struct mbuf *(*Write)(void *, struct ccp *, struct link *, int, u_short *,
146                          struct mbuf *);
147  } o;
148};
149
150extern void ccp_Init(struct ccp *, struct bundle *, struct link *,
151                     const struct fsm_parent *);
152extern void ccp_Setup(struct ccp *);
153extern int ccp_Required(struct ccp *);
154extern int ccp_MTUOverhead(struct ccp *);
155
156extern void ccp_SendResetReq(struct fsm *);
157extern struct mbuf *ccp_Input(struct bundle *, struct link *, struct mbuf *);
158extern int ccp_ReportStatus(struct cmdargs const *);
159extern u_short ccp_Proto(struct ccp *);
160extern void ccp_SetupCallbacks(struct ccp *);
161extern int ccp_SetOpenMode(struct ccp *);
162extern int ccp_DefaultUsable(struct fsm *);
163extern int ccp_DefaultRequired(struct fsm *);
164
165extern struct layer ccplayer;
166