Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1 /*****************************************************************************
Michael J. Spencer 1:f5ac63519541 2 * fsm.c - Network Control Protocol Finite State Machine program file.
Michael J. Spencer 1:f5ac63519541 3 *
Michael J. Spencer 1:f5ac63519541 4 * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
Michael J. Spencer 1:f5ac63519541 5 * portions Copyright (c) 1997 by Global Election Systems Inc.
Michael J. Spencer 1:f5ac63519541 6 *
Michael J. Spencer 1:f5ac63519541 7 * The authors hereby grant permission to use, copy, modify, distribute,
Michael J. Spencer 1:f5ac63519541 8 * and license this software and its documentation for any purpose, provided
Michael J. Spencer 1:f5ac63519541 9 * that existing copyright notices are retained in all copies and that this
Michael J. Spencer 1:f5ac63519541 10 * notice and the following disclaimer are included verbatim in any
Michael J. Spencer 1:f5ac63519541 11 * distributions. No written agreement, license, or royalty fee is required
Michael J. Spencer 1:f5ac63519541 12 * for any of the authorized uses.
Michael J. Spencer 1:f5ac63519541 13 *
Michael J. Spencer 1:f5ac63519541 14 * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
Michael J. Spencer 1:f5ac63519541 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Michael J. Spencer 1:f5ac63519541 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Michael J. Spencer 1:f5ac63519541 17 * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
Michael J. Spencer 1:f5ac63519541 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Michael J. Spencer 1:f5ac63519541 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Michael J. Spencer 1:f5ac63519541 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Michael J. Spencer 1:f5ac63519541 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Michael J. Spencer 1:f5ac63519541 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Michael J. Spencer 1:f5ac63519541 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Michael J. Spencer 1:f5ac63519541 24 *
Michael J. Spencer 1:f5ac63519541 25 ******************************************************************************
Michael J. Spencer 1:f5ac63519541 26 * REVISION HISTORY
Michael J. Spencer 1:f5ac63519541 27 *
Michael J. Spencer 1:f5ac63519541 28 * 03-01-01 Marc Boucher <marc@mbsi.ca>
Michael J. Spencer 1:f5ac63519541 29 * Ported to lwIP.
Michael J. Spencer 1:f5ac63519541 30 * 97-12-01 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
Michael J. Spencer 1:f5ac63519541 31 * Original based on BSD fsm.c.
Michael J. Spencer 1:f5ac63519541 32 *****************************************************************************/
Michael J. Spencer 1:f5ac63519541 33 /*
Michael J. Spencer 1:f5ac63519541 34 * fsm.c - {Link, IP} Control Protocol Finite State Machine.
Michael J. Spencer 1:f5ac63519541 35 *
Michael J. Spencer 1:f5ac63519541 36 * Copyright (c) 1989 Carnegie Mellon University.
Michael J. Spencer 1:f5ac63519541 37 * All rights reserved.
Michael J. Spencer 1:f5ac63519541 38 *
Michael J. Spencer 1:f5ac63519541 39 * Redistribution and use in source and binary forms are permitted
Michael J. Spencer 1:f5ac63519541 40 * provided that the above copyright notice and this paragraph are
Michael J. Spencer 1:f5ac63519541 41 * duplicated in all such forms and that any documentation,
Michael J. Spencer 1:f5ac63519541 42 * advertising materials, and other materials related to such
Michael J. Spencer 1:f5ac63519541 43 * distribution and use acknowledge that the software was developed
Michael J. Spencer 1:f5ac63519541 44 * by Carnegie Mellon University. The name of the
Michael J. Spencer 1:f5ac63519541 45 * University may not be used to endorse or promote products derived
Michael J. Spencer 1:f5ac63519541 46 * from this software without specific prior written permission.
Michael J. Spencer 1:f5ac63519541 47 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
Michael J. Spencer 1:f5ac63519541 48 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
Michael J. Spencer 1:f5ac63519541 49 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Michael J. Spencer 1:f5ac63519541 50 */
Michael J. Spencer 1:f5ac63519541 51
Michael J. Spencer 1:f5ac63519541 52 /*
Michael J. Spencer 1:f5ac63519541 53 * TODO:
Michael J. Spencer 1:f5ac63519541 54 * Randomize fsm id on link/init.
Michael J. Spencer 1:f5ac63519541 55 * Deal with variable outgoing MTU.
Michael J. Spencer 1:f5ac63519541 56 */
Michael J. Spencer 1:f5ac63519541 57
Michael J. Spencer 1:f5ac63519541 58 #include "lwip/opt.h"
Michael J. Spencer 1:f5ac63519541 59
Michael J. Spencer 1:f5ac63519541 60 #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
Michael J. Spencer 1:f5ac63519541 61
Michael J. Spencer 1:f5ac63519541 62 #include "ppp.h"
Michael J. Spencer 1:f5ac63519541 63 #include "pppdebug.h"
Michael J. Spencer 1:f5ac63519541 64
Michael J. Spencer 1:f5ac63519541 65 #include "fsm.h"
Michael J. Spencer 1:f5ac63519541 66
Michael J. Spencer 1:f5ac63519541 67 #include <string.h>
Michael J. Spencer 1:f5ac63519541 68
Michael J. Spencer 1:f5ac63519541 69 #if PPP_DEBUG
Michael J. Spencer 1:f5ac63519541 70 static const char *ppperr_strerr[] = {
Michael J. Spencer 1:f5ac63519541 71 "LS_INITIAL", /* LS_INITIAL 0 */
Michael J. Spencer 1:f5ac63519541 72 "LS_STARTING", /* LS_STARTING 1 */
Michael J. Spencer 1:f5ac63519541 73 "LS_CLOSED", /* LS_CLOSED 2 */
Michael J. Spencer 1:f5ac63519541 74 "LS_STOPPED", /* LS_STOPPED 3 */
Michael J. Spencer 1:f5ac63519541 75 "LS_CLOSING", /* LS_CLOSING 4 */
Michael J. Spencer 1:f5ac63519541 76 "LS_STOPPING", /* LS_STOPPING 5 */
Michael J. Spencer 1:f5ac63519541 77 "LS_REQSENT", /* LS_REQSENT 6 */
Michael J. Spencer 1:f5ac63519541 78 "LS_ACKRCVD", /* LS_ACKRCVD 7 */
Michael J. Spencer 1:f5ac63519541 79 "LS_ACKSENT", /* LS_ACKSENT 8 */
Michael J. Spencer 1:f5ac63519541 80 "LS_OPENED" /* LS_OPENED 9 */
Michael J. Spencer 1:f5ac63519541 81 };
Michael J. Spencer 1:f5ac63519541 82 #endif /* PPP_DEBUG */
Michael J. Spencer 1:f5ac63519541 83
Michael J. Spencer 1:f5ac63519541 84 static void fsm_timeout (void *);
Michael J. Spencer 1:f5ac63519541 85 static void fsm_rconfreq (fsm *, u_char, u_char *, int);
Michael J. Spencer 1:f5ac63519541 86 static void fsm_rconfack (fsm *, int, u_char *, int);
Michael J. Spencer 1:f5ac63519541 87 static void fsm_rconfnakrej (fsm *, int, int, u_char *, int);
Michael J. Spencer 1:f5ac63519541 88 static void fsm_rtermreq (fsm *, int, u_char *, int);
Michael J. Spencer 1:f5ac63519541 89 static void fsm_rtermack (fsm *);
Michael J. Spencer 1:f5ac63519541 90 static void fsm_rcoderej (fsm *, u_char *, int);
Michael J. Spencer 1:f5ac63519541 91 static void fsm_sconfreq (fsm *, int);
Michael J. Spencer 1:f5ac63519541 92
Michael J. Spencer 1:f5ac63519541 93 #define PROTO_NAME(f) ((f)->callbacks->proto_name)
Michael J. Spencer 1:f5ac63519541 94
Michael J. Spencer 1:f5ac63519541 95 int peer_mru[NUM_PPP];
Michael J. Spencer 1:f5ac63519541 96
Michael J. Spencer 1:f5ac63519541 97
Michael J. Spencer 1:f5ac63519541 98 /*
Michael J. Spencer 1:f5ac63519541 99 * fsm_init - Initialize fsm.
Michael J. Spencer 1:f5ac63519541 100 *
Michael J. Spencer 1:f5ac63519541 101 * Initialize fsm state.
Michael J. Spencer 1:f5ac63519541 102 */
Michael J. Spencer 1:f5ac63519541 103 void
Michael J. Spencer 1:f5ac63519541 104 fsm_init(fsm *f)
Michael J. Spencer 1:f5ac63519541 105 {
Michael J. Spencer 1:f5ac63519541 106 f->state = LS_INITIAL;
Michael J. Spencer 1:f5ac63519541 107 f->flags = 0;
Michael J. Spencer 1:f5ac63519541 108 f->id = 0; /* XXX Start with random id? */
Michael J. Spencer 1:f5ac63519541 109 f->timeouttime = FSM_DEFTIMEOUT;
Michael J. Spencer 1:f5ac63519541 110 f->maxconfreqtransmits = FSM_DEFMAXCONFREQS;
Michael J. Spencer 1:f5ac63519541 111 f->maxtermtransmits = FSM_DEFMAXTERMREQS;
Michael J. Spencer 1:f5ac63519541 112 f->maxnakloops = FSM_DEFMAXNAKLOOPS;
Michael J. Spencer 1:f5ac63519541 113 f->term_reason_len = 0;
Michael J. Spencer 1:f5ac63519541 114 }
Michael J. Spencer 1:f5ac63519541 115
Michael J. Spencer 1:f5ac63519541 116
Michael J. Spencer 1:f5ac63519541 117 /*
Michael J. Spencer 1:f5ac63519541 118 * fsm_lowerup - The lower layer is up.
Michael J. Spencer 1:f5ac63519541 119 */
Michael J. Spencer 1:f5ac63519541 120 void
Michael J. Spencer 1:f5ac63519541 121 fsm_lowerup(fsm *f)
Michael J. Spencer 1:f5ac63519541 122 {
Michael J. Spencer 1:f5ac63519541 123 int oldState = f->state;
Michael J. Spencer 1:f5ac63519541 124
Michael J. Spencer 1:f5ac63519541 125 LWIP_UNUSED_ARG(oldState);
Michael J. Spencer 1:f5ac63519541 126
Michael J. Spencer 1:f5ac63519541 127 switch( f->state ) {
Michael J. Spencer 1:f5ac63519541 128 case LS_INITIAL:
Michael J. Spencer 1:f5ac63519541 129 f->state = LS_CLOSED;
Michael J. Spencer 1:f5ac63519541 130 break;
Michael J. Spencer 1:f5ac63519541 131
Michael J. Spencer 1:f5ac63519541 132 case LS_STARTING:
Michael J. Spencer 1:f5ac63519541 133 if( f->flags & OPT_SILENT ) {
Michael J. Spencer 1:f5ac63519541 134 f->state = LS_STOPPED;
Michael J. Spencer 1:f5ac63519541 135 } else {
Michael J. Spencer 1:f5ac63519541 136 /* Send an initial configure-request */
Michael J. Spencer 1:f5ac63519541 137 fsm_sconfreq(f, 0);
Michael J. Spencer 1:f5ac63519541 138 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 139 }
Michael J. Spencer 1:f5ac63519541 140 break;
Michael J. Spencer 1:f5ac63519541 141
Michael J. Spencer 1:f5ac63519541 142 default:
Michael J. Spencer 1:f5ac63519541 143 FSMDEBUG(LOG_INFO, ("%s: Up event in state %d (%s)!\n",
Michael J. Spencer 1:f5ac63519541 144 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 145 }
Michael J. Spencer 1:f5ac63519541 146
Michael J. Spencer 1:f5ac63519541 147 FSMDEBUG(LOG_INFO, ("%s: lowerup state %d (%s) -> %d (%s)\n",
Michael J. Spencer 1:f5ac63519541 148 PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 149 }
Michael J. Spencer 1:f5ac63519541 150
Michael J. Spencer 1:f5ac63519541 151
Michael J. Spencer 1:f5ac63519541 152 /*
Michael J. Spencer 1:f5ac63519541 153 * fsm_lowerdown - The lower layer is down.
Michael J. Spencer 1:f5ac63519541 154 *
Michael J. Spencer 1:f5ac63519541 155 * Cancel all timeouts and inform upper layers.
Michael J. Spencer 1:f5ac63519541 156 */
Michael J. Spencer 1:f5ac63519541 157 void
Michael J. Spencer 1:f5ac63519541 158 fsm_lowerdown(fsm *f)
Michael J. Spencer 1:f5ac63519541 159 {
Michael J. Spencer 1:f5ac63519541 160 int oldState = f->state;
Michael J. Spencer 1:f5ac63519541 161
Michael J. Spencer 1:f5ac63519541 162 LWIP_UNUSED_ARG(oldState);
Michael J. Spencer 1:f5ac63519541 163
Michael J. Spencer 1:f5ac63519541 164 switch( f->state ) {
Michael J. Spencer 1:f5ac63519541 165 case LS_CLOSED:
Michael J. Spencer 1:f5ac63519541 166 f->state = LS_INITIAL;
Michael J. Spencer 1:f5ac63519541 167 break;
Michael J. Spencer 1:f5ac63519541 168
Michael J. Spencer 1:f5ac63519541 169 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 170 f->state = LS_STARTING;
Michael J. Spencer 1:f5ac63519541 171 if( f->callbacks->starting ) {
Michael J. Spencer 1:f5ac63519541 172 (*f->callbacks->starting)(f);
Michael J. Spencer 1:f5ac63519541 173 }
Michael J. Spencer 1:f5ac63519541 174 break;
Michael J. Spencer 1:f5ac63519541 175
Michael J. Spencer 1:f5ac63519541 176 case LS_CLOSING:
Michael J. Spencer 1:f5ac63519541 177 f->state = LS_INITIAL;
Michael J. Spencer 1:f5ac63519541 178 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 179 break;
Michael J. Spencer 1:f5ac63519541 180
Michael J. Spencer 1:f5ac63519541 181 case LS_STOPPING:
Michael J. Spencer 1:f5ac63519541 182 case LS_REQSENT:
Michael J. Spencer 1:f5ac63519541 183 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 184 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 185 f->state = LS_STARTING;
Michael J. Spencer 1:f5ac63519541 186 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 187 break;
Michael J. Spencer 1:f5ac63519541 188
Michael J. Spencer 1:f5ac63519541 189 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 190 if( f->callbacks->down ) {
Michael J. Spencer 1:f5ac63519541 191 (*f->callbacks->down)(f);
Michael J. Spencer 1:f5ac63519541 192 }
Michael J. Spencer 1:f5ac63519541 193 f->state = LS_STARTING;
Michael J. Spencer 1:f5ac63519541 194 break;
Michael J. Spencer 1:f5ac63519541 195
Michael J. Spencer 1:f5ac63519541 196 default:
Michael J. Spencer 1:f5ac63519541 197 FSMDEBUG(LOG_INFO, ("%s: Down event in state %d (%s)!\n",
Michael J. Spencer 1:f5ac63519541 198 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 199 }
Michael J. Spencer 1:f5ac63519541 200
Michael J. Spencer 1:f5ac63519541 201 FSMDEBUG(LOG_INFO, ("%s: lowerdown state %d (%s) -> %d (%s)\n",
Michael J. Spencer 1:f5ac63519541 202 PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 203 }
Michael J. Spencer 1:f5ac63519541 204
Michael J. Spencer 1:f5ac63519541 205
Michael J. Spencer 1:f5ac63519541 206 /*
Michael J. Spencer 1:f5ac63519541 207 * fsm_open - Link is allowed to come up.
Michael J. Spencer 1:f5ac63519541 208 */
Michael J. Spencer 1:f5ac63519541 209 void
Michael J. Spencer 1:f5ac63519541 210 fsm_open(fsm *f)
Michael J. Spencer 1:f5ac63519541 211 {
Michael J. Spencer 1:f5ac63519541 212 int oldState = f->state;
Michael J. Spencer 1:f5ac63519541 213
Michael J. Spencer 1:f5ac63519541 214 LWIP_UNUSED_ARG(oldState);
Michael J. Spencer 1:f5ac63519541 215
Michael J. Spencer 1:f5ac63519541 216 switch( f->state ) {
Michael J. Spencer 1:f5ac63519541 217 case LS_INITIAL:
Michael J. Spencer 1:f5ac63519541 218 f->state = LS_STARTING;
Michael J. Spencer 1:f5ac63519541 219 if( f->callbacks->starting ) {
Michael J. Spencer 1:f5ac63519541 220 (*f->callbacks->starting)(f);
Michael J. Spencer 1:f5ac63519541 221 }
Michael J. Spencer 1:f5ac63519541 222 break;
Michael J. Spencer 1:f5ac63519541 223
Michael J. Spencer 1:f5ac63519541 224 case LS_CLOSED:
Michael J. Spencer 1:f5ac63519541 225 if( f->flags & OPT_SILENT ) {
Michael J. Spencer 1:f5ac63519541 226 f->state = LS_STOPPED;
Michael J. Spencer 1:f5ac63519541 227 } else {
Michael J. Spencer 1:f5ac63519541 228 /* Send an initial configure-request */
Michael J. Spencer 1:f5ac63519541 229 fsm_sconfreq(f, 0);
Michael J. Spencer 1:f5ac63519541 230 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 231 }
Michael J. Spencer 1:f5ac63519541 232 break;
Michael J. Spencer 1:f5ac63519541 233
Michael J. Spencer 1:f5ac63519541 234 case LS_CLOSING:
Michael J. Spencer 1:f5ac63519541 235 f->state = LS_STOPPING;
Michael J. Spencer 1:f5ac63519541 236 /* fall through */
Michael J. Spencer 1:f5ac63519541 237 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 238 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 239 if( f->flags & OPT_RESTART ) {
Michael J. Spencer 1:f5ac63519541 240 fsm_lowerdown(f);
Michael J. Spencer 1:f5ac63519541 241 fsm_lowerup(f);
Michael J. Spencer 1:f5ac63519541 242 }
Michael J. Spencer 1:f5ac63519541 243 break;
Michael J. Spencer 1:f5ac63519541 244 }
Michael J. Spencer 1:f5ac63519541 245
Michael J. Spencer 1:f5ac63519541 246 FSMDEBUG(LOG_INFO, ("%s: open state %d (%s) -> %d (%s)\n",
Michael J. Spencer 1:f5ac63519541 247 PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 248 }
Michael J. Spencer 1:f5ac63519541 249
Michael J. Spencer 1:f5ac63519541 250 #if 0 /* backport pppd 2.4.4b1; */
Michael J. Spencer 1:f5ac63519541 251 /*
Michael J. Spencer 1:f5ac63519541 252 * terminate_layer - Start process of shutting down the FSM
Michael J. Spencer 1:f5ac63519541 253 *
Michael J. Spencer 1:f5ac63519541 254 * Cancel any timeout running, notify upper layers we're done, and
Michael J. Spencer 1:f5ac63519541 255 * send a terminate-request message as configured.
Michael J. Spencer 1:f5ac63519541 256 */
Michael J. Spencer 1:f5ac63519541 257 static void
Michael J. Spencer 1:f5ac63519541 258 terminate_layer(fsm *f, int nextstate)
Michael J. Spencer 1:f5ac63519541 259 {
Michael J. Spencer 1:f5ac63519541 260 /* @todo */
Michael J. Spencer 1:f5ac63519541 261 }
Michael J. Spencer 1:f5ac63519541 262 #endif
Michael J. Spencer 1:f5ac63519541 263
Michael J. Spencer 1:f5ac63519541 264 /*
Michael J. Spencer 1:f5ac63519541 265 * fsm_close - Start closing connection.
Michael J. Spencer 1:f5ac63519541 266 *
Michael J. Spencer 1:f5ac63519541 267 * Cancel timeouts and either initiate close or possibly go directly to
Michael J. Spencer 1:f5ac63519541 268 * the LS_CLOSED state.
Michael J. Spencer 1:f5ac63519541 269 */
Michael J. Spencer 1:f5ac63519541 270 void
Michael J. Spencer 1:f5ac63519541 271 fsm_close(fsm *f, char *reason)
Michael J. Spencer 1:f5ac63519541 272 {
Michael J. Spencer 1:f5ac63519541 273 int oldState = f->state;
Michael J. Spencer 1:f5ac63519541 274
Michael J. Spencer 1:f5ac63519541 275 LWIP_UNUSED_ARG(oldState);
Michael J. Spencer 1:f5ac63519541 276
Michael J. Spencer 1:f5ac63519541 277 f->term_reason = reason;
Michael J. Spencer 1:f5ac63519541 278 f->term_reason_len = (reason == NULL ? 0 : (int)strlen(reason));
Michael J. Spencer 1:f5ac63519541 279 switch( f->state ) {
Michael J. Spencer 1:f5ac63519541 280 case LS_STARTING:
Michael J. Spencer 1:f5ac63519541 281 f->state = LS_INITIAL;
Michael J. Spencer 1:f5ac63519541 282 break;
Michael J. Spencer 1:f5ac63519541 283 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 284 f->state = LS_CLOSED;
Michael J. Spencer 1:f5ac63519541 285 break;
Michael J. Spencer 1:f5ac63519541 286 case LS_STOPPING:
Michael J. Spencer 1:f5ac63519541 287 f->state = LS_CLOSING;
Michael J. Spencer 1:f5ac63519541 288 break;
Michael J. Spencer 1:f5ac63519541 289
Michael J. Spencer 1:f5ac63519541 290 case LS_REQSENT:
Michael J. Spencer 1:f5ac63519541 291 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 292 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 293 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 294 if( f->state != LS_OPENED ) {
Michael J. Spencer 1:f5ac63519541 295 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 296 } else if( f->callbacks->down ) {
Michael J. Spencer 1:f5ac63519541 297 (*f->callbacks->down)(f); /* Inform upper layers we're down */
Michael J. Spencer 1:f5ac63519541 298 }
Michael J. Spencer 1:f5ac63519541 299 /* Init restart counter, send Terminate-Request */
Michael J. Spencer 1:f5ac63519541 300 f->retransmits = f->maxtermtransmits;
Michael J. Spencer 1:f5ac63519541 301 fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
Michael J. Spencer 1:f5ac63519541 302 (u_char *) f->term_reason, f->term_reason_len);
Michael J. Spencer 1:f5ac63519541 303 TIMEOUT(fsm_timeout, f, f->timeouttime);
Michael J. Spencer 1:f5ac63519541 304 --f->retransmits;
Michael J. Spencer 1:f5ac63519541 305
Michael J. Spencer 1:f5ac63519541 306 f->state = LS_CLOSING;
Michael J. Spencer 1:f5ac63519541 307 break;
Michael J. Spencer 1:f5ac63519541 308 }
Michael J. Spencer 1:f5ac63519541 309
Michael J. Spencer 1:f5ac63519541 310 FSMDEBUG(LOG_INFO, ("%s: close reason=%s state %d (%s) -> %d (%s)\n",
Michael J. Spencer 1:f5ac63519541 311 PROTO_NAME(f), reason, oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 312 }
Michael J. Spencer 1:f5ac63519541 313
Michael J. Spencer 1:f5ac63519541 314
Michael J. Spencer 1:f5ac63519541 315 /*
Michael J. Spencer 1:f5ac63519541 316 * fsm_timeout - Timeout expired.
Michael J. Spencer 1:f5ac63519541 317 */
Michael J. Spencer 1:f5ac63519541 318 static void
Michael J. Spencer 1:f5ac63519541 319 fsm_timeout(void *arg)
Michael J. Spencer 1:f5ac63519541 320 {
Michael J. Spencer 1:f5ac63519541 321 fsm *f = (fsm *) arg;
Michael J. Spencer 1:f5ac63519541 322
Michael J. Spencer 1:f5ac63519541 323 switch (f->state) {
Michael J. Spencer 1:f5ac63519541 324 case LS_CLOSING:
Michael J. Spencer 1:f5ac63519541 325 case LS_STOPPING:
Michael J. Spencer 1:f5ac63519541 326 if( f->retransmits <= 0 ) {
Michael J. Spencer 1:f5ac63519541 327 FSMDEBUG(LOG_WARNING, ("%s: timeout sending Terminate-Request state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 328 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 329 /*
Michael J. Spencer 1:f5ac63519541 330 * We've waited for an ack long enough. Peer probably heard us.
Michael J. Spencer 1:f5ac63519541 331 */
Michael J. Spencer 1:f5ac63519541 332 f->state = (f->state == LS_CLOSING)? LS_CLOSED: LS_STOPPED;
Michael J. Spencer 1:f5ac63519541 333 if( f->callbacks->finished ) {
Michael J. Spencer 1:f5ac63519541 334 (*f->callbacks->finished)(f);
Michael J. Spencer 1:f5ac63519541 335 }
Michael J. Spencer 1:f5ac63519541 336 } else {
Michael J. Spencer 1:f5ac63519541 337 FSMDEBUG(LOG_WARNING, ("%s: timeout resending Terminate-Requests state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 338 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 339 /* Send Terminate-Request */
Michael J. Spencer 1:f5ac63519541 340 fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
Michael J. Spencer 1:f5ac63519541 341 (u_char *) f->term_reason, f->term_reason_len);
Michael J. Spencer 1:f5ac63519541 342 TIMEOUT(fsm_timeout, f, f->timeouttime);
Michael J. Spencer 1:f5ac63519541 343 --f->retransmits;
Michael J. Spencer 1:f5ac63519541 344 }
Michael J. Spencer 1:f5ac63519541 345 break;
Michael J. Spencer 1:f5ac63519541 346
Michael J. Spencer 1:f5ac63519541 347 case LS_REQSENT:
Michael J. Spencer 1:f5ac63519541 348 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 349 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 350 if (f->retransmits <= 0) {
Michael J. Spencer 1:f5ac63519541 351 FSMDEBUG(LOG_WARNING, ("%s: timeout sending Config-Requests state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 352 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 353 f->state = LS_STOPPED;
Michael J. Spencer 1:f5ac63519541 354 if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished ) {
Michael J. Spencer 1:f5ac63519541 355 (*f->callbacks->finished)(f);
Michael J. Spencer 1:f5ac63519541 356 }
Michael J. Spencer 1:f5ac63519541 357 } else {
Michael J. Spencer 1:f5ac63519541 358 FSMDEBUG(LOG_WARNING, ("%s: timeout resending Config-Request state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 359 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 360 /* Retransmit the configure-request */
Michael J. Spencer 1:f5ac63519541 361 if (f->callbacks->retransmit) {
Michael J. Spencer 1:f5ac63519541 362 (*f->callbacks->retransmit)(f);
Michael J. Spencer 1:f5ac63519541 363 }
Michael J. Spencer 1:f5ac63519541 364 fsm_sconfreq(f, 1); /* Re-send Configure-Request */
Michael J. Spencer 1:f5ac63519541 365 if( f->state == LS_ACKRCVD ) {
Michael J. Spencer 1:f5ac63519541 366 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 367 }
Michael J. Spencer 1:f5ac63519541 368 }
Michael J. Spencer 1:f5ac63519541 369 break;
Michael J. Spencer 1:f5ac63519541 370
Michael J. Spencer 1:f5ac63519541 371 default:
Michael J. Spencer 1:f5ac63519541 372 FSMDEBUG(LOG_INFO, ("%s: UNHANDLED timeout event in state %d (%s)!\n",
Michael J. Spencer 1:f5ac63519541 373 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 374 }
Michael J. Spencer 1:f5ac63519541 375 }
Michael J. Spencer 1:f5ac63519541 376
Michael J. Spencer 1:f5ac63519541 377
Michael J. Spencer 1:f5ac63519541 378 /*
Michael J. Spencer 1:f5ac63519541 379 * fsm_input - Input packet.
Michael J. Spencer 1:f5ac63519541 380 */
Michael J. Spencer 1:f5ac63519541 381 void
Michael J. Spencer 1:f5ac63519541 382 fsm_input(fsm *f, u_char *inpacket, int l)
Michael J. Spencer 1:f5ac63519541 383 {
Michael J. Spencer 1:f5ac63519541 384 u_char *inp = inpacket;
Michael J. Spencer 1:f5ac63519541 385 u_char code, id;
Michael J. Spencer 1:f5ac63519541 386 int len;
Michael J. Spencer 1:f5ac63519541 387
Michael J. Spencer 1:f5ac63519541 388 /*
Michael J. Spencer 1:f5ac63519541 389 * Parse header (code, id and length).
Michael J. Spencer 1:f5ac63519541 390 * If packet too short, drop it.
Michael J. Spencer 1:f5ac63519541 391 */
Michael J. Spencer 1:f5ac63519541 392 if (l < HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 393 FSMDEBUG(LOG_WARNING, ("fsm_input(%x): Rcvd short header.\n",
Michael J. Spencer 1:f5ac63519541 394 f->protocol));
Michael J. Spencer 1:f5ac63519541 395 return;
Michael J. Spencer 1:f5ac63519541 396 }
Michael J. Spencer 1:f5ac63519541 397 GETCHAR(code, inp);
Michael J. Spencer 1:f5ac63519541 398 GETCHAR(id, inp);
Michael J. Spencer 1:f5ac63519541 399 GETSHORT(len, inp);
Michael J. Spencer 1:f5ac63519541 400 if (len < HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 401 FSMDEBUG(LOG_INFO, ("fsm_input(%x): Rcvd illegal length.\n",
Michael J. Spencer 1:f5ac63519541 402 f->protocol));
Michael J. Spencer 1:f5ac63519541 403 return;
Michael J. Spencer 1:f5ac63519541 404 }
Michael J. Spencer 1:f5ac63519541 405 if (len > l) {
Michael J. Spencer 1:f5ac63519541 406 FSMDEBUG(LOG_INFO, ("fsm_input(%x): Rcvd short packet.\n",
Michael J. Spencer 1:f5ac63519541 407 f->protocol));
Michael J. Spencer 1:f5ac63519541 408 return;
Michael J. Spencer 1:f5ac63519541 409 }
Michael J. Spencer 1:f5ac63519541 410 len -= HEADERLEN; /* subtract header length */
Michael J. Spencer 1:f5ac63519541 411
Michael J. Spencer 1:f5ac63519541 412 if( f->state == LS_INITIAL || f->state == LS_STARTING ) {
Michael J. Spencer 1:f5ac63519541 413 FSMDEBUG(LOG_INFO, ("fsm_input(%x): Rcvd packet in state %d (%s).\n",
Michael J. Spencer 1:f5ac63519541 414 f->protocol, f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 415 return;
Michael J. Spencer 1:f5ac63519541 416 }
Michael J. Spencer 1:f5ac63519541 417 FSMDEBUG(LOG_INFO, ("fsm_input(%s):%d,%d,%d\n", PROTO_NAME(f), code, id, l));
Michael J. Spencer 1:f5ac63519541 418 /*
Michael J. Spencer 1:f5ac63519541 419 * Action depends on code.
Michael J. Spencer 1:f5ac63519541 420 */
Michael J. Spencer 1:f5ac63519541 421 switch (code) {
Michael J. Spencer 1:f5ac63519541 422 case CONFREQ:
Michael J. Spencer 1:f5ac63519541 423 fsm_rconfreq(f, id, inp, len);
Michael J. Spencer 1:f5ac63519541 424 break;
Michael J. Spencer 1:f5ac63519541 425
Michael J. Spencer 1:f5ac63519541 426 case CONFACK:
Michael J. Spencer 1:f5ac63519541 427 fsm_rconfack(f, id, inp, len);
Michael J. Spencer 1:f5ac63519541 428 break;
Michael J. Spencer 1:f5ac63519541 429
Michael J. Spencer 1:f5ac63519541 430 case CONFNAK:
Michael J. Spencer 1:f5ac63519541 431 case CONFREJ:
Michael J. Spencer 1:f5ac63519541 432 fsm_rconfnakrej(f, code, id, inp, len);
Michael J. Spencer 1:f5ac63519541 433 break;
Michael J. Spencer 1:f5ac63519541 434
Michael J. Spencer 1:f5ac63519541 435 case TERMREQ:
Michael J. Spencer 1:f5ac63519541 436 fsm_rtermreq(f, id, inp, len);
Michael J. Spencer 1:f5ac63519541 437 break;
Michael J. Spencer 1:f5ac63519541 438
Michael J. Spencer 1:f5ac63519541 439 case TERMACK:
Michael J. Spencer 1:f5ac63519541 440 fsm_rtermack(f);
Michael J. Spencer 1:f5ac63519541 441 break;
Michael J. Spencer 1:f5ac63519541 442
Michael J. Spencer 1:f5ac63519541 443 case CODEREJ:
Michael J. Spencer 1:f5ac63519541 444 fsm_rcoderej(f, inp, len);
Michael J. Spencer 1:f5ac63519541 445 break;
Michael J. Spencer 1:f5ac63519541 446
Michael J. Spencer 1:f5ac63519541 447 default:
Michael J. Spencer 1:f5ac63519541 448 FSMDEBUG(LOG_INFO, ("fsm_input(%s): default: \n", PROTO_NAME(f)));
Michael J. Spencer 1:f5ac63519541 449 if( !f->callbacks->extcode ||
Michael J. Spencer 1:f5ac63519541 450 !(*f->callbacks->extcode)(f, code, id, inp, len) ) {
Michael J. Spencer 1:f5ac63519541 451 fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
Michael J. Spencer 1:f5ac63519541 452 }
Michael J. Spencer 1:f5ac63519541 453 break;
Michael J. Spencer 1:f5ac63519541 454 }
Michael J. Spencer 1:f5ac63519541 455 }
Michael J. Spencer 1:f5ac63519541 456
Michael J. Spencer 1:f5ac63519541 457
Michael J. Spencer 1:f5ac63519541 458 /*
Michael J. Spencer 1:f5ac63519541 459 * fsm_rconfreq - Receive Configure-Request.
Michael J. Spencer 1:f5ac63519541 460 */
Michael J. Spencer 1:f5ac63519541 461 static void
Michael J. Spencer 1:f5ac63519541 462 fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len)
Michael J. Spencer 1:f5ac63519541 463 {
Michael J. Spencer 1:f5ac63519541 464 int code, reject_if_disagree;
Michael J. Spencer 1:f5ac63519541 465
Michael J. Spencer 1:f5ac63519541 466 FSMDEBUG(LOG_INFO, ("fsm_rconfreq(%s): Rcvd id %d state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 467 PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 468 switch( f->state ) {
Michael J. Spencer 1:f5ac63519541 469 case LS_CLOSED:
Michael J. Spencer 1:f5ac63519541 470 /* Go away, we're closed */
Michael J. Spencer 1:f5ac63519541 471 fsm_sdata(f, TERMACK, id, NULL, 0);
Michael J. Spencer 1:f5ac63519541 472 return;
Michael J. Spencer 1:f5ac63519541 473 case LS_CLOSING:
Michael J. Spencer 1:f5ac63519541 474 case LS_STOPPING:
Michael J. Spencer 1:f5ac63519541 475 return;
Michael J. Spencer 1:f5ac63519541 476
Michael J. Spencer 1:f5ac63519541 477 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 478 /* Go down and restart negotiation */
Michael J. Spencer 1:f5ac63519541 479 if( f->callbacks->down ) {
Michael J. Spencer 1:f5ac63519541 480 (*f->callbacks->down)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 481 }
Michael J. Spencer 1:f5ac63519541 482 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
Michael J. Spencer 1:f5ac63519541 483 break;
Michael J. Spencer 1:f5ac63519541 484
Michael J. Spencer 1:f5ac63519541 485 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 486 /* Negotiation started by our peer */
Michael J. Spencer 1:f5ac63519541 487 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
Michael J. Spencer 1:f5ac63519541 488 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 489 break;
Michael J. Spencer 1:f5ac63519541 490 }
Michael J. Spencer 1:f5ac63519541 491
Michael J. Spencer 1:f5ac63519541 492 /*
Michael J. Spencer 1:f5ac63519541 493 * Pass the requested configuration options
Michael J. Spencer 1:f5ac63519541 494 * to protocol-specific code for checking.
Michael J. Spencer 1:f5ac63519541 495 */
Michael J. Spencer 1:f5ac63519541 496 if (f->callbacks->reqci) { /* Check CI */
Michael J. Spencer 1:f5ac63519541 497 reject_if_disagree = (f->nakloops >= f->maxnakloops);
Michael J. Spencer 1:f5ac63519541 498 code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
Michael J. Spencer 1:f5ac63519541 499 } else if (len) {
Michael J. Spencer 1:f5ac63519541 500 code = CONFREJ; /* Reject all CI */
Michael J. Spencer 1:f5ac63519541 501 } else {
Michael J. Spencer 1:f5ac63519541 502 code = CONFACK;
Michael J. Spencer 1:f5ac63519541 503 }
Michael J. Spencer 1:f5ac63519541 504
Michael J. Spencer 1:f5ac63519541 505 /* send the Ack, Nak or Rej to the peer */
Michael J. Spencer 1:f5ac63519541 506 fsm_sdata(f, (u_char)code, id, inp, len);
Michael J. Spencer 1:f5ac63519541 507
Michael J. Spencer 1:f5ac63519541 508 if (code == CONFACK) {
Michael J. Spencer 1:f5ac63519541 509 if (f->state == LS_ACKRCVD) {
Michael J. Spencer 1:f5ac63519541 510 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 511 f->state = LS_OPENED;
Michael J. Spencer 1:f5ac63519541 512 if (f->callbacks->up) {
Michael J. Spencer 1:f5ac63519541 513 (*f->callbacks->up)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 514 }
Michael J. Spencer 1:f5ac63519541 515 } else {
Michael J. Spencer 1:f5ac63519541 516 f->state = LS_ACKSENT;
Michael J. Spencer 1:f5ac63519541 517 }
Michael J. Spencer 1:f5ac63519541 518 f->nakloops = 0;
Michael J. Spencer 1:f5ac63519541 519 } else {
Michael J. Spencer 1:f5ac63519541 520 /* we sent CONFACK or CONFREJ */
Michael J. Spencer 1:f5ac63519541 521 if (f->state != LS_ACKRCVD) {
Michael J. Spencer 1:f5ac63519541 522 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 523 }
Michael J. Spencer 1:f5ac63519541 524 if( code == CONFNAK ) {
Michael J. Spencer 1:f5ac63519541 525 ++f->nakloops;
Michael J. Spencer 1:f5ac63519541 526 }
Michael J. Spencer 1:f5ac63519541 527 }
Michael J. Spencer 1:f5ac63519541 528 }
Michael J. Spencer 1:f5ac63519541 529
Michael J. Spencer 1:f5ac63519541 530
Michael J. Spencer 1:f5ac63519541 531 /*
Michael J. Spencer 1:f5ac63519541 532 * fsm_rconfack - Receive Configure-Ack.
Michael J. Spencer 1:f5ac63519541 533 */
Michael J. Spencer 1:f5ac63519541 534 static void
Michael J. Spencer 1:f5ac63519541 535 fsm_rconfack(fsm *f, int id, u_char *inp, int len)
Michael J. Spencer 1:f5ac63519541 536 {
Michael J. Spencer 1:f5ac63519541 537 FSMDEBUG(LOG_INFO, ("fsm_rconfack(%s): Rcvd id %d state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 538 PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 539
Michael J. Spencer 1:f5ac63519541 540 if (id != f->reqid || f->seen_ack) { /* Expected id? */
Michael J. Spencer 1:f5ac63519541 541 return; /* Nope, toss... */
Michael J. Spencer 1:f5ac63519541 542 }
Michael J. Spencer 1:f5ac63519541 543 if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len): (len == 0)) ) {
Michael J. Spencer 1:f5ac63519541 544 /* Ack is bad - ignore it */
Michael J. Spencer 1:f5ac63519541 545 FSMDEBUG(LOG_INFO, ("%s: received bad Ack (length %d)\n",
Michael J. Spencer 1:f5ac63519541 546 PROTO_NAME(f), len));
Michael J. Spencer 1:f5ac63519541 547 return;
Michael J. Spencer 1:f5ac63519541 548 }
Michael J. Spencer 1:f5ac63519541 549 f->seen_ack = 1;
Michael J. Spencer 1:f5ac63519541 550
Michael J. Spencer 1:f5ac63519541 551 switch (f->state) {
Michael J. Spencer 1:f5ac63519541 552 case LS_CLOSED:
Michael J. Spencer 1:f5ac63519541 553 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 554 fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);
Michael J. Spencer 1:f5ac63519541 555 break;
Michael J. Spencer 1:f5ac63519541 556
Michael J. Spencer 1:f5ac63519541 557 case LS_REQSENT:
Michael J. Spencer 1:f5ac63519541 558 f->state = LS_ACKRCVD;
Michael J. Spencer 1:f5ac63519541 559 f->retransmits = f->maxconfreqtransmits;
Michael J. Spencer 1:f5ac63519541 560 break;
Michael J. Spencer 1:f5ac63519541 561
Michael J. Spencer 1:f5ac63519541 562 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 563 /* Huh? an extra valid Ack? oh well... */
Michael J. Spencer 1:f5ac63519541 564 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 565 fsm_sconfreq(f, 0);
Michael J. Spencer 1:f5ac63519541 566 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 567 break;
Michael J. Spencer 1:f5ac63519541 568
Michael J. Spencer 1:f5ac63519541 569 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 570 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 571 f->state = LS_OPENED;
Michael J. Spencer 1:f5ac63519541 572 f->retransmits = f->maxconfreqtransmits;
Michael J. Spencer 1:f5ac63519541 573 if (f->callbacks->up) {
Michael J. Spencer 1:f5ac63519541 574 (*f->callbacks->up)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 575 }
Michael J. Spencer 1:f5ac63519541 576 break;
Michael J. Spencer 1:f5ac63519541 577
Michael J. Spencer 1:f5ac63519541 578 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 579 /* Go down and restart negotiation */
Michael J. Spencer 1:f5ac63519541 580 if (f->callbacks->down) {
Michael J. Spencer 1:f5ac63519541 581 (*f->callbacks->down)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 582 }
Michael J. Spencer 1:f5ac63519541 583 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
Michael J. Spencer 1:f5ac63519541 584 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 585 break;
Michael J. Spencer 1:f5ac63519541 586 }
Michael J. Spencer 1:f5ac63519541 587 }
Michael J. Spencer 1:f5ac63519541 588
Michael J. Spencer 1:f5ac63519541 589
Michael J. Spencer 1:f5ac63519541 590 /*
Michael J. Spencer 1:f5ac63519541 591 * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
Michael J. Spencer 1:f5ac63519541 592 */
Michael J. Spencer 1:f5ac63519541 593 static void
Michael J. Spencer 1:f5ac63519541 594 fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len)
Michael J. Spencer 1:f5ac63519541 595 {
Michael J. Spencer 1:f5ac63519541 596 int (*proc) (fsm *, u_char *, int);
Michael J. Spencer 1:f5ac63519541 597 int ret;
Michael J. Spencer 1:f5ac63519541 598
Michael J. Spencer 1:f5ac63519541 599 FSMDEBUG(LOG_INFO, ("fsm_rconfnakrej(%s): Rcvd id %d state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 600 PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 601
Michael J. Spencer 1:f5ac63519541 602 if (id != f->reqid || f->seen_ack) { /* Expected id? */
Michael J. Spencer 1:f5ac63519541 603 return; /* Nope, toss... */
Michael J. Spencer 1:f5ac63519541 604 }
Michael J. Spencer 1:f5ac63519541 605 proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;
Michael J. Spencer 1:f5ac63519541 606 if (!proc || !((ret = proc(f, inp, len)))) {
Michael J. Spencer 1:f5ac63519541 607 /* Nak/reject is bad - ignore it */
Michael J. Spencer 1:f5ac63519541 608 FSMDEBUG(LOG_INFO, ("%s: received bad %s (length %d)\n",
Michael J. Spencer 1:f5ac63519541 609 PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len));
Michael J. Spencer 1:f5ac63519541 610 return;
Michael J. Spencer 1:f5ac63519541 611 }
Michael J. Spencer 1:f5ac63519541 612 f->seen_ack = 1;
Michael J. Spencer 1:f5ac63519541 613
Michael J. Spencer 1:f5ac63519541 614 switch (f->state) {
Michael J. Spencer 1:f5ac63519541 615 case LS_CLOSED:
Michael J. Spencer 1:f5ac63519541 616 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 617 fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);
Michael J. Spencer 1:f5ac63519541 618 break;
Michael J. Spencer 1:f5ac63519541 619
Michael J. Spencer 1:f5ac63519541 620 case LS_REQSENT:
Michael J. Spencer 1:f5ac63519541 621 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 622 /* They didn't agree to what we wanted - try another request */
Michael J. Spencer 1:f5ac63519541 623 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 624 if (ret < 0) {
Michael J. Spencer 1:f5ac63519541 625 f->state = LS_STOPPED; /* kludge for stopping CCP */
Michael J. Spencer 1:f5ac63519541 626 } else {
Michael J. Spencer 1:f5ac63519541 627 fsm_sconfreq(f, 0); /* Send Configure-Request */
Michael J. Spencer 1:f5ac63519541 628 }
Michael J. Spencer 1:f5ac63519541 629 break;
Michael J. Spencer 1:f5ac63519541 630
Michael J. Spencer 1:f5ac63519541 631 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 632 /* Got a Nak/reject when we had already had an Ack?? oh well... */
Michael J. Spencer 1:f5ac63519541 633 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 634 fsm_sconfreq(f, 0);
Michael J. Spencer 1:f5ac63519541 635 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 636 break;
Michael J. Spencer 1:f5ac63519541 637
Michael J. Spencer 1:f5ac63519541 638 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 639 /* Go down and restart negotiation */
Michael J. Spencer 1:f5ac63519541 640 if (f->callbacks->down) {
Michael J. Spencer 1:f5ac63519541 641 (*f->callbacks->down)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 642 }
Michael J. Spencer 1:f5ac63519541 643 fsm_sconfreq(f, 0); /* Send initial Configure-Request */
Michael J. Spencer 1:f5ac63519541 644 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 645 break;
Michael J. Spencer 1:f5ac63519541 646 }
Michael J. Spencer 1:f5ac63519541 647 }
Michael J. Spencer 1:f5ac63519541 648
Michael J. Spencer 1:f5ac63519541 649
Michael J. Spencer 1:f5ac63519541 650 /*
Michael J. Spencer 1:f5ac63519541 651 * fsm_rtermreq - Receive Terminate-Req.
Michael J. Spencer 1:f5ac63519541 652 */
Michael J. Spencer 1:f5ac63519541 653 static void
Michael J. Spencer 1:f5ac63519541 654 fsm_rtermreq(fsm *f, int id, u_char *p, int len)
Michael J. Spencer 1:f5ac63519541 655 {
Michael J. Spencer 1:f5ac63519541 656 LWIP_UNUSED_ARG(p);
Michael J. Spencer 1:f5ac63519541 657
Michael J. Spencer 1:f5ac63519541 658 FSMDEBUG(LOG_INFO, ("fsm_rtermreq(%s): Rcvd id %d state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 659 PROTO_NAME(f), id, f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 660
Michael J. Spencer 1:f5ac63519541 661 switch (f->state) {
Michael J. Spencer 1:f5ac63519541 662 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 663 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 664 f->state = LS_REQSENT; /* Start over but keep trying */
Michael J. Spencer 1:f5ac63519541 665 break;
Michael J. Spencer 1:f5ac63519541 666
Michael J. Spencer 1:f5ac63519541 667 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 668 if (len > 0) {
Michael J. Spencer 1:f5ac63519541 669 FSMDEBUG(LOG_INFO, ("%s terminated by peer (%p)\n", PROTO_NAME(f), p));
Michael J. Spencer 1:f5ac63519541 670 } else {
Michael J. Spencer 1:f5ac63519541 671 FSMDEBUG(LOG_INFO, ("%s terminated by peer\n", PROTO_NAME(f)));
Michael J. Spencer 1:f5ac63519541 672 }
Michael J. Spencer 1:f5ac63519541 673 if (f->callbacks->down) {
Michael J. Spencer 1:f5ac63519541 674 (*f->callbacks->down)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 675 }
Michael J. Spencer 1:f5ac63519541 676 f->retransmits = 0;
Michael J. Spencer 1:f5ac63519541 677 f->state = LS_STOPPING;
Michael J. Spencer 1:f5ac63519541 678 TIMEOUT(fsm_timeout, f, f->timeouttime);
Michael J. Spencer 1:f5ac63519541 679 break;
Michael J. Spencer 1:f5ac63519541 680 }
Michael J. Spencer 1:f5ac63519541 681
Michael J. Spencer 1:f5ac63519541 682 fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);
Michael J. Spencer 1:f5ac63519541 683 }
Michael J. Spencer 1:f5ac63519541 684
Michael J. Spencer 1:f5ac63519541 685
Michael J. Spencer 1:f5ac63519541 686 /*
Michael J. Spencer 1:f5ac63519541 687 * fsm_rtermack - Receive Terminate-Ack.
Michael J. Spencer 1:f5ac63519541 688 */
Michael J. Spencer 1:f5ac63519541 689 static void
Michael J. Spencer 1:f5ac63519541 690 fsm_rtermack(fsm *f)
Michael J. Spencer 1:f5ac63519541 691 {
Michael J. Spencer 1:f5ac63519541 692 FSMDEBUG(LOG_INFO, ("fsm_rtermack(%s): state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 693 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 694
Michael J. Spencer 1:f5ac63519541 695 switch (f->state) {
Michael J. Spencer 1:f5ac63519541 696 case LS_CLOSING:
Michael J. Spencer 1:f5ac63519541 697 UNTIMEOUT(fsm_timeout, f);
Michael J. Spencer 1:f5ac63519541 698 f->state = LS_CLOSED;
Michael J. Spencer 1:f5ac63519541 699 if( f->callbacks->finished ) {
Michael J. Spencer 1:f5ac63519541 700 (*f->callbacks->finished)(f);
Michael J. Spencer 1:f5ac63519541 701 }
Michael J. Spencer 1:f5ac63519541 702 break;
Michael J. Spencer 1:f5ac63519541 703
Michael J. Spencer 1:f5ac63519541 704 case LS_STOPPING:
Michael J. Spencer 1:f5ac63519541 705 UNTIMEOUT(fsm_timeout, f);
Michael J. Spencer 1:f5ac63519541 706 f->state = LS_STOPPED;
Michael J. Spencer 1:f5ac63519541 707 if( f->callbacks->finished ) {
Michael J. Spencer 1:f5ac63519541 708 (*f->callbacks->finished)(f);
Michael J. Spencer 1:f5ac63519541 709 }
Michael J. Spencer 1:f5ac63519541 710 break;
Michael J. Spencer 1:f5ac63519541 711
Michael J. Spencer 1:f5ac63519541 712 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 713 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 714 break;
Michael J. Spencer 1:f5ac63519541 715
Michael J. Spencer 1:f5ac63519541 716 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 717 if (f->callbacks->down) {
Michael J. Spencer 1:f5ac63519541 718 (*f->callbacks->down)(f); /* Inform upper layers */
Michael J. Spencer 1:f5ac63519541 719 }
Michael J. Spencer 1:f5ac63519541 720 fsm_sconfreq(f, 0);
Michael J. Spencer 1:f5ac63519541 721 break;
Michael J. Spencer 1:f5ac63519541 722 default:
Michael J. Spencer 1:f5ac63519541 723 FSMDEBUG(LOG_INFO, ("fsm_rtermack(%s): UNHANDLED state=%d (%s)!!!\n",
Michael J. Spencer 1:f5ac63519541 724 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 725 }
Michael J. Spencer 1:f5ac63519541 726 }
Michael J. Spencer 1:f5ac63519541 727
Michael J. Spencer 1:f5ac63519541 728
Michael J. Spencer 1:f5ac63519541 729 /*
Michael J. Spencer 1:f5ac63519541 730 * fsm_rcoderej - Receive an Code-Reject.
Michael J. Spencer 1:f5ac63519541 731 */
Michael J. Spencer 1:f5ac63519541 732 static void
Michael J. Spencer 1:f5ac63519541 733 fsm_rcoderej(fsm *f, u_char *inp, int len)
Michael J. Spencer 1:f5ac63519541 734 {
Michael J. Spencer 1:f5ac63519541 735 u_char code, id;
Michael J. Spencer 1:f5ac63519541 736
Michael J. Spencer 1:f5ac63519541 737 FSMDEBUG(LOG_INFO, ("fsm_rcoderej(%s): state=%d (%s)\n",
Michael J. Spencer 1:f5ac63519541 738 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 739
Michael J. Spencer 1:f5ac63519541 740 if (len < HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 741 FSMDEBUG(LOG_INFO, ("fsm_rcoderej: Rcvd short Code-Reject packet!\n"));
Michael J. Spencer 1:f5ac63519541 742 return;
Michael J. Spencer 1:f5ac63519541 743 }
Michael J. Spencer 1:f5ac63519541 744 GETCHAR(code, inp);
Michael J. Spencer 1:f5ac63519541 745 GETCHAR(id, inp);
Michael J. Spencer 1:f5ac63519541 746 FSMDEBUG(LOG_WARNING, ("%s: Rcvd Code-Reject for code %d, id %d\n",
Michael J. Spencer 1:f5ac63519541 747 PROTO_NAME(f), code, id));
Michael J. Spencer 1:f5ac63519541 748
Michael J. Spencer 1:f5ac63519541 749 if( f->state == LS_ACKRCVD ) {
Michael J. Spencer 1:f5ac63519541 750 f->state = LS_REQSENT;
Michael J. Spencer 1:f5ac63519541 751 }
Michael J. Spencer 1:f5ac63519541 752 }
Michael J. Spencer 1:f5ac63519541 753
Michael J. Spencer 1:f5ac63519541 754
Michael J. Spencer 1:f5ac63519541 755 /*
Michael J. Spencer 1:f5ac63519541 756 * fsm_protreject - Peer doesn't speak this protocol.
Michael J. Spencer 1:f5ac63519541 757 *
Michael J. Spencer 1:f5ac63519541 758 * Treat this as a catastrophic error (RXJ-).
Michael J. Spencer 1:f5ac63519541 759 */
Michael J. Spencer 1:f5ac63519541 760 void
Michael J. Spencer 1:f5ac63519541 761 fsm_protreject(fsm *f)
Michael J. Spencer 1:f5ac63519541 762 {
Michael J. Spencer 1:f5ac63519541 763 switch( f->state ) {
Michael J. Spencer 1:f5ac63519541 764 case LS_CLOSING:
Michael J. Spencer 1:f5ac63519541 765 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 766 /* fall through */
Michael J. Spencer 1:f5ac63519541 767 case LS_CLOSED:
Michael J. Spencer 1:f5ac63519541 768 f->state = LS_CLOSED;
Michael J. Spencer 1:f5ac63519541 769 if( f->callbacks->finished ) {
Michael J. Spencer 1:f5ac63519541 770 (*f->callbacks->finished)(f);
Michael J. Spencer 1:f5ac63519541 771 }
Michael J. Spencer 1:f5ac63519541 772 break;
Michael J. Spencer 1:f5ac63519541 773
Michael J. Spencer 1:f5ac63519541 774 case LS_STOPPING:
Michael J. Spencer 1:f5ac63519541 775 case LS_REQSENT:
Michael J. Spencer 1:f5ac63519541 776 case LS_ACKRCVD:
Michael J. Spencer 1:f5ac63519541 777 case LS_ACKSENT:
Michael J. Spencer 1:f5ac63519541 778 UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 779 /* fall through */
Michael J. Spencer 1:f5ac63519541 780 case LS_STOPPED:
Michael J. Spencer 1:f5ac63519541 781 f->state = LS_STOPPED;
Michael J. Spencer 1:f5ac63519541 782 if( f->callbacks->finished ) {
Michael J. Spencer 1:f5ac63519541 783 (*f->callbacks->finished)(f);
Michael J. Spencer 1:f5ac63519541 784 }
Michael J. Spencer 1:f5ac63519541 785 break;
Michael J. Spencer 1:f5ac63519541 786
Michael J. Spencer 1:f5ac63519541 787 case LS_OPENED:
Michael J. Spencer 1:f5ac63519541 788 if( f->callbacks->down ) {
Michael J. Spencer 1:f5ac63519541 789 (*f->callbacks->down)(f);
Michael J. Spencer 1:f5ac63519541 790 }
Michael J. Spencer 1:f5ac63519541 791 /* Init restart counter, send Terminate-Request */
Michael J. Spencer 1:f5ac63519541 792 f->retransmits = f->maxtermtransmits;
Michael J. Spencer 1:f5ac63519541 793 fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
Michael J. Spencer 1:f5ac63519541 794 (u_char *) f->term_reason, f->term_reason_len);
Michael J. Spencer 1:f5ac63519541 795 TIMEOUT(fsm_timeout, f, f->timeouttime);
Michael J. Spencer 1:f5ac63519541 796 --f->retransmits;
Michael J. Spencer 1:f5ac63519541 797
Michael J. Spencer 1:f5ac63519541 798 f->state = LS_STOPPING;
Michael J. Spencer 1:f5ac63519541 799 break;
Michael J. Spencer 1:f5ac63519541 800
Michael J. Spencer 1:f5ac63519541 801 default:
Michael J. Spencer 1:f5ac63519541 802 FSMDEBUG(LOG_INFO, ("%s: Protocol-reject event in state %d (%s)!\n",
Michael J. Spencer 1:f5ac63519541 803 PROTO_NAME(f), f->state, ppperr_strerr[f->state]));
Michael J. Spencer 1:f5ac63519541 804 }
Michael J. Spencer 1:f5ac63519541 805 }
Michael J. Spencer 1:f5ac63519541 806
Michael J. Spencer 1:f5ac63519541 807
Michael J. Spencer 1:f5ac63519541 808 /*
Michael J. Spencer 1:f5ac63519541 809 * fsm_sconfreq - Send a Configure-Request.
Michael J. Spencer 1:f5ac63519541 810 */
Michael J. Spencer 1:f5ac63519541 811 static void
Michael J. Spencer 1:f5ac63519541 812 fsm_sconfreq(fsm *f, int retransmit)
Michael J. Spencer 1:f5ac63519541 813 {
Michael J. Spencer 1:f5ac63519541 814 u_char *outp;
Michael J. Spencer 1:f5ac63519541 815 int cilen;
Michael J. Spencer 1:f5ac63519541 816
Michael J. Spencer 1:f5ac63519541 817 if( f->state != LS_REQSENT && f->state != LS_ACKRCVD && f->state != LS_ACKSENT ) {
Michael J. Spencer 1:f5ac63519541 818 /* Not currently negotiating - reset options */
Michael J. Spencer 1:f5ac63519541 819 if( f->callbacks->resetci ) {
Michael J. Spencer 1:f5ac63519541 820 (*f->callbacks->resetci)(f);
Michael J. Spencer 1:f5ac63519541 821 }
Michael J. Spencer 1:f5ac63519541 822 f->nakloops = 0;
Michael J. Spencer 1:f5ac63519541 823 }
Michael J. Spencer 1:f5ac63519541 824
Michael J. Spencer 1:f5ac63519541 825 if( !retransmit ) {
Michael J. Spencer 1:f5ac63519541 826 /* New request - reset retransmission counter, use new ID */
Michael J. Spencer 1:f5ac63519541 827 f->retransmits = f->maxconfreqtransmits;
Michael J. Spencer 1:f5ac63519541 828 f->reqid = ++f->id;
Michael J. Spencer 1:f5ac63519541 829 }
Michael J. Spencer 1:f5ac63519541 830
Michael J. Spencer 1:f5ac63519541 831 f->seen_ack = 0;
Michael J. Spencer 1:f5ac63519541 832
Michael J. Spencer 1:f5ac63519541 833 /*
Michael J. Spencer 1:f5ac63519541 834 * Make up the request packet
Michael J. Spencer 1:f5ac63519541 835 */
Michael J. Spencer 1:f5ac63519541 836 outp = outpacket_buf[f->unit] + PPP_HDRLEN + HEADERLEN;
Michael J. Spencer 1:f5ac63519541 837 if( f->callbacks->cilen && f->callbacks->addci ) {
Michael J. Spencer 1:f5ac63519541 838 cilen = (*f->callbacks->cilen)(f);
Michael J. Spencer 1:f5ac63519541 839 if( cilen > peer_mru[f->unit] - (int)HEADERLEN ) {
Michael J. Spencer 1:f5ac63519541 840 cilen = peer_mru[f->unit] - HEADERLEN;
Michael J. Spencer 1:f5ac63519541 841 }
Michael J. Spencer 1:f5ac63519541 842 if (f->callbacks->addci) {
Michael J. Spencer 1:f5ac63519541 843 (*f->callbacks->addci)(f, outp, &cilen);
Michael J. Spencer 1:f5ac63519541 844 }
Michael J. Spencer 1:f5ac63519541 845 } else {
Michael J. Spencer 1:f5ac63519541 846 cilen = 0;
Michael J. Spencer 1:f5ac63519541 847 }
Michael J. Spencer 1:f5ac63519541 848
Michael J. Spencer 1:f5ac63519541 849 /* send the request to our peer */
Michael J. Spencer 1:f5ac63519541 850 fsm_sdata(f, CONFREQ, f->reqid, outp, cilen);
Michael J. Spencer 1:f5ac63519541 851
Michael J. Spencer 1:f5ac63519541 852 /* start the retransmit timer */
Michael J. Spencer 1:f5ac63519541 853 --f->retransmits;
Michael J. Spencer 1:f5ac63519541 854 TIMEOUT(fsm_timeout, f, f->timeouttime);
Michael J. Spencer 1:f5ac63519541 855
Michael J. Spencer 1:f5ac63519541 856 FSMDEBUG(LOG_INFO, ("%s: sending Configure-Request, id %d\n",
Michael J. Spencer 1:f5ac63519541 857 PROTO_NAME(f), f->reqid));
Michael J. Spencer 1:f5ac63519541 858 }
Michael J. Spencer 1:f5ac63519541 859
Michael J. Spencer 1:f5ac63519541 860
Michael J. Spencer 1:f5ac63519541 861 /*
Michael J. Spencer 1:f5ac63519541 862 * fsm_sdata - Send some data.
Michael J. Spencer 1:f5ac63519541 863 *
Michael J. Spencer 1:f5ac63519541 864 * Used for all packets sent to our peer by this module.
Michael J. Spencer 1:f5ac63519541 865 */
Michael J. Spencer 1:f5ac63519541 866 void
Michael J. Spencer 1:f5ac63519541 867 fsm_sdata( fsm *f, u_char code, u_char id, u_char *data, int datalen)
Michael J. Spencer 1:f5ac63519541 868 {
Michael J. Spencer 1:f5ac63519541 869 u_char *outp;
Michael J. Spencer 1:f5ac63519541 870 int outlen;
Michael J. Spencer 1:f5ac63519541 871
Michael J. Spencer 1:f5ac63519541 872 /* Adjust length to be smaller than MTU */
Michael J. Spencer 1:f5ac63519541 873 outp = outpacket_buf[f->unit];
Michael J. Spencer 1:f5ac63519541 874 if (datalen > peer_mru[f->unit] - (int)HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 875 datalen = peer_mru[f->unit] - HEADERLEN;
Michael J. Spencer 1:f5ac63519541 876 }
Michael J. Spencer 1:f5ac63519541 877 if (datalen && data != outp + PPP_HDRLEN + HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 878 BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen);
Michael J. Spencer 1:f5ac63519541 879 }
Michael J. Spencer 1:f5ac63519541 880 outlen = datalen + HEADERLEN;
Michael J. Spencer 1:f5ac63519541 881 MAKEHEADER(outp, f->protocol);
Michael J. Spencer 1:f5ac63519541 882 PUTCHAR(code, outp);
Michael J. Spencer 1:f5ac63519541 883 PUTCHAR(id, outp);
Michael J. Spencer 1:f5ac63519541 884 PUTSHORT(outlen, outp);
Michael J. Spencer 1:f5ac63519541 885 pppWrite(f->unit, outpacket_buf[f->unit], outlen + PPP_HDRLEN);
Michael J. Spencer 1:f5ac63519541 886 FSMDEBUG(LOG_INFO, ("fsm_sdata(%s): Sent code %d,%d,%d.\n",
Michael J. Spencer 1:f5ac63519541 887 PROTO_NAME(f), code, id, outlen));
Michael J. Spencer 1:f5ac63519541 888 }
Michael J. Spencer 1:f5ac63519541 889
Michael J. Spencer 1:f5ac63519541 890 #endif /* PPP_SUPPORT */