Library for Bert van Dam's book "ARM MICROCONTROLLERS" For all chapters with internet.

Dependencies:   mbed

Committer:
ICTFBI
Date:
Fri Oct 16 14:28:26 2015 +0000
Revision:
0:4edb816d21e1
Pre-update 16-10-15

Who changed what in which revision?

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