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 * pap.c - Network Password Authentication Protocol 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-12 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
Michael J. Spencer 1:f5ac63519541 31 * Original.
Michael J. Spencer 1:f5ac63519541 32 *****************************************************************************/
Michael J. Spencer 1:f5ac63519541 33 /*
Michael J. Spencer 1:f5ac63519541 34 * upap.c - User/Password Authentication Protocol.
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 #include "lwip/opt.h"
Michael J. Spencer 1:f5ac63519541 53
Michael J. Spencer 1:f5ac63519541 54 #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
Michael J. Spencer 1:f5ac63519541 55
Michael J. Spencer 1:f5ac63519541 56 #if PAP_SUPPORT /* don't build if not configured for use in lwipopts.h */
Michael J. Spencer 1:f5ac63519541 57
Michael J. Spencer 1:f5ac63519541 58 #include "ppp.h"
Michael J. Spencer 1:f5ac63519541 59 #include "pppdebug.h"
Michael J. Spencer 1:f5ac63519541 60
Michael J. Spencer 1:f5ac63519541 61 #include "auth.h"
Michael J. Spencer 1:f5ac63519541 62 #include "pap.h"
Michael J. Spencer 1:f5ac63519541 63
Michael J. Spencer 1:f5ac63519541 64 #include <string.h>
Michael J. Spencer 1:f5ac63519541 65
Michael J. Spencer 1:f5ac63519541 66 #if 0 /* UNUSED */
Michael J. Spencer 1:f5ac63519541 67 static bool hide_password = 1;
Michael J. Spencer 1:f5ac63519541 68
Michael J. Spencer 1:f5ac63519541 69 /*
Michael J. Spencer 1:f5ac63519541 70 * Command-line options.
Michael J. Spencer 1:f5ac63519541 71 */
Michael J. Spencer 1:f5ac63519541 72 static option_t pap_option_list[] = {
Michael J. Spencer 1:f5ac63519541 73 { "hide-password", o_bool, &hide_password,
Michael J. Spencer 1:f5ac63519541 74 "Don't output passwords to log", 1 },
Michael J. Spencer 1:f5ac63519541 75 { "show-password", o_bool, &hide_password,
Michael J. Spencer 1:f5ac63519541 76 "Show password string in debug log messages", 0 },
Michael J. Spencer 1:f5ac63519541 77 { "pap-restart", o_int, &upap[0].us_timeouttime,
Michael J. Spencer 1:f5ac63519541 78 "Set retransmit timeout for PAP" },
Michael J. Spencer 1:f5ac63519541 79 { "pap-max-authreq", o_int, &upap[0].us_maxtransmits,
Michael J. Spencer 1:f5ac63519541 80 "Set max number of transmissions for auth-reqs" },
Michael J. Spencer 1:f5ac63519541 81 { "pap-timeout", o_int, &upap[0].us_reqtimeout,
Michael J. Spencer 1:f5ac63519541 82 "Set time limit for peer PAP authentication" },
Michael J. Spencer 1:f5ac63519541 83 { NULL }
Michael J. Spencer 1:f5ac63519541 84 };
Michael J. Spencer 1:f5ac63519541 85 #endif
Michael J. Spencer 1:f5ac63519541 86
Michael J. Spencer 1:f5ac63519541 87 /*
Michael J. Spencer 1:f5ac63519541 88 * Protocol entry points.
Michael J. Spencer 1:f5ac63519541 89 */
Michael J. Spencer 1:f5ac63519541 90 static void upap_init (int);
Michael J. Spencer 1:f5ac63519541 91 static void upap_lowerup (int);
Michael J. Spencer 1:f5ac63519541 92 static void upap_lowerdown (int);
Michael J. Spencer 1:f5ac63519541 93 static void upap_input (int, u_char *, int);
Michael J. Spencer 1:f5ac63519541 94 static void upap_protrej (int);
Michael J. Spencer 1:f5ac63519541 95 #if PPP_ADDITIONAL_CALLBACKS
Michael J. Spencer 1:f5ac63519541 96 static int upap_printpkt (u_char *, int, void (*)(void *, char *, ...), void *);
Michael J. Spencer 1:f5ac63519541 97 #endif /* PPP_ADDITIONAL_CALLBACKS */
Michael J. Spencer 1:f5ac63519541 98
Michael J. Spencer 1:f5ac63519541 99 struct protent pap_protent = {
Michael J. Spencer 1:f5ac63519541 100 PPP_PAP,
Michael J. Spencer 1:f5ac63519541 101 upap_init,
Michael J. Spencer 1:f5ac63519541 102 upap_input,
Michael J. Spencer 1:f5ac63519541 103 upap_protrej,
Michael J. Spencer 1:f5ac63519541 104 upap_lowerup,
Michael J. Spencer 1:f5ac63519541 105 upap_lowerdown,
Michael J. Spencer 1:f5ac63519541 106 NULL,
Michael J. Spencer 1:f5ac63519541 107 NULL,
Michael J. Spencer 1:f5ac63519541 108 #if PPP_ADDITIONAL_CALLBACKS
Michael J. Spencer 1:f5ac63519541 109 upap_printpkt,
Michael J. Spencer 1:f5ac63519541 110 NULL,
Michael J. Spencer 1:f5ac63519541 111 #endif /* PPP_ADDITIONAL_CALLBACKS */
Michael J. Spencer 1:f5ac63519541 112 1,
Michael J. Spencer 1:f5ac63519541 113 "PAP",
Michael J. Spencer 1:f5ac63519541 114 #if PPP_ADDITIONAL_CALLBACKS
Michael J. Spencer 1:f5ac63519541 115 NULL,
Michael J. Spencer 1:f5ac63519541 116 NULL,
Michael J. Spencer 1:f5ac63519541 117 NULL
Michael J. Spencer 1:f5ac63519541 118 #endif /* PPP_ADDITIONAL_CALLBACKS */
Michael J. Spencer 1:f5ac63519541 119 };
Michael J. Spencer 1:f5ac63519541 120
Michael J. Spencer 1:f5ac63519541 121 upap_state upap[NUM_PPP]; /* UPAP state; one for each unit */
Michael J. Spencer 1:f5ac63519541 122
Michael J. Spencer 1:f5ac63519541 123 static void upap_timeout (void *);
Michael J. Spencer 1:f5ac63519541 124 static void upap_reqtimeout(void *);
Michael J. Spencer 1:f5ac63519541 125 static void upap_rauthreq (upap_state *, u_char *, u_char, int);
Michael J. Spencer 1:f5ac63519541 126 static void upap_rauthack (upap_state *, u_char *, int, int);
Michael J. Spencer 1:f5ac63519541 127 static void upap_rauthnak (upap_state *, u_char *, int, int);
Michael J. Spencer 1:f5ac63519541 128 static void upap_sauthreq (upap_state *);
Michael J. Spencer 1:f5ac63519541 129 static void upap_sresp (upap_state *, u_char, u_char, char *, int);
Michael J. Spencer 1:f5ac63519541 130
Michael J. Spencer 1:f5ac63519541 131
Michael J. Spencer 1:f5ac63519541 132 /*
Michael J. Spencer 1:f5ac63519541 133 * upap_init - Initialize a UPAP unit.
Michael J. Spencer 1:f5ac63519541 134 */
Michael J. Spencer 1:f5ac63519541 135 static void
Michael J. Spencer 1:f5ac63519541 136 upap_init(int unit)
Michael J. Spencer 1:f5ac63519541 137 {
Michael J. Spencer 1:f5ac63519541 138 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 139
Michael J. Spencer 1:f5ac63519541 140 UPAPDEBUG(LOG_INFO, ("upap_init: %d\n", unit));
Michael J. Spencer 1:f5ac63519541 141 u->us_unit = unit;
Michael J. Spencer 1:f5ac63519541 142 u->us_user = NULL;
Michael J. Spencer 1:f5ac63519541 143 u->us_userlen = 0;
Michael J. Spencer 1:f5ac63519541 144 u->us_passwd = NULL;
Michael J. Spencer 1:f5ac63519541 145 u->us_passwdlen = 0;
Michael J. Spencer 1:f5ac63519541 146 u->us_clientstate = UPAPCS_INITIAL;
Michael J. Spencer 1:f5ac63519541 147 u->us_serverstate = UPAPSS_INITIAL;
Michael J. Spencer 1:f5ac63519541 148 u->us_id = 0;
Michael J. Spencer 1:f5ac63519541 149 u->us_timeouttime = UPAP_DEFTIMEOUT;
Michael J. Spencer 1:f5ac63519541 150 u->us_maxtransmits = 10;
Michael J. Spencer 1:f5ac63519541 151 u->us_reqtimeout = UPAP_DEFREQTIME;
Michael J. Spencer 1:f5ac63519541 152 }
Michael J. Spencer 1:f5ac63519541 153
Michael J. Spencer 1:f5ac63519541 154 /*
Michael J. Spencer 1:f5ac63519541 155 * upap_authwithpeer - Authenticate us with our peer (start client).
Michael J. Spencer 1:f5ac63519541 156 *
Michael J. Spencer 1:f5ac63519541 157 * Set new state and send authenticate's.
Michael J. Spencer 1:f5ac63519541 158 */
Michael J. Spencer 1:f5ac63519541 159 void
Michael J. Spencer 1:f5ac63519541 160 upap_authwithpeer(int unit, char *user, char *password)
Michael J. Spencer 1:f5ac63519541 161 {
Michael J. Spencer 1:f5ac63519541 162 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 163
Michael J. Spencer 1:f5ac63519541 164 UPAPDEBUG(LOG_INFO, ("upap_authwithpeer: %d user=%s password=%s s=%d\n",
Michael J. Spencer 1:f5ac63519541 165 unit, user, password, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 166
Michael J. Spencer 1:f5ac63519541 167 /* Save the username and password we're given */
Michael J. Spencer 1:f5ac63519541 168 u->us_user = user;
Michael J. Spencer 1:f5ac63519541 169 u->us_userlen = (int)strlen(user);
Michael J. Spencer 1:f5ac63519541 170 u->us_passwd = password;
Michael J. Spencer 1:f5ac63519541 171 u->us_passwdlen = (int)strlen(password);
Michael J. Spencer 1:f5ac63519541 172
Michael J. Spencer 1:f5ac63519541 173 u->us_transmits = 0;
Michael J. Spencer 1:f5ac63519541 174
Michael J. Spencer 1:f5ac63519541 175 /* Lower layer up yet? */
Michael J. Spencer 1:f5ac63519541 176 if (u->us_clientstate == UPAPCS_INITIAL ||
Michael J. Spencer 1:f5ac63519541 177 u->us_clientstate == UPAPCS_PENDING) {
Michael J. Spencer 1:f5ac63519541 178 u->us_clientstate = UPAPCS_PENDING;
Michael J. Spencer 1:f5ac63519541 179 return;
Michael J. Spencer 1:f5ac63519541 180 }
Michael J. Spencer 1:f5ac63519541 181
Michael J. Spencer 1:f5ac63519541 182 upap_sauthreq(u); /* Start protocol */
Michael J. Spencer 1:f5ac63519541 183 }
Michael J. Spencer 1:f5ac63519541 184
Michael J. Spencer 1:f5ac63519541 185
Michael J. Spencer 1:f5ac63519541 186 /*
Michael J. Spencer 1:f5ac63519541 187 * upap_authpeer - Authenticate our peer (start server).
Michael J. Spencer 1:f5ac63519541 188 *
Michael J. Spencer 1:f5ac63519541 189 * Set new state.
Michael J. Spencer 1:f5ac63519541 190 */
Michael J. Spencer 1:f5ac63519541 191 void
Michael J. Spencer 1:f5ac63519541 192 upap_authpeer(int unit)
Michael J. Spencer 1:f5ac63519541 193 {
Michael J. Spencer 1:f5ac63519541 194 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 195
Michael J. Spencer 1:f5ac63519541 196 /* Lower layer up yet? */
Michael J. Spencer 1:f5ac63519541 197 if (u->us_serverstate == UPAPSS_INITIAL ||
Michael J. Spencer 1:f5ac63519541 198 u->us_serverstate == UPAPSS_PENDING) {
Michael J. Spencer 1:f5ac63519541 199 u->us_serverstate = UPAPSS_PENDING;
Michael J. Spencer 1:f5ac63519541 200 return;
Michael J. Spencer 1:f5ac63519541 201 }
Michael J. Spencer 1:f5ac63519541 202
Michael J. Spencer 1:f5ac63519541 203 u->us_serverstate = UPAPSS_LISTEN;
Michael J. Spencer 1:f5ac63519541 204 if (u->us_reqtimeout > 0) {
Michael J. Spencer 1:f5ac63519541 205 TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout);
Michael J. Spencer 1:f5ac63519541 206 }
Michael J. Spencer 1:f5ac63519541 207 }
Michael J. Spencer 1:f5ac63519541 208
Michael J. Spencer 1:f5ac63519541 209 /*
Michael J. Spencer 1:f5ac63519541 210 * upap_timeout - Retransmission timer for sending auth-reqs expired.
Michael J. Spencer 1:f5ac63519541 211 */
Michael J. Spencer 1:f5ac63519541 212 static void
Michael J. Spencer 1:f5ac63519541 213 upap_timeout(void *arg)
Michael J. Spencer 1:f5ac63519541 214 {
Michael J. Spencer 1:f5ac63519541 215 upap_state *u = (upap_state *) arg;
Michael J. Spencer 1:f5ac63519541 216
Michael J. Spencer 1:f5ac63519541 217 UPAPDEBUG(LOG_INFO, ("upap_timeout: %d timeout %d expired s=%d\n",
Michael J. Spencer 1:f5ac63519541 218 u->us_unit, u->us_timeouttime, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 219
Michael J. Spencer 1:f5ac63519541 220 if (u->us_clientstate != UPAPCS_AUTHREQ) {
Michael J. Spencer 1:f5ac63519541 221 UPAPDEBUG(LOG_INFO, ("upap_timeout: not in AUTHREQ state!\n"));
Michael J. Spencer 1:f5ac63519541 222 return;
Michael J. Spencer 1:f5ac63519541 223 }
Michael J. Spencer 1:f5ac63519541 224
Michael J. Spencer 1:f5ac63519541 225 if (u->us_transmits >= u->us_maxtransmits) {
Michael J. Spencer 1:f5ac63519541 226 /* give up in disgust */
Michael J. Spencer 1:f5ac63519541 227 UPAPDEBUG(LOG_ERR, ("No response to PAP authenticate-requests\n"));
Michael J. Spencer 1:f5ac63519541 228 u->us_clientstate = UPAPCS_BADAUTH;
Michael J. Spencer 1:f5ac63519541 229 auth_withpeer_fail(u->us_unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 230 return;
Michael J. Spencer 1:f5ac63519541 231 }
Michael J. Spencer 1:f5ac63519541 232
Michael J. Spencer 1:f5ac63519541 233 upap_sauthreq(u); /* Send Authenticate-Request and set upap timeout*/
Michael J. Spencer 1:f5ac63519541 234 }
Michael J. Spencer 1:f5ac63519541 235
Michael J. Spencer 1:f5ac63519541 236
Michael J. Spencer 1:f5ac63519541 237 /*
Michael J. Spencer 1:f5ac63519541 238 * upap_reqtimeout - Give up waiting for the peer to send an auth-req.
Michael J. Spencer 1:f5ac63519541 239 */
Michael J. Spencer 1:f5ac63519541 240 static void
Michael J. Spencer 1:f5ac63519541 241 upap_reqtimeout(void *arg)
Michael J. Spencer 1:f5ac63519541 242 {
Michael J. Spencer 1:f5ac63519541 243 upap_state *u = (upap_state *) arg;
Michael J. Spencer 1:f5ac63519541 244
Michael J. Spencer 1:f5ac63519541 245 if (u->us_serverstate != UPAPSS_LISTEN) {
Michael J. Spencer 1:f5ac63519541 246 return; /* huh?? */
Michael J. Spencer 1:f5ac63519541 247 }
Michael J. Spencer 1:f5ac63519541 248
Michael J. Spencer 1:f5ac63519541 249 auth_peer_fail(u->us_unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 250 u->us_serverstate = UPAPSS_BADAUTH;
Michael J. Spencer 1:f5ac63519541 251 }
Michael J. Spencer 1:f5ac63519541 252
Michael J. Spencer 1:f5ac63519541 253
Michael J. Spencer 1:f5ac63519541 254 /*
Michael J. Spencer 1:f5ac63519541 255 * upap_lowerup - The lower layer is up.
Michael J. Spencer 1:f5ac63519541 256 *
Michael J. Spencer 1:f5ac63519541 257 * Start authenticating if pending.
Michael J. Spencer 1:f5ac63519541 258 */
Michael J. Spencer 1:f5ac63519541 259 static void
Michael J. Spencer 1:f5ac63519541 260 upap_lowerup(int unit)
Michael J. Spencer 1:f5ac63519541 261 {
Michael J. Spencer 1:f5ac63519541 262 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 263
Michael J. Spencer 1:f5ac63519541 264 UPAPDEBUG(LOG_INFO, ("upap_lowerup: init %d clientstate s=%d\n", unit, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 265
Michael J. Spencer 1:f5ac63519541 266 if (u->us_clientstate == UPAPCS_INITIAL) {
Michael J. Spencer 1:f5ac63519541 267 u->us_clientstate = UPAPCS_CLOSED;
Michael J. Spencer 1:f5ac63519541 268 } else if (u->us_clientstate == UPAPCS_PENDING) {
Michael J. Spencer 1:f5ac63519541 269 upap_sauthreq(u); /* send an auth-request */
Michael J. Spencer 1:f5ac63519541 270 /* now client state is UPAPCS__AUTHREQ */
Michael J. Spencer 1:f5ac63519541 271 }
Michael J. Spencer 1:f5ac63519541 272
Michael J. Spencer 1:f5ac63519541 273 if (u->us_serverstate == UPAPSS_INITIAL) {
Michael J. Spencer 1:f5ac63519541 274 u->us_serverstate = UPAPSS_CLOSED;
Michael J. Spencer 1:f5ac63519541 275 } else if (u->us_serverstate == UPAPSS_PENDING) {
Michael J. Spencer 1:f5ac63519541 276 u->us_serverstate = UPAPSS_LISTEN;
Michael J. Spencer 1:f5ac63519541 277 if (u->us_reqtimeout > 0) {
Michael J. Spencer 1:f5ac63519541 278 TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout);
Michael J. Spencer 1:f5ac63519541 279 }
Michael J. Spencer 1:f5ac63519541 280 }
Michael J. Spencer 1:f5ac63519541 281 }
Michael J. Spencer 1:f5ac63519541 282
Michael J. Spencer 1:f5ac63519541 283
Michael J. Spencer 1:f5ac63519541 284 /*
Michael J. Spencer 1:f5ac63519541 285 * upap_lowerdown - The lower layer is down.
Michael J. Spencer 1:f5ac63519541 286 *
Michael J. Spencer 1:f5ac63519541 287 * Cancel all timeouts.
Michael J. Spencer 1:f5ac63519541 288 */
Michael J. Spencer 1:f5ac63519541 289 static void
Michael J. Spencer 1:f5ac63519541 290 upap_lowerdown(int unit)
Michael J. Spencer 1:f5ac63519541 291 {
Michael J. Spencer 1:f5ac63519541 292 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 293
Michael J. Spencer 1:f5ac63519541 294 UPAPDEBUG(LOG_INFO, ("upap_lowerdown: %d s=%d\n", unit, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 295
Michael J. Spencer 1:f5ac63519541 296 if (u->us_clientstate == UPAPCS_AUTHREQ) { /* Timeout pending? */
Michael J. Spencer 1:f5ac63519541 297 UNTIMEOUT(upap_timeout, u); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 298 }
Michael J. Spencer 1:f5ac63519541 299 if (u->us_serverstate == UPAPSS_LISTEN && u->us_reqtimeout > 0) {
Michael J. Spencer 1:f5ac63519541 300 UNTIMEOUT(upap_reqtimeout, u);
Michael J. Spencer 1:f5ac63519541 301 }
Michael J. Spencer 1:f5ac63519541 302
Michael J. Spencer 1:f5ac63519541 303 u->us_clientstate = UPAPCS_INITIAL;
Michael J. Spencer 1:f5ac63519541 304 u->us_serverstate = UPAPSS_INITIAL;
Michael J. Spencer 1:f5ac63519541 305 }
Michael J. Spencer 1:f5ac63519541 306
Michael J. Spencer 1:f5ac63519541 307
Michael J. Spencer 1:f5ac63519541 308 /*
Michael J. Spencer 1:f5ac63519541 309 * upap_protrej - Peer doesn't speak this protocol.
Michael J. Spencer 1:f5ac63519541 310 *
Michael J. Spencer 1:f5ac63519541 311 * This shouldn't happen. In any case, pretend lower layer went down.
Michael J. Spencer 1:f5ac63519541 312 */
Michael J. Spencer 1:f5ac63519541 313 static void
Michael J. Spencer 1:f5ac63519541 314 upap_protrej(int unit)
Michael J. Spencer 1:f5ac63519541 315 {
Michael J. Spencer 1:f5ac63519541 316 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 317
Michael J. Spencer 1:f5ac63519541 318 if (u->us_clientstate == UPAPCS_AUTHREQ) {
Michael J. Spencer 1:f5ac63519541 319 UPAPDEBUG(LOG_ERR, ("PAP authentication failed due to protocol-reject\n"));
Michael J. Spencer 1:f5ac63519541 320 auth_withpeer_fail(unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 321 }
Michael J. Spencer 1:f5ac63519541 322 if (u->us_serverstate == UPAPSS_LISTEN) {
Michael J. Spencer 1:f5ac63519541 323 UPAPDEBUG(LOG_ERR, ("PAP authentication of peer failed (protocol-reject)\n"));
Michael J. Spencer 1:f5ac63519541 324 auth_peer_fail(unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 325 }
Michael J. Spencer 1:f5ac63519541 326 upap_lowerdown(unit);
Michael J. Spencer 1:f5ac63519541 327 }
Michael J. Spencer 1:f5ac63519541 328
Michael J. Spencer 1:f5ac63519541 329
Michael J. Spencer 1:f5ac63519541 330 /*
Michael J. Spencer 1:f5ac63519541 331 * upap_input - Input UPAP packet.
Michael J. Spencer 1:f5ac63519541 332 */
Michael J. Spencer 1:f5ac63519541 333 static void
Michael J. Spencer 1:f5ac63519541 334 upap_input(int unit, u_char *inpacket, int l)
Michael J. Spencer 1:f5ac63519541 335 {
Michael J. Spencer 1:f5ac63519541 336 upap_state *u = &upap[unit];
Michael J. Spencer 1:f5ac63519541 337 u_char *inp;
Michael J. Spencer 1:f5ac63519541 338 u_char code, id;
Michael J. Spencer 1:f5ac63519541 339 int len;
Michael J. Spencer 1:f5ac63519541 340
Michael J. Spencer 1:f5ac63519541 341 /*
Michael J. Spencer 1:f5ac63519541 342 * Parse header (code, id and length).
Michael J. Spencer 1:f5ac63519541 343 * If packet too short, drop it.
Michael J. Spencer 1:f5ac63519541 344 */
Michael J. Spencer 1:f5ac63519541 345 inp = inpacket;
Michael J. Spencer 1:f5ac63519541 346 if (l < (int)UPAP_HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 347 UPAPDEBUG(LOG_INFO, ("pap_input: rcvd short header.\n"));
Michael J. Spencer 1:f5ac63519541 348 return;
Michael J. Spencer 1:f5ac63519541 349 }
Michael J. Spencer 1:f5ac63519541 350 GETCHAR(code, inp);
Michael J. Spencer 1:f5ac63519541 351 GETCHAR(id, inp);
Michael J. Spencer 1:f5ac63519541 352 GETSHORT(len, inp);
Michael J. Spencer 1:f5ac63519541 353 if (len < (int)UPAP_HEADERLEN) {
Michael J. Spencer 1:f5ac63519541 354 UPAPDEBUG(LOG_INFO, ("pap_input: rcvd illegal length.\n"));
Michael J. Spencer 1:f5ac63519541 355 return;
Michael J. Spencer 1:f5ac63519541 356 }
Michael J. Spencer 1:f5ac63519541 357 if (len > l) {
Michael J. Spencer 1:f5ac63519541 358 UPAPDEBUG(LOG_INFO, ("pap_input: rcvd short packet.\n"));
Michael J. Spencer 1:f5ac63519541 359 return;
Michael J. Spencer 1:f5ac63519541 360 }
Michael J. Spencer 1:f5ac63519541 361 len -= UPAP_HEADERLEN;
Michael J. Spencer 1:f5ac63519541 362
Michael J. Spencer 1:f5ac63519541 363 /*
Michael J. Spencer 1:f5ac63519541 364 * Action depends on code.
Michael J. Spencer 1:f5ac63519541 365 */
Michael J. Spencer 1:f5ac63519541 366 switch (code) {
Michael J. Spencer 1:f5ac63519541 367 case UPAP_AUTHREQ:
Michael J. Spencer 1:f5ac63519541 368 upap_rauthreq(u, inp, id, len);
Michael J. Spencer 1:f5ac63519541 369 break;
Michael J. Spencer 1:f5ac63519541 370
Michael J. Spencer 1:f5ac63519541 371 case UPAP_AUTHACK:
Michael J. Spencer 1:f5ac63519541 372 upap_rauthack(u, inp, id, len);
Michael J. Spencer 1:f5ac63519541 373 break;
Michael J. Spencer 1:f5ac63519541 374
Michael J. Spencer 1:f5ac63519541 375 case UPAP_AUTHNAK:
Michael J. Spencer 1:f5ac63519541 376 upap_rauthnak(u, inp, id, len);
Michael J. Spencer 1:f5ac63519541 377 break;
Michael J. Spencer 1:f5ac63519541 378
Michael J. Spencer 1:f5ac63519541 379 default: /* XXX Need code reject */
Michael J. Spencer 1:f5ac63519541 380 UPAPDEBUG(LOG_INFO, ("pap_input: UNHANDLED default: code: %d, id: %d, len: %d.\n", code, id, len));
Michael J. Spencer 1:f5ac63519541 381 break;
Michael J. Spencer 1:f5ac63519541 382 }
Michael J. Spencer 1:f5ac63519541 383 }
Michael J. Spencer 1:f5ac63519541 384
Michael J. Spencer 1:f5ac63519541 385
Michael J. Spencer 1:f5ac63519541 386 /*
Michael J. Spencer 1:f5ac63519541 387 * upap_rauth - Receive Authenticate.
Michael J. Spencer 1:f5ac63519541 388 */
Michael J. Spencer 1:f5ac63519541 389 static void
Michael J. Spencer 1:f5ac63519541 390 upap_rauthreq(upap_state *u, u_char *inp, u_char id, int len)
Michael J. Spencer 1:f5ac63519541 391 {
Michael J. Spencer 1:f5ac63519541 392 u_char ruserlen, rpasswdlen;
Michael J. Spencer 1:f5ac63519541 393 char *ruser, *rpasswd;
Michael J. Spencer 1:f5ac63519541 394 u_char retcode;
Michael J. Spencer 1:f5ac63519541 395 char *msg;
Michael J. Spencer 1:f5ac63519541 396 int msglen;
Michael J. Spencer 1:f5ac63519541 397
Michael J. Spencer 1:f5ac63519541 398 UPAPDEBUG(LOG_INFO, ("pap_rauth: Rcvd id %d.\n", id));
Michael J. Spencer 1:f5ac63519541 399
Michael J. Spencer 1:f5ac63519541 400 if (u->us_serverstate < UPAPSS_LISTEN) {
Michael J. Spencer 1:f5ac63519541 401 return;
Michael J. Spencer 1:f5ac63519541 402 }
Michael J. Spencer 1:f5ac63519541 403
Michael J. Spencer 1:f5ac63519541 404 /*
Michael J. Spencer 1:f5ac63519541 405 * If we receive a duplicate authenticate-request, we are
Michael J. Spencer 1:f5ac63519541 406 * supposed to return the same status as for the first request.
Michael J. Spencer 1:f5ac63519541 407 */
Michael J. Spencer 1:f5ac63519541 408 if (u->us_serverstate == UPAPSS_OPEN) {
Michael J. Spencer 1:f5ac63519541 409 upap_sresp(u, UPAP_AUTHACK, id, "", 0); /* return auth-ack */
Michael J. Spencer 1:f5ac63519541 410 return;
Michael J. Spencer 1:f5ac63519541 411 }
Michael J. Spencer 1:f5ac63519541 412 if (u->us_serverstate == UPAPSS_BADAUTH) {
Michael J. Spencer 1:f5ac63519541 413 upap_sresp(u, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */
Michael J. Spencer 1:f5ac63519541 414 return;
Michael J. Spencer 1:f5ac63519541 415 }
Michael J. Spencer 1:f5ac63519541 416
Michael J. Spencer 1:f5ac63519541 417 /*
Michael J. Spencer 1:f5ac63519541 418 * Parse user/passwd.
Michael J. Spencer 1:f5ac63519541 419 */
Michael J. Spencer 1:f5ac63519541 420 if (len < (int)sizeof (u_char)) {
Michael J. Spencer 1:f5ac63519541 421 UPAPDEBUG(LOG_INFO, ("pap_rauth: rcvd short packet.\n"));
Michael J. Spencer 1:f5ac63519541 422 return;
Michael J. Spencer 1:f5ac63519541 423 }
Michael J. Spencer 1:f5ac63519541 424 GETCHAR(ruserlen, inp);
Michael J. Spencer 1:f5ac63519541 425 len -= sizeof (u_char) + ruserlen + sizeof (u_char);
Michael J. Spencer 1:f5ac63519541 426 if (len < 0) {
Michael J. Spencer 1:f5ac63519541 427 UPAPDEBUG(LOG_INFO, ("pap_rauth: rcvd short packet.\n"));
Michael J. Spencer 1:f5ac63519541 428 return;
Michael J. Spencer 1:f5ac63519541 429 }
Michael J. Spencer 1:f5ac63519541 430 ruser = (char *) inp;
Michael J. Spencer 1:f5ac63519541 431 INCPTR(ruserlen, inp);
Michael J. Spencer 1:f5ac63519541 432 GETCHAR(rpasswdlen, inp);
Michael J. Spencer 1:f5ac63519541 433 if (len < rpasswdlen) {
Michael J. Spencer 1:f5ac63519541 434 UPAPDEBUG(LOG_INFO, ("pap_rauth: rcvd short packet.\n"));
Michael J. Spencer 1:f5ac63519541 435 return;
Michael J. Spencer 1:f5ac63519541 436 }
Michael J. Spencer 1:f5ac63519541 437 rpasswd = (char *) inp;
Michael J. Spencer 1:f5ac63519541 438
Michael J. Spencer 1:f5ac63519541 439 /*
Michael J. Spencer 1:f5ac63519541 440 * Check the username and password given.
Michael J. Spencer 1:f5ac63519541 441 */
Michael J. Spencer 1:f5ac63519541 442 retcode = check_passwd(u->us_unit, ruser, ruserlen, rpasswd, rpasswdlen, &msg, &msglen);
Michael J. Spencer 1:f5ac63519541 443 /* lwip: currently retcode is always UPAP_AUTHACK */
Michael J. Spencer 1:f5ac63519541 444 BZERO(rpasswd, rpasswdlen);
Michael J. Spencer 1:f5ac63519541 445
Michael J. Spencer 1:f5ac63519541 446 upap_sresp(u, retcode, id, msg, msglen);
Michael J. Spencer 1:f5ac63519541 447
Michael J. Spencer 1:f5ac63519541 448 if (retcode == UPAP_AUTHACK) {
Michael J. Spencer 1:f5ac63519541 449 u->us_serverstate = UPAPSS_OPEN;
Michael J. Spencer 1:f5ac63519541 450 auth_peer_success(u->us_unit, PPP_PAP, ruser, ruserlen);
Michael J. Spencer 1:f5ac63519541 451 } else {
Michael J. Spencer 1:f5ac63519541 452 u->us_serverstate = UPAPSS_BADAUTH;
Michael J. Spencer 1:f5ac63519541 453 auth_peer_fail(u->us_unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 454 }
Michael J. Spencer 1:f5ac63519541 455
Michael J. Spencer 1:f5ac63519541 456 if (u->us_reqtimeout > 0) {
Michael J. Spencer 1:f5ac63519541 457 UNTIMEOUT(upap_reqtimeout, u);
Michael J. Spencer 1:f5ac63519541 458 }
Michael J. Spencer 1:f5ac63519541 459 }
Michael J. Spencer 1:f5ac63519541 460
Michael J. Spencer 1:f5ac63519541 461
Michael J. Spencer 1:f5ac63519541 462 /*
Michael J. Spencer 1:f5ac63519541 463 * upap_rauthack - Receive Authenticate-Ack.
Michael J. Spencer 1:f5ac63519541 464 */
Michael J. Spencer 1:f5ac63519541 465 static void
Michael J. Spencer 1:f5ac63519541 466 upap_rauthack(upap_state *u, u_char *inp, int id, int len)
Michael J. Spencer 1:f5ac63519541 467 {
Michael J. Spencer 1:f5ac63519541 468 u_char msglen;
Michael J. Spencer 1:f5ac63519541 469 char *msg;
Michael J. Spencer 1:f5ac63519541 470
Michael J. Spencer 1:f5ac63519541 471 LWIP_UNUSED_ARG(id);
Michael J. Spencer 1:f5ac63519541 472
Michael J. Spencer 1:f5ac63519541 473 UPAPDEBUG(LOG_INFO, ("pap_rauthack: Rcvd id %d s=%d\n", id, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 474
Michael J. Spencer 1:f5ac63519541 475 if (u->us_clientstate != UPAPCS_AUTHREQ) { /* XXX */
Michael J. Spencer 1:f5ac63519541 476 UPAPDEBUG(LOG_INFO, ("pap_rauthack: us_clientstate != UPAPCS_AUTHREQ\n"));
Michael J. Spencer 1:f5ac63519541 477 return;
Michael J. Spencer 1:f5ac63519541 478 }
Michael J. Spencer 1:f5ac63519541 479
Michael J. Spencer 1:f5ac63519541 480 /*
Michael J. Spencer 1:f5ac63519541 481 * Parse message.
Michael J. Spencer 1:f5ac63519541 482 */
Michael J. Spencer 1:f5ac63519541 483 if (len < (int)sizeof (u_char)) {
Michael J. Spencer 1:f5ac63519541 484 UPAPDEBUG(LOG_INFO, ("pap_rauthack: ignoring missing msg-length.\n"));
Michael J. Spencer 1:f5ac63519541 485 } else {
Michael J. Spencer 1:f5ac63519541 486 GETCHAR(msglen, inp);
Michael J. Spencer 1:f5ac63519541 487 if (msglen > 0) {
Michael J. Spencer 1:f5ac63519541 488 len -= sizeof (u_char);
Michael J. Spencer 1:f5ac63519541 489 if (len < msglen) {
Michael J. Spencer 1:f5ac63519541 490 UPAPDEBUG(LOG_INFO, ("pap_rauthack: rcvd short packet.\n"));
Michael J. Spencer 1:f5ac63519541 491 return;
Michael J. Spencer 1:f5ac63519541 492 }
Michael J. Spencer 1:f5ac63519541 493 msg = (char *) inp;
Michael J. Spencer 1:f5ac63519541 494 PRINTMSG(msg, msglen);
Michael J. Spencer 1:f5ac63519541 495 }
Michael J. Spencer 1:f5ac63519541 496 }
Michael J. Spencer 1:f5ac63519541 497 UNTIMEOUT(upap_timeout, u); /* Cancel timeout */
Michael J. Spencer 1:f5ac63519541 498 u->us_clientstate = UPAPCS_OPEN;
Michael J. Spencer 1:f5ac63519541 499
Michael J. Spencer 1:f5ac63519541 500 auth_withpeer_success(u->us_unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 501 }
Michael J. Spencer 1:f5ac63519541 502
Michael J. Spencer 1:f5ac63519541 503
Michael J. Spencer 1:f5ac63519541 504 /*
Michael J. Spencer 1:f5ac63519541 505 * upap_rauthnak - Receive Authenticate-Nak.
Michael J. Spencer 1:f5ac63519541 506 */
Michael J. Spencer 1:f5ac63519541 507 static void
Michael J. Spencer 1:f5ac63519541 508 upap_rauthnak(upap_state *u, u_char *inp, int id, int len)
Michael J. Spencer 1:f5ac63519541 509 {
Michael J. Spencer 1:f5ac63519541 510 u_char msglen;
Michael J. Spencer 1:f5ac63519541 511 char *msg;
Michael J. Spencer 1:f5ac63519541 512
Michael J. Spencer 1:f5ac63519541 513 LWIP_UNUSED_ARG(id);
Michael J. Spencer 1:f5ac63519541 514
Michael J. Spencer 1:f5ac63519541 515 UPAPDEBUG(LOG_INFO, ("pap_rauthnak: Rcvd id %d s=%d\n", id, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 516
Michael J. Spencer 1:f5ac63519541 517 if (u->us_clientstate != UPAPCS_AUTHREQ) { /* XXX */
Michael J. Spencer 1:f5ac63519541 518 return;
Michael J. Spencer 1:f5ac63519541 519 }
Michael J. Spencer 1:f5ac63519541 520
Michael J. Spencer 1:f5ac63519541 521 /*
Michael J. Spencer 1:f5ac63519541 522 * Parse message.
Michael J. Spencer 1:f5ac63519541 523 */
Michael J. Spencer 1:f5ac63519541 524 if (len < sizeof (u_char)) {
Michael J. Spencer 1:f5ac63519541 525 UPAPDEBUG(LOG_INFO, ("pap_rauthnak: ignoring missing msg-length.\n"));
Michael J. Spencer 1:f5ac63519541 526 } else {
Michael J. Spencer 1:f5ac63519541 527 GETCHAR(msglen, inp);
Michael J. Spencer 1:f5ac63519541 528 if(msglen > 0) {
Michael J. Spencer 1:f5ac63519541 529 len -= sizeof (u_char);
Michael J. Spencer 1:f5ac63519541 530 if (len < msglen) {
Michael J. Spencer 1:f5ac63519541 531 UPAPDEBUG(LOG_INFO, ("pap_rauthnak: rcvd short packet.\n"));
Michael J. Spencer 1:f5ac63519541 532 return;
Michael J. Spencer 1:f5ac63519541 533 }
Michael J. Spencer 1:f5ac63519541 534 msg = (char *) inp;
Michael J. Spencer 1:f5ac63519541 535 PRINTMSG(msg, msglen);
Michael J. Spencer 1:f5ac63519541 536 }
Michael J. Spencer 1:f5ac63519541 537 }
Michael J. Spencer 1:f5ac63519541 538
Michael J. Spencer 1:f5ac63519541 539 u->us_clientstate = UPAPCS_BADAUTH;
Michael J. Spencer 1:f5ac63519541 540
Michael J. Spencer 1:f5ac63519541 541 UPAPDEBUG(LOG_ERR, ("PAP authentication failed\n"));
Michael J. Spencer 1:f5ac63519541 542 auth_withpeer_fail(u->us_unit, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 543 }
Michael J. Spencer 1:f5ac63519541 544
Michael J. Spencer 1:f5ac63519541 545
Michael J. Spencer 1:f5ac63519541 546 /*
Michael J. Spencer 1:f5ac63519541 547 * upap_sauthreq - Send an Authenticate-Request.
Michael J. Spencer 1:f5ac63519541 548 */
Michael J. Spencer 1:f5ac63519541 549 static void
Michael J. Spencer 1:f5ac63519541 550 upap_sauthreq(upap_state *u)
Michael J. Spencer 1:f5ac63519541 551 {
Michael J. Spencer 1:f5ac63519541 552 u_char *outp;
Michael J. Spencer 1:f5ac63519541 553 int outlen;
Michael J. Spencer 1:f5ac63519541 554
Michael J. Spencer 1:f5ac63519541 555 outlen = UPAP_HEADERLEN + 2 * sizeof (u_char)
Michael J. Spencer 1:f5ac63519541 556 + u->us_userlen + u->us_passwdlen;
Michael J. Spencer 1:f5ac63519541 557 outp = outpacket_buf[u->us_unit];
Michael J. Spencer 1:f5ac63519541 558
Michael J. Spencer 1:f5ac63519541 559 MAKEHEADER(outp, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 560
Michael J. Spencer 1:f5ac63519541 561 PUTCHAR(UPAP_AUTHREQ, outp);
Michael J. Spencer 1:f5ac63519541 562 PUTCHAR(++u->us_id, outp);
Michael J. Spencer 1:f5ac63519541 563 PUTSHORT(outlen, outp);
Michael J. Spencer 1:f5ac63519541 564 PUTCHAR(u->us_userlen, outp);
Michael J. Spencer 1:f5ac63519541 565 BCOPY(u->us_user, outp, u->us_userlen);
Michael J. Spencer 1:f5ac63519541 566 INCPTR(u->us_userlen, outp);
Michael J. Spencer 1:f5ac63519541 567 PUTCHAR(u->us_passwdlen, outp);
Michael J. Spencer 1:f5ac63519541 568 BCOPY(u->us_passwd, outp, u->us_passwdlen);
Michael J. Spencer 1:f5ac63519541 569
Michael J. Spencer 1:f5ac63519541 570 pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN);
Michael J. Spencer 1:f5ac63519541 571
Michael J. Spencer 1:f5ac63519541 572 UPAPDEBUG(LOG_INFO, ("pap_sauth: Sent id %d\n", u->us_id));
Michael J. Spencer 1:f5ac63519541 573
Michael J. Spencer 1:f5ac63519541 574 TIMEOUT(upap_timeout, u, u->us_timeouttime);
Michael J. Spencer 1:f5ac63519541 575 ++u->us_transmits;
Michael J. Spencer 1:f5ac63519541 576 u->us_clientstate = UPAPCS_AUTHREQ;
Michael J. Spencer 1:f5ac63519541 577 }
Michael J. Spencer 1:f5ac63519541 578
Michael J. Spencer 1:f5ac63519541 579
Michael J. Spencer 1:f5ac63519541 580 /*
Michael J. Spencer 1:f5ac63519541 581 * upap_sresp - Send a response (ack or nak).
Michael J. Spencer 1:f5ac63519541 582 */
Michael J. Spencer 1:f5ac63519541 583 static void
Michael J. Spencer 1:f5ac63519541 584 upap_sresp(upap_state *u, u_char code, u_char id, char *msg, int msglen)
Michael J. Spencer 1:f5ac63519541 585 {
Michael J. Spencer 1:f5ac63519541 586 u_char *outp;
Michael J. Spencer 1:f5ac63519541 587 int outlen;
Michael J. Spencer 1:f5ac63519541 588
Michael J. Spencer 1:f5ac63519541 589 outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;
Michael J. Spencer 1:f5ac63519541 590 outp = outpacket_buf[u->us_unit];
Michael J. Spencer 1:f5ac63519541 591 MAKEHEADER(outp, PPP_PAP);
Michael J. Spencer 1:f5ac63519541 592
Michael J. Spencer 1:f5ac63519541 593 PUTCHAR(code, outp);
Michael J. Spencer 1:f5ac63519541 594 PUTCHAR(id, outp);
Michael J. Spencer 1:f5ac63519541 595 PUTSHORT(outlen, outp);
Michael J. Spencer 1:f5ac63519541 596 PUTCHAR(msglen, outp);
Michael J. Spencer 1:f5ac63519541 597 BCOPY(msg, outp, msglen);
Michael J. Spencer 1:f5ac63519541 598 pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN);
Michael J. Spencer 1:f5ac63519541 599
Michael J. Spencer 1:f5ac63519541 600 UPAPDEBUG(LOG_INFO, ("pap_sresp: Sent code %d, id %d s=%d\n", code, id, u->us_clientstate));
Michael J. Spencer 1:f5ac63519541 601 }
Michael J. Spencer 1:f5ac63519541 602
Michael J. Spencer 1:f5ac63519541 603 #if PPP_ADDITIONAL_CALLBACKS
Michael J. Spencer 1:f5ac63519541 604 static char *upap_codenames[] = {
Michael J. Spencer 1:f5ac63519541 605 "AuthReq", "AuthAck", "AuthNak"
Michael J. Spencer 1:f5ac63519541 606 };
Michael J. Spencer 1:f5ac63519541 607
Michael J. Spencer 1:f5ac63519541 608 /*
Michael J. Spencer 1:f5ac63519541 609 * upap_printpkt - print the contents of a PAP packet.
Michael J. Spencer 1:f5ac63519541 610 */
Michael J. Spencer 1:f5ac63519541 611 static int upap_printpkt(
Michael J. Spencer 1:f5ac63519541 612 u_char *p,
Michael J. Spencer 1:f5ac63519541 613 int plen,
Michael J. Spencer 1:f5ac63519541 614 void (*printer) (void *, char *, ...),
Michael J. Spencer 1:f5ac63519541 615 void *arg
Michael J. Spencer 1:f5ac63519541 616 )
Michael J. Spencer 1:f5ac63519541 617 {
Michael J. Spencer 1:f5ac63519541 618 LWIP_UNUSED_ARG(p);
Michael J. Spencer 1:f5ac63519541 619 LWIP_UNUSED_ARG(plen);
Michael J. Spencer 1:f5ac63519541 620 LWIP_UNUSED_ARG(printer);
Michael J. Spencer 1:f5ac63519541 621 LWIP_UNUSED_ARG(arg);
Michael J. Spencer 1:f5ac63519541 622 return 0;
Michael J. Spencer 1:f5ac63519541 623 }
Michael J. Spencer 1:f5ac63519541 624 #endif /* PPP_ADDITIONAL_CALLBACKS */
Michael J. Spencer 1:f5ac63519541 625
Michael J. Spencer 1:f5ac63519541 626 #endif /* PAP_SUPPORT */
Michael J. Spencer 1:f5ac63519541 627
Michael J. Spencer 1:f5ac63519541 628 #endif /* PPP_SUPPORT */