annotate packages/net/ppp/current/src/fsm.c @ 1586:e0d88dc6a92f

Added PPP network support.
author nickg
date Wed, 14 Apr 2004 15:08:56 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1586
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
1 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
2 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
3 // src/fsm.c
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
4 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
5 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
6 //####ECOSGPLCOPYRIGHTBEGIN####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
7 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
8 // This file is part of eCos, the Embedded Configurable Operating System.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
9 // Portions created by Nick Garnett are
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
10 // Copyright (C) 2003 eCosCentric Ltd.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
11 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
12 // eCos is free software; you can redistribute it and/or modify it under
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
13 // the terms of the GNU General Public License as published by the Free
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
14 // Software Foundation; either version 2 or (at your option) any later version.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
15 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
16 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
18 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
19 // for more details.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
20 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
21 // You should have received a copy of the GNU General Public License along
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
22 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
23 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
24 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
25 // As a special exception, if other files instantiate templates or use macros
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
26 // or inline functions from this file, or you compile this file and link it
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
27 // with other works to produce a work based on this file, this file does not
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
28 // by itself cause the resulting work to be covered by the GNU General Public
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
29 // License. However the source code for this file must still be made available
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
30 // in accordance with section (3) of the GNU General Public License.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
31 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
32 // This exception does not invalidate any other reasons why a work based on
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
33 // this file might be covered by the GNU General Public License.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
34 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
35 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
36 //####ECOSGPLCOPYRIGHTEND####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
37 //####BSDCOPYRIGHTBEGIN####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
38 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
39 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
40 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
41 // Portions of this software may have been derived from OpenBSD,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
42 // FreeBSD or other sources, and are covered by the appropriate
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
43 // copyright disclaimers included herein.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
44 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
45 // -------------------------------------------
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
46 //
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
47 //####BSDCOPYRIGHTEND####
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
48 //==========================================================================
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
49
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
50 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
51 * fsm.c - {Link, IP} Control Protocol Finite State Machine.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
52 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
53 * Copyright (c) 1989 Carnegie Mellon University.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
54 * All rights reserved.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
55 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
56 * Redistribution and use in source and binary forms are permitted
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
57 * provided that the above copyright notice and this paragraph are
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
58 * duplicated in all such forms and that any documentation,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
59 * advertising materials, and other materials related to such
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
60 * distribution and use acknowledge that the software was developed
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
61 * by Carnegie Mellon University. The name of the
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
62 * University may not be used to endorse or promote products derived
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
63 * from this software without specific prior written permission.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
64 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
65 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
66 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
67 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
68
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
69 #ifndef lint
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
70 //static char rcsid[] = "$FreeBSD: src/usr.sbin/pppd/fsm.c,v 1.8 1999/08/28 01:19:02 peter Exp $";
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
71 #endif
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
72
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
73 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
74 * TODO:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
75 * Randomize fsm id on link/init.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
76 * Deal with variable outgoing MTU.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
77 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
78
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
79 #include <stdio.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
80 #include <string.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
81 #include <sys/types.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
82 #include <cyg/ppp/syslog.h>
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
83
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
84 #include "cyg/ppp/pppd.h"
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
85 #include "cyg/ppp/fsm.h"
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
86
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
87 static void fsm_timeout __P((void *));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
88 static void fsm_rconfreq __P((fsm *, int, u_char *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
89 static void fsm_rconfack __P((fsm *, int, u_char *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
90 static void fsm_rconfnakrej __P((fsm *, int, int, u_char *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
91 static void fsm_rtermreq __P((fsm *, int, u_char *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
92 static void fsm_rtermack __P((fsm *));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
93 static void fsm_rcoderej __P((fsm *, u_char *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
94 static void fsm_sconfreq __P((fsm *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
95
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
96 #define PROTO_NAME(f) ((f)->callbacks->proto_name)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
97
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
98 int peer_mru[NUM_PPP];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
99
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
100
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
101 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
102 * fsm_init - Initialize fsm.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
103 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
104 * Initialize fsm state.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
105 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
106 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
107 fsm_init(f)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
108 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
109 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
110 f->state = INITIAL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
111 f->flags = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
112 f->id = 0; /* XXX Start with random id? */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
113 f->timeouttime = DEFTIMEOUT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
114 f->maxconfreqtransmits = DEFMAXCONFREQS;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
115 f->maxtermtransmits = DEFMAXTERMREQS;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
116 f->maxnakloops = DEFMAXNAKLOOPS;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
117 f->term_reason_len = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
118 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
119
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
120
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
121 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
122 * fsm_lowerup - The lower layer is up.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
123 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
124 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
125 fsm_lowerup(f)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
126 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
127 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
128 switch( f->state ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
129 case INITIAL:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
130 f->state = CLOSED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
131 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
132
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
133 case STARTING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
134 if( f->flags & OPT_SILENT )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
135 f->state = STOPPED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
136 else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
137 /* Send an initial configure-request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
138 fsm_sconfreq(f, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
139 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
140 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
141 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
142
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
143 default:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
144 FSMDEBUG((LOG_INFO, "%s: Up event in state %d!",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
145 PROTO_NAME(f), f->state));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
146 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
147 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
148
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
149
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
150 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
151 * fsm_lowerdown - The lower layer is down.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
152 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
153 * Cancel all timeouts and inform upper layers.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
154 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
155 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
156 fsm_lowerdown(f)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
157 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
158 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
159 switch( f->state ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
160 case CLOSED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
161 f->state = INITIAL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
162 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
163
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
164 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
165 f->state = STARTING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
166 if( f->callbacks->starting )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
167 (*f->callbacks->starting)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
168 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
169
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
170 case CLOSING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
171 f->state = INITIAL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
172 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
173 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
174
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
175 case STOPPING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
176 case REQSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
177 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
178 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
179 f->state = STARTING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
180 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
181 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
182
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
183 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
184 if( f->callbacks->down )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
185 (*f->callbacks->down)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
186 f->state = STARTING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
187 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
188
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
189 default:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
190 FSMDEBUG((LOG_INFO, "%s: Down event in state %d!",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
191 PROTO_NAME(f), f->state));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
192 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
193 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
194
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
195
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
196 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
197 * fsm_open - Link is allowed to come up.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
198 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
199 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
200 fsm_open(f)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
201 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
202 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
203 switch( f->state ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
204 case INITIAL:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
205 f->state = STARTING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
206 if( f->callbacks->starting )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
207 (*f->callbacks->starting)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
208 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
209
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
210 case CLOSED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
211 if( f->flags & OPT_SILENT )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
212 f->state = STOPPED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
213 else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
214 /* Send an initial configure-request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
215 fsm_sconfreq(f, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
216 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
217 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
218 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
219
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
220 case CLOSING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
221 f->state = STOPPING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
222 /* fall through */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
223 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
224 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
225 if( f->flags & OPT_RESTART ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
226 fsm_lowerdown(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
227 fsm_lowerup(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
228 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
229 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
230 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
231 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
232
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
233
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
234 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
235 * fsm_close - Start closing connection.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
236 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
237 * Cancel timeouts and either initiate close or possibly go directly to
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
238 * the CLOSED state.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
239 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
240 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
241 fsm_close(f, reason)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
242 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
243 char *reason;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
244 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
245 f->term_reason = reason;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
246 f->term_reason_len = (reason == NULL? 0: strlen(reason));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
247 switch( f->state ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
248 case STARTING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
249 f->state = INITIAL;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
250 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
251 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
252 f->state = CLOSED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
253 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
254 case STOPPING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
255 f->state = CLOSING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
256 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
257
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
258 case REQSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
259 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
260 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
261 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
262 if( f->state != OPENED )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
263 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
264 else if( f->callbacks->down )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
265 (*f->callbacks->down)(f); /* Inform upper layers we're down */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
266
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
267 /* Init restart counter, send Terminate-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
268 f->retransmits = f->maxtermtransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
269 fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
270 (u_char *) f->term_reason, f->term_reason_len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
271 TIMEOUT(fsm_timeout, f, f->timeouttime);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
272 --f->retransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
273
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
274 f->state = CLOSING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
275 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
276 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
277 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
278
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
279
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
280 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
281 * fsm_timeout - Timeout expired.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
282 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
283 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
284 fsm_timeout(arg)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
285 void *arg;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
286 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
287 fsm *f = (fsm *) arg;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
288
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
289 switch (f->state) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
290 case CLOSING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
291 case STOPPING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
292 if( f->retransmits <= 0 ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
293 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
294 * We've waited for an ack long enough. Peer probably heard us.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
295 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
296 f->state = (f->state == CLOSING)? CLOSED: STOPPED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
297 if( f->callbacks->finished )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
298 (*f->callbacks->finished)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
299 } else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
300 /* Send Terminate-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
301 fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
302 (u_char *) f->term_reason, f->term_reason_len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
303 TIMEOUT(fsm_timeout, f, f->timeouttime);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
304 --f->retransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
305 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
306 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
307
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
308 case REQSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
309 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
310 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
311 if (f->retransmits <= 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
312 syslog(LOG_WARNING, "%s: timeout sending Config-Requests",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
313 PROTO_NAME(f));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
314 f->state = STOPPED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
315 if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
316 (*f->callbacks->finished)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
317
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
318 } else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
319 /* Retransmit the configure-request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
320 if (f->callbacks->retransmit)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
321 (*f->callbacks->retransmit)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
322 fsm_sconfreq(f, 1); /* Re-send Configure-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
323 if( f->state == ACKRCVD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
324 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
325 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
326 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
327
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
328 default:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
329 FSMDEBUG((LOG_INFO, "%s: Timeout event in state %d!",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
330 PROTO_NAME(f), f->state));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
331 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
332 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
333
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
334
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
335 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
336 * fsm_input - Input packet.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
337 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
338 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
339 fsm_input(f, inpacket, l)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
340 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
341 u_char *inpacket;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
342 int l;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
343 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
344 u_char *inp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
345 u_char code, id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
346 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
347
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
348 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
349 * Parse header (code, id and length).
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
350 * If packet too short, drop it.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
351 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
352 inp = inpacket;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
353 if (l < HEADERLEN) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
354 FSMDEBUG((LOG_WARNING, "fsm_input(%x): Rcvd short header.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
355 f->protocol));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
356 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
357 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
358 GETCHAR(code, inp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
359 GETCHAR(id, inp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
360 GETSHORT(len, inp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
361 if (len < HEADERLEN) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
362 FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd illegal length.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
363 f->protocol));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
364 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
365 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
366 if (len > l) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
367 FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd short packet.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
368 f->protocol));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
369 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
370 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
371 len -= HEADERLEN; /* subtract header length */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
372
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
373 if( f->state == INITIAL || f->state == STARTING ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
374 FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd packet in state %d.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
375 f->protocol, f->state));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
376 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
377 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
378
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
379 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
380 * Action depends on code.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
381 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
382 switch (code) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
383 case CONFREQ:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
384 fsm_rconfreq(f, id, inp, len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
385 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
386
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
387 case CONFACK:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
388 fsm_rconfack(f, id, inp, len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
389 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
390
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
391 case CONFNAK:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
392 case CONFREJ:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
393 fsm_rconfnakrej(f, code, id, inp, len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
394 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
395
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
396 case TERMREQ:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
397 fsm_rtermreq(f, id, inp, len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
398 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
399
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
400 case TERMACK:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
401 fsm_rtermack(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
402 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
403
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
404 case CODEREJ:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
405 fsm_rcoderej(f, inp, len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
406 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
407
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
408 default:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
409 if( !f->callbacks->extcode
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
410 || !(*f->callbacks->extcode)(f, code, id, inp, len) )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
411 fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
412 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
413 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
414 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
415
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
416
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
417 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
418 * fsm_rconfreq - Receive Configure-Request.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
419 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
420 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
421 fsm_rconfreq(f, id, inp, len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
422 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
423 u_char id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
424 u_char *inp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
425 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
426 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
427 int code, reject_if_disagree;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
428
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
429 FSMDEBUG((LOG_INFO, "fsm_rconfreq(%s): Rcvd id %d.", PROTO_NAME(f), id));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
430 switch( f->state ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
431 case CLOSED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
432 /* Go away, we're closed */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
433 fsm_sdata(f, TERMACK, id, NULL, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
434 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
435 case CLOSING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
436 case STOPPING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
437 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
438
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
439 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
440 /* Go down and restart negotiation */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
441 if( f->callbacks->down )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
442 (*f->callbacks->down)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
443 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
444 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
445
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
446 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
447 /* Negotiation started by our peer */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
448 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
449 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
450 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
451 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
452
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
453 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
454 * Pass the requested configuration options
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
455 * to protocol-specific code for checking.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
456 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
457 if (f->callbacks->reqci){ /* Check CI */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
458 reject_if_disagree = (f->nakloops >= f->maxnakloops);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
459 code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
460 } else if (len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
461 code = CONFREJ; /* Reject all CI */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
462 else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
463 code = CONFACK;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
464
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
465 /* send the Ack, Nak or Rej to the peer */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
466 fsm_sdata(f, code, id, inp, len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
467
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
468 if (code == CONFACK) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
469 if (f->state == ACKRCVD) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
470 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
471 f->state = OPENED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
472 if (f->callbacks->up)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
473 (*f->callbacks->up)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
474 } else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
475 f->state = ACKSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
476 f->nakloops = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
477
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
478 } else {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
479 /* we sent CONFACK or CONFREJ */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
480 if (f->state != ACKRCVD)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
481 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
482 if( code == CONFNAK )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
483 ++f->nakloops;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
484 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
485 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
486
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
487
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
488 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
489 * fsm_rconfack - Receive Configure-Ack.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
490 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
491 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
492 fsm_rconfack(f, id, inp, len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
493 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
494 int id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
495 u_char *inp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
496 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
497 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
498 FSMDEBUG((LOG_INFO, "fsm_rconfack(%s): Rcvd id %d.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
499 PROTO_NAME(f), id));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
500
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
501 if (id != f->reqid || f->seen_ack) /* Expected id? */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
502 return; /* Nope, toss... */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
503 if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
504 (len == 0)) ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
505 /* Ack is bad - ignore it */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
506 log_packet(inp, len, "Received bad configure-ack: ", LOG_ERR);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
507 FSMDEBUG((LOG_INFO, "%s: received bad Ack (length %d)",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
508 PROTO_NAME(f), len));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
509 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
510 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
511 f->seen_ack = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
512
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
513 switch (f->state) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
514 case CLOSED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
515 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
516 fsm_sdata(f, TERMACK, id, NULL, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
517 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
518
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
519 case REQSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
520 f->state = ACKRCVD;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
521 f->retransmits = f->maxconfreqtransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
522 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
523
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
524 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
525 /* Huh? an extra valid Ack? oh well... */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
526 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
527 fsm_sconfreq(f, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
528 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
529 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
530
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
531 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
532 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
533 f->state = OPENED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
534 f->retransmits = f->maxconfreqtransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
535 if (f->callbacks->up)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
536 (*f->callbacks->up)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
537 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
538
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
539 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
540 /* Go down and restart negotiation */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
541 if (f->callbacks->down)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
542 (*f->callbacks->down)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
543 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
544 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
545 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
546 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
547 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
548
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
549
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
550 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
551 * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
552 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
553 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
554 fsm_rconfnakrej(f, code, id, inp, len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
555 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
556 int code, id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
557 u_char *inp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
558 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
559 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
560 int (*proc) __P((fsm *, u_char *, int));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
561 int ret;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
562
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
563 FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
564 PROTO_NAME(f), id));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
565
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
566 if (id != f->reqid || f->seen_ack) /* Expected id? */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
567 return; /* Nope, toss... */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
568 proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
569 if (!proc || !(ret = proc(f, inp, len))) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
570 /* Nak/reject is bad - ignore it */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
571 log_packet(inp, len, "Received bad configure-nak/rej: ", LOG_ERR);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
572 FSMDEBUG((LOG_INFO, "%s: received bad %s (length %d)",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
573 PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
574 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
575 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
576 f->seen_ack = 1;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
577
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
578 switch (f->state) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
579 case CLOSED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
580 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
581 fsm_sdata(f, TERMACK, id, NULL, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
582 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
583
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
584 case REQSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
585 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
586 /* They didn't agree to what we wanted - try another request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
587 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
588 if (ret < 0)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
589 f->state = STOPPED; /* kludge for stopping CCP */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
590 else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
591 fsm_sconfreq(f, 0); /* Send Configure-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
592 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
593
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
594 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
595 /* Got a Nak/reject when we had already had an Ack?? oh well... */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
596 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
597 fsm_sconfreq(f, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
598 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
599 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
600
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
601 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
602 /* Go down and restart negotiation */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
603 if (f->callbacks->down)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
604 (*f->callbacks->down)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
605 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
606 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
607 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
608 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
609 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
610
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
611
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
612 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
613 * fsm_rtermreq - Receive Terminate-Req.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
614 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
615 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
616 fsm_rtermreq(f, id, p, len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
617 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
618 int id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
619 u_char *p;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
620 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
621 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
622 char str[80];
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
623
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
624 FSMDEBUG((LOG_INFO, "fsm_rtermreq(%s): Rcvd id %d.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
625 PROTO_NAME(f), id));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
626
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
627 switch (f->state) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
628 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
629 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
630 f->state = REQSENT; /* Start over but keep trying */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
631 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
632
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
633 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
634 if (len > 0) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
635 fmtmsg(str, sizeof(str), "%0.*v", len, p);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
636 syslog(LOG_INFO, "%s terminated by peer (%s)", PROTO_NAME(f), str);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
637 } else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
638 syslog(LOG_INFO, "%s terminated by peer", PROTO_NAME(f));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
639 if (f->callbacks->down)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
640 (*f->callbacks->down)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
641 f->retransmits = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
642 f->state = STOPPING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
643 TIMEOUT(fsm_timeout, f, f->timeouttime);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
644 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
645 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
646
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
647 fsm_sdata(f, TERMACK, id, NULL, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
648 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
649
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
650
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
651 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
652 * fsm_rtermack - Receive Terminate-Ack.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
653 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
654 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
655 fsm_rtermack(f)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
656 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
657 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
658 FSMDEBUG((LOG_INFO, "fsm_rtermack(%s).", PROTO_NAME(f)));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
659
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
660 switch (f->state) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
661 case CLOSING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
662 UNTIMEOUT(fsm_timeout, f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
663 f->state = CLOSED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
664 if( f->callbacks->finished )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
665 (*f->callbacks->finished)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
666 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
667 case STOPPING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
668 UNTIMEOUT(fsm_timeout, f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
669 f->state = STOPPED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
670 if( f->callbacks->finished )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
671 (*f->callbacks->finished)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
672 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
673
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
674 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
675 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
676 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
677
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
678 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
679 if (f->callbacks->down)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
680 (*f->callbacks->down)(f); /* Inform upper layers */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
681 fsm_sconfreq(f, 0);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
682 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
683 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
684 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
685
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
686
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
687 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
688 * fsm_rcoderej - Receive an Code-Reject.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
689 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
690 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
691 fsm_rcoderej(f, inp, len)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
692 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
693 u_char *inp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
694 int len;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
695 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
696 u_char code, id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
697
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
698 FSMDEBUG((LOG_INFO, "fsm_rcoderej(%s).", PROTO_NAME(f)));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
699
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
700 if (len < HEADERLEN) {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
701 FSMDEBUG((LOG_INFO, "fsm_rcoderej: Rcvd short Code-Reject packet!"));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
702 return;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
703 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
704 GETCHAR(code, inp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
705 GETCHAR(id, inp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
706 syslog(LOG_WARNING, "%s: Rcvd Code-Reject for code %d, id %d",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
707 PROTO_NAME(f), code, id);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
708
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
709 if( f->state == ACKRCVD )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
710 f->state = REQSENT;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
711 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
712
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
713
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
714 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
715 * fsm_protreject - Peer doesn't speak this protocol.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
716 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
717 * Treat this as a catastrophic error (RXJ-).
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
718 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
719 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
720 fsm_protreject(f)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
721 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
722 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
723 switch( f->state ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
724 case CLOSING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
725 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
726 /* fall through */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
727 case CLOSED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
728 f->state = CLOSED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
729 if( f->callbacks->finished )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
730 (*f->callbacks->finished)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
731 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
732
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
733 case STOPPING:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
734 case REQSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
735 case ACKRCVD:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
736 case ACKSENT:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
737 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
738 /* fall through */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
739 case STOPPED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
740 f->state = STOPPED;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
741 if( f->callbacks->finished )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
742 (*f->callbacks->finished)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
743 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
744
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
745 case OPENED:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
746 if( f->callbacks->down )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
747 (*f->callbacks->down)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
748
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
749 /* Init restart counter, send Terminate-Request */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
750 f->retransmits = f->maxtermtransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
751 fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
752 (u_char *) f->term_reason, f->term_reason_len);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
753 TIMEOUT(fsm_timeout, f, f->timeouttime);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
754 --f->retransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
755
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
756 f->state = STOPPING;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
757 break;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
758
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
759 default:
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
760 FSMDEBUG((LOG_INFO, "%s: Protocol-reject event in state %d!",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
761 PROTO_NAME(f), f->state));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
762 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
763 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
764
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
765
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
766 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
767 * fsm_sconfreq - Send a Configure-Request.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
768 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
769 static void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
770 fsm_sconfreq(f, retransmit)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
771 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
772 int retransmit;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
773 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
774 u_char *outp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
775 int cilen;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
776
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
777 if( f->state != REQSENT && f->state != ACKRCVD && f->state != ACKSENT ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
778 /* Not currently negotiating - reset options */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
779 if( f->callbacks->resetci )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
780 (*f->callbacks->resetci)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
781 f->nakloops = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
782 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
783
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
784 if( !retransmit ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
785 /* New request - reset retransmission counter, use new ID */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
786 f->retransmits = f->maxconfreqtransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
787 f->reqid = ++f->id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
788 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
789
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
790 f->seen_ack = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
791
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
792 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
793 * Make up the request packet
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
794 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
795 outp = outpacket_buf + PPP_HDRLEN + HEADERLEN;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
796 if( f->callbacks->cilen && f->callbacks->addci ){
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
797 cilen = (*f->callbacks->cilen)(f);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
798 if( cilen > peer_mru[f->unit] - HEADERLEN )
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
799 cilen = peer_mru[f->unit] - HEADERLEN;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
800 if (f->callbacks->addci)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
801 (*f->callbacks->addci)(f, outp, &cilen);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
802 } else
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
803 cilen = 0;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
804
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
805 /* send the request to our peer */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
806 fsm_sdata(f, CONFREQ, f->reqid, outp, cilen);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
807
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
808 /* start the retransmit timer */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
809 --f->retransmits;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
810 TIMEOUT(fsm_timeout, f, f->timeouttime);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
811
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
812 FSMDEBUG((LOG_INFO, "%s: sending Configure-Request, id %d",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
813 PROTO_NAME(f), f->reqid));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
814 }
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
815
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
816
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
817 /*
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
818 * fsm_sdata - Send some data.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
819 *
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
820 * Used for all packets sent to our peer by this module.
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
821 */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
822 void
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
823 fsm_sdata(f, code, id, data, datalen)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
824 fsm *f;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
825 u_char code, id;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
826 u_char *data;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
827 int datalen;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
828 {
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
829 u_char *outp;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
830 int outlen;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
831
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
832 /* Adjust length to be smaller than MTU */
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
833 outp = outpacket_buf;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
834 if (datalen > peer_mru[f->unit] - HEADERLEN)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
835 datalen = peer_mru[f->unit] - HEADERLEN;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
836 if (datalen && data != outp + PPP_HDRLEN + HEADERLEN)
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
837 BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
838 outlen = datalen + HEADERLEN;
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
839 MAKEHEADER(outp, f->protocol);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
840 PUTCHAR(code, outp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
841 PUTCHAR(id, outp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
842 PUTSHORT(outlen, outp);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
843 output(f->unit, outpacket_buf, outlen + PPP_HDRLEN);
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
844
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
845 FSMDEBUG((LOG_INFO, "fsm_sdata(%s): Sent code %d, id %d.",
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
846 PROTO_NAME(f), code, id));
e0d88dc6a92f Added PPP network support.
nickg
parents:
diff changeset
847 }