00001 /* 00002 * Copyright (C) 2001-2004 by egnite Software GmbH. All rights reserved. 00003 * 00004 * Redistribution and use in source and binary forms, with or without 00005 * modification, are permitted provided that the following conditions 00006 * are met: 00007 * 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the copyright holders nor the names of 00014 * contributors may be used to endorse or promote products derived 00015 * from this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS 00018 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00019 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00020 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE 00021 * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00022 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00023 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 00024 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 00025 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00026 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 00027 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00028 * SUCH DAMAGE. 00029 * 00030 * For additional information see http://www.ethernut.de/ 00031 * 00032 * - 00033 * Portions are 00034 * Copyright (c) 1989 by Carnegie Mellon University. 00035 * All rights reserved. 00036 * 00037 * Redistribution and use in source and binary forms are permitted 00038 * provided that the above copyright notice and this paragraph are 00039 * duplicated in all such forms and that any documentation, 00040 * advertising materials, and other materials related to such 00041 * distribution and use acknowledge that the software was developed 00042 * by Carnegie Mellon University. The name of the 00043 * University may not be used to endorse or promote products derived 00044 * from this software without specific prior written permission. 00045 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 00046 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 00047 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00048 */ 00049 00050 /* 00051 * $Log$ 00052 * Revision 1.7 2008/08/11 07:00:30 haraldkipp 00053 * BSD types replaced by stdint types (feature request #1282721). 00054 * 00055 * Revision 1.6 2006/10/08 16:48:22 haraldkipp 00056 * Documentation fixed 00057 * 00058 * Revision 1.5 2005/04/08 15:20:51 olereinhardt 00059 * added <sys/types.h> (__APPLE__) and <netinet/in.h> (__linux__) 00060 * for htons and simmilar. 00061 * 00062 * Revision 1.4 2004/03/08 11:26:57 haraldkipp 00063 * Bugfix, establishing PPP sessions failed. 00064 * 00065 * Revision 1.3 2004/01/30 11:37:58 haraldkipp 00066 * Handle magic number rejects 00067 * 00068 * Revision 1.2 2003/08/14 15:18:41 haraldkipp 00069 * Negotiate local magic 00070 * 00071 * Revision 1.1.1.1 2003/05/09 14:41:34 haraldkipp 00072 * Initial using 3.2.1 00073 * 00074 * Revision 1.2 2003/05/06 18:15:30 harald 00075 * Use async map define 00076 * 00077 * Revision 1.1 2003/03/31 14:53:28 harald 00078 * Prepare release 3.1 00079 * 00080 */ 00081 00082 #include <string.h> 00083 00084 #include <dev/ppp.h> 00085 #include <sys/types.h> 00086 #include <sys/heap.h> 00087 #include <netinet/in.h> 00088 #include <net/if_var.h> 00089 #include <netinet/if_ppp.h> 00090 #include <netinet/ppp_fsm.h> 00091 #include <net/ppp.h> 00092 00097 00098 extern uint32_t new_magic; 00099 00116 int NutLcpOutput(NUTDEVICE * dev, uint8_t code, uint8_t id, NETBUF * nb) 00117 { 00118 XCPHDR *lcp; 00119 00120 if ((nb = NutNetBufAlloc(nb, NBAF_NETWORK, sizeof(XCPHDR))) == 0) 00121 return -1; 00122 00123 lcp = nb->nb_nw.vp; 00124 lcp->xch_code = code; 00125 lcp->xch_id = id; 00126 lcp->xch_len = htons(nb->nb_nw.sz + nb->nb_tp.sz + nb->nb_ap.sz); 00127 00128 if (NutPppOutput(dev, PPP_LCP, 0, nb) == 0) 00129 NutNetBufFree(nb); 00130 00131 return 0; 00132 } 00133 00134 void LcpResetOptions(NUTDEVICE * dev) 00135 { 00136 PPPDCB *dcb = dev->dev_dcb; 00137 00138 dcb->dcb_compr = 0; 00139 dcb->dcb_auth = PPP_PAP; 00140 dcb->dcb_neg_magic = new_magic; 00141 dcb->dcb_loc_magic = 0; 00142 dcb->dcb_rem_magic = 0; 00143 dcb->dcb_accm = LCP_DEFOPT_ASYNCMAP; 00144 dcb->dcb_loc_mru = 1500; 00145 } 00146 00147 /* 00148 * Send a Configure-Request. 00149 */ 00150 void LcpTxConfReq(NUTDEVICE * dev, uint8_t id, uint8_t rejected) 00151 { 00152 PPPDCB *dcb = dev->dev_dcb; 00153 XCPOPT *xcpo; 00154 NETBUF *nb; 00155 00156 /* 00157 * Not currently negotiating, reset options. 00158 */ 00159 if (dcb->dcb_lcp_state != PPPS_REQSENT && dcb->dcb_lcp_state != PPPS_ACKRCVD && dcb->dcb_lcp_state != PPPS_ACKSENT) { 00160 LcpResetOptions(dev); 00161 dcb->dcb_lcp_naks = 0; 00162 } 00163 dcb->dcb_acked = 0; 00164 dcb->dcb_retries = 0; 00165 00166 /* 00167 * Create the request. 00168 */ 00169 if ((nb = NutNetBufAlloc(0, NBAF_APPLICATION, rejected ? 6 : 12)) != 0) { 00170 xcpo = nb->nb_ap.vp; 00171 xcpo->xcpo_type = LCP_ASYNCMAP; 00172 xcpo->xcpo_len = 6; 00173 xcpo->xcpo_.ul = htonl(LCP_DEFOPT_ASYNCMAP); 00174 00175 /* 00176 * This is a temporary hack. In the initial version 00177 * we sent the ASYNCMAP only and never expected any 00178 * rejects. The MAGICNUMBER had been added later 00179 * to support echo requests, but some servers reject 00180 * this option. Now we still do not provide full 00181 * reject processing but blindly assume, that the 00182 * MAGICNUMBER is the rejected option. 00183 */ 00184 if (!rejected) { 00185 xcpo = (XCPOPT *) ((char *) xcpo + xcpo->xcpo_len); 00186 xcpo->xcpo_type = LCP_MAGICNUMBER; 00187 xcpo->xcpo_len = 6; 00188 xcpo->xcpo_.ul = dcb->dcb_neg_magic; 00189 } 00190 00191 NutLcpOutput(dev, XCP_CONFREQ, id, nb); 00192 } 00193 } 00194 00195 /* 00196 * Send a Protocol-Reject for some protocol. 00197 */ 00198 void LcpTxProtRej(NUTDEVICE * dev, uint16_t protocol, NETBUF * nb) 00199 { 00200 PPPDCB *dcb = dev->dev_dcb; 00201 NETBUF *nbr; 00202 uint16_t *sp; 00203 00204 if ((nbr = NutNetBufAlloc(0, NBAF_APPLICATION, nb->nb_nw.sz)) != 0) { 00205 sp = nbr->nb_ap.vp; 00206 *sp++ = htons(protocol); 00207 memcpy(sp, nb->nb_nw.vp, nb->nb_nw.sz - 2); 00208 NutNetBufFree(nb); 00209 NutLcpOutput(dev, LCP_PROTREJ, ++dcb->dcb_rejid, nbr); 00210 } else { 00211 NutNetBufFree(nb); 00212 } 00213 } 00214