LwIP with PPP & Ethernet integration

Dependents:   NetworkingCoreLib

This is the mbed port of the LwIP stack: http://savannah.nongnu.org/projects/lwip/

It includes contributed content from NXP's port for LPCxxxx devices: http://www.lpcware.com/content/project/lightweight-ip-lwip-networking-stack

Licence

LwIP is licenced under the BSD licence:

Copyright (c) 2001-2004 Swedish Institute of Computer Science. 
All rights reserved. 
Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met: 
1. Redistributions of source code must retain the above copyright notice, 
this list of conditions and the following disclaimer. 
2. Redistributions in binary form must reproduce the above copyright notice, 
this list of conditions and the following disclaimer in the documentation 
and/or other materials provided with the distribution. 
3. The name of the author may not be used to endorse or promote products 
derived from this software without specific prior written permission. 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
Committer:
donatien
Date:
Thu May 24 15:53:48 2012 +0000
Revision:
0:8e01dca41002
Merge with Emilio's LwIp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8e01dca41002 1 /*****************************************************************************
donatien 0:8e01dca41002 2 * randm.c - Random number generator program file.
donatien 0:8e01dca41002 3 *
donatien 0:8e01dca41002 4 * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
donatien 0:8e01dca41002 5 * Copyright (c) 1998 by Global Election Systems Inc.
donatien 0:8e01dca41002 6 *
donatien 0:8e01dca41002 7 * The authors hereby grant permission to use, copy, modify, distribute,
donatien 0:8e01dca41002 8 * and license this software and its documentation for any purpose, provided
donatien 0:8e01dca41002 9 * that existing copyright notices are retained in all copies and that this
donatien 0:8e01dca41002 10 * notice and the following disclaimer are included verbatim in any
donatien 0:8e01dca41002 11 * distributions. No written agreement, license, or royalty fee is required
donatien 0:8e01dca41002 12 * for any of the authorized uses.
donatien 0:8e01dca41002 13 *
donatien 0:8e01dca41002 14 * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
donatien 0:8e01dca41002 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
donatien 0:8e01dca41002 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
donatien 0:8e01dca41002 17 * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
donatien 0:8e01dca41002 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
donatien 0:8e01dca41002 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
donatien 0:8e01dca41002 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
donatien 0:8e01dca41002 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
donatien 0:8e01dca41002 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
donatien 0:8e01dca41002 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
donatien 0:8e01dca41002 24 *
donatien 0:8e01dca41002 25 ******************************************************************************
donatien 0:8e01dca41002 26 * REVISION HISTORY
donatien 0:8e01dca41002 27 *
donatien 0:8e01dca41002 28 * 03-01-01 Marc Boucher <marc@mbsi.ca>
donatien 0:8e01dca41002 29 * Ported to lwIP.
donatien 0:8e01dca41002 30 * 98-06-03 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
donatien 0:8e01dca41002 31 * Extracted from avos.
donatien 0:8e01dca41002 32 *****************************************************************************/
donatien 0:8e01dca41002 33
donatien 0:8e01dca41002 34 #include "lwip/opt.h"
donatien 0:8e01dca41002 35
donatien 0:8e01dca41002 36 #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
donatien 0:8e01dca41002 37
donatien 0:8e01dca41002 38 #include "md5.h"
donatien 0:8e01dca41002 39 #include "randm.h"
donatien 0:8e01dca41002 40
donatien 0:8e01dca41002 41 #include "ppp.h"
donatien 0:8e01dca41002 42 #include "pppdebug.h"
donatien 0:8e01dca41002 43
donatien 0:8e01dca41002 44 #include <string.h>
donatien 0:8e01dca41002 45
donatien 0:8e01dca41002 46 #if MD5_SUPPORT /* this module depends on MD5 */
donatien 0:8e01dca41002 47 #define RANDPOOLSZ 16 /* Bytes stored in the pool of randomness. */
donatien 0:8e01dca41002 48
donatien 0:8e01dca41002 49 /*****************************/
donatien 0:8e01dca41002 50 /*** LOCAL DATA STRUCTURES ***/
donatien 0:8e01dca41002 51 /*****************************/
donatien 0:8e01dca41002 52 static char randPool[RANDPOOLSZ]; /* Pool of randomness. */
donatien 0:8e01dca41002 53 static long randCount = 0; /* Pseudo-random incrementer */
donatien 0:8e01dca41002 54
donatien 0:8e01dca41002 55
donatien 0:8e01dca41002 56 /***********************************/
donatien 0:8e01dca41002 57 /*** PUBLIC FUNCTION DEFINITIONS ***/
donatien 0:8e01dca41002 58 /***********************************/
donatien 0:8e01dca41002 59 /*
donatien 0:8e01dca41002 60 * Initialize the random number generator.
donatien 0:8e01dca41002 61 *
donatien 0:8e01dca41002 62 * Since this is to be called on power up, we don't have much
donatien 0:8e01dca41002 63 * system randomess to work with. Here all we use is the
donatien 0:8e01dca41002 64 * real-time clock. We'll accumulate more randomness as soon
donatien 0:8e01dca41002 65 * as things start happening.
donatien 0:8e01dca41002 66 */
donatien 0:8e01dca41002 67 void
donatien 0:8e01dca41002 68 avRandomInit()
donatien 0:8e01dca41002 69 {
donatien 0:8e01dca41002 70 avChurnRand(NULL, 0);
donatien 0:8e01dca41002 71 }
donatien 0:8e01dca41002 72
donatien 0:8e01dca41002 73 /*
donatien 0:8e01dca41002 74 * Churn the randomness pool on a random event. Call this early and often
donatien 0:8e01dca41002 75 * on random and semi-random system events to build randomness in time for
donatien 0:8e01dca41002 76 * usage. For randomly timed events, pass a null pointer and a zero length
donatien 0:8e01dca41002 77 * and this will use the system timer and other sources to add randomness.
donatien 0:8e01dca41002 78 * If new random data is available, pass a pointer to that and it will be
donatien 0:8e01dca41002 79 * included.
donatien 0:8e01dca41002 80 *
donatien 0:8e01dca41002 81 * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
donatien 0:8e01dca41002 82 */
donatien 0:8e01dca41002 83 void
donatien 0:8e01dca41002 84 avChurnRand(char *randData, u32_t randLen)
donatien 0:8e01dca41002 85 {
donatien 0:8e01dca41002 86 MD5_CTX md5;
donatien 0:8e01dca41002 87
donatien 0:8e01dca41002 88 /* LWIP_DEBUGF(LOG_INFO, ("churnRand: %u@%P\n", randLen, randData)); */
donatien 0:8e01dca41002 89 MD5Init(&md5);
donatien 0:8e01dca41002 90 MD5Update(&md5, (u_char *)randPool, sizeof(randPool));
donatien 0:8e01dca41002 91 if (randData) {
donatien 0:8e01dca41002 92 MD5Update(&md5, (u_char *)randData, randLen);
donatien 0:8e01dca41002 93 } else {
donatien 0:8e01dca41002 94 struct {
donatien 0:8e01dca41002 95 /* INCLUDE fields for any system sources of randomness */
donatien 0:8e01dca41002 96 char foobar;
donatien 0:8e01dca41002 97 } sysData;
donatien 0:8e01dca41002 98
donatien 0:8e01dca41002 99 /* Load sysData fields here. */
donatien 0:8e01dca41002 100 MD5Update(&md5, (u_char *)&sysData, sizeof(sysData));
donatien 0:8e01dca41002 101 }
donatien 0:8e01dca41002 102 MD5Final((u_char *)randPool, &md5);
donatien 0:8e01dca41002 103 /* LWIP_DEBUGF(LOG_INFO, ("churnRand: -> 0\n")); */
donatien 0:8e01dca41002 104 }
donatien 0:8e01dca41002 105
donatien 0:8e01dca41002 106 /*
donatien 0:8e01dca41002 107 * Use the random pool to generate random data. This degrades to pseudo
donatien 0:8e01dca41002 108 * random when used faster than randomness is supplied using churnRand().
donatien 0:8e01dca41002 109 * Note: It's important that there be sufficient randomness in randPool
donatien 0:8e01dca41002 110 * before this is called for otherwise the range of the result may be
donatien 0:8e01dca41002 111 * narrow enough to make a search feasible.
donatien 0:8e01dca41002 112 *
donatien 0:8e01dca41002 113 * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
donatien 0:8e01dca41002 114 *
donatien 0:8e01dca41002 115 * XXX Why does he not just call churnRand() for each block? Probably
donatien 0:8e01dca41002 116 * so that you don't ever publish the seed which could possibly help
donatien 0:8e01dca41002 117 * predict future values.
donatien 0:8e01dca41002 118 * XXX Why don't we preserve md5 between blocks and just update it with
donatien 0:8e01dca41002 119 * randCount each time? Probably there is a weakness but I wish that
donatien 0:8e01dca41002 120 * it was documented.
donatien 0:8e01dca41002 121 */
donatien 0:8e01dca41002 122 void
donatien 0:8e01dca41002 123 avGenRand(char *buf, u32_t bufLen)
donatien 0:8e01dca41002 124 {
donatien 0:8e01dca41002 125 MD5_CTX md5;
donatien 0:8e01dca41002 126 u_char tmp[16];
donatien 0:8e01dca41002 127 u32_t n;
donatien 0:8e01dca41002 128
donatien 0:8e01dca41002 129 while (bufLen > 0) {
donatien 0:8e01dca41002 130 n = LWIP_MIN(bufLen, RANDPOOLSZ);
donatien 0:8e01dca41002 131 MD5Init(&md5);
donatien 0:8e01dca41002 132 MD5Update(&md5, (u_char *)randPool, sizeof(randPool));
donatien 0:8e01dca41002 133 MD5Update(&md5, (u_char *)&randCount, sizeof(randCount));
donatien 0:8e01dca41002 134 MD5Final(tmp, &md5);
donatien 0:8e01dca41002 135 randCount++;
donatien 0:8e01dca41002 136 MEMCPY(buf, tmp, n);
donatien 0:8e01dca41002 137 buf += n;
donatien 0:8e01dca41002 138 bufLen -= n;
donatien 0:8e01dca41002 139 }
donatien 0:8e01dca41002 140 }
donatien 0:8e01dca41002 141
donatien 0:8e01dca41002 142 /*
donatien 0:8e01dca41002 143 * Return a new random number.
donatien 0:8e01dca41002 144 */
donatien 0:8e01dca41002 145 u32_t
donatien 0:8e01dca41002 146 avRandom()
donatien 0:8e01dca41002 147 {
donatien 0:8e01dca41002 148 u32_t newRand;
donatien 0:8e01dca41002 149
donatien 0:8e01dca41002 150 avGenRand((char *)&newRand, sizeof(newRand));
donatien 0:8e01dca41002 151
donatien 0:8e01dca41002 152 return newRand;
donatien 0:8e01dca41002 153 }
donatien 0:8e01dca41002 154
donatien 0:8e01dca41002 155 #else /* MD5_SUPPORT */
donatien 0:8e01dca41002 156
donatien 0:8e01dca41002 157 /*****************************/
donatien 0:8e01dca41002 158 /*** LOCAL DATA STRUCTURES ***/
donatien 0:8e01dca41002 159 /*****************************/
donatien 0:8e01dca41002 160 static int avRandomized = 0; /* Set when truely randomized. */
donatien 0:8e01dca41002 161 static u32_t avRandomSeed = 0; /* Seed used for random number generation. */
donatien 0:8e01dca41002 162
donatien 0:8e01dca41002 163
donatien 0:8e01dca41002 164 /***********************************/
donatien 0:8e01dca41002 165 /*** PUBLIC FUNCTION DEFINITIONS ***/
donatien 0:8e01dca41002 166 /***********************************/
donatien 0:8e01dca41002 167 /*
donatien 0:8e01dca41002 168 * Initialize the random number generator.
donatien 0:8e01dca41002 169 *
donatien 0:8e01dca41002 170 * Here we attempt to compute a random number seed but even if
donatien 0:8e01dca41002 171 * it isn't random, we'll randomize it later.
donatien 0:8e01dca41002 172 *
donatien 0:8e01dca41002 173 * The current method uses the fields from the real time clock,
donatien 0:8e01dca41002 174 * the idle process counter, the millisecond counter, and the
donatien 0:8e01dca41002 175 * hardware timer tick counter. When this is invoked
donatien 0:8e01dca41002 176 * in startup(), then the idle counter and timer values may
donatien 0:8e01dca41002 177 * repeat after each boot and the real time clock may not be
donatien 0:8e01dca41002 178 * operational. Thus we call it again on the first random
donatien 0:8e01dca41002 179 * event.
donatien 0:8e01dca41002 180 */
donatien 0:8e01dca41002 181 void
donatien 0:8e01dca41002 182 avRandomInit()
donatien 0:8e01dca41002 183 {
donatien 0:8e01dca41002 184 #if 0
donatien 0:8e01dca41002 185 /* Get a pointer into the last 4 bytes of clockBuf. */
donatien 0:8e01dca41002 186 u32_t *lptr1 = (u32_t *)((char *)&clockBuf[3]);
donatien 0:8e01dca41002 187
donatien 0:8e01dca41002 188 /*
donatien 0:8e01dca41002 189 * Initialize our seed using the real-time clock, the idle
donatien 0:8e01dca41002 190 * counter, the millisecond timer, and the hardware timer
donatien 0:8e01dca41002 191 * tick counter. The real-time clock and the hardware
donatien 0:8e01dca41002 192 * tick counter are the best sources of randomness but
donatien 0:8e01dca41002 193 * since the tick counter is only 16 bit (and truncated
donatien 0:8e01dca41002 194 * at that), the idle counter and millisecond timer
donatien 0:8e01dca41002 195 * (which may be small values) are added to help
donatien 0:8e01dca41002 196 * randomize the lower 16 bits of the seed.
donatien 0:8e01dca41002 197 */
donatien 0:8e01dca41002 198 readClk();
donatien 0:8e01dca41002 199 avRandomSeed += *(u32_t *)clockBuf + *lptr1 + OSIdleCtr
donatien 0:8e01dca41002 200 + ppp_mtime() + ((u32_t)TM1 << 16) + TM1;
donatien 0:8e01dca41002 201 #else
donatien 0:8e01dca41002 202 avRandomSeed += sys_jiffies(); /* XXX */
donatien 0:8e01dca41002 203 #endif
donatien 0:8e01dca41002 204
donatien 0:8e01dca41002 205 /* Initialize the Borland random number generator. */
donatien 0:8e01dca41002 206 srand((unsigned)avRandomSeed);
donatien 0:8e01dca41002 207 }
donatien 0:8e01dca41002 208
donatien 0:8e01dca41002 209 /*
donatien 0:8e01dca41002 210 * Randomize our random seed value. Here we use the fact that
donatien 0:8e01dca41002 211 * this function is called at *truely random* times by the polling
donatien 0:8e01dca41002 212 * and network functions. Here we only get 16 bits of new random
donatien 0:8e01dca41002 213 * value but we use the previous value to randomize the other 16
donatien 0:8e01dca41002 214 * bits.
donatien 0:8e01dca41002 215 */
donatien 0:8e01dca41002 216 void
donatien 0:8e01dca41002 217 avRandomize(void)
donatien 0:8e01dca41002 218 {
donatien 0:8e01dca41002 219 static u32_t last_jiffies;
donatien 0:8e01dca41002 220
donatien 0:8e01dca41002 221 if (!avRandomized) {
donatien 0:8e01dca41002 222 avRandomized = !0;
donatien 0:8e01dca41002 223 avRandomInit();
donatien 0:8e01dca41002 224 /* The initialization function also updates the seed. */
donatien 0:8e01dca41002 225 } else {
donatien 0:8e01dca41002 226 /* avRandomSeed += (avRandomSeed << 16) + TM1; */
donatien 0:8e01dca41002 227 avRandomSeed += (sys_jiffies() - last_jiffies); /* XXX */
donatien 0:8e01dca41002 228 }
donatien 0:8e01dca41002 229 last_jiffies = sys_jiffies();
donatien 0:8e01dca41002 230 }
donatien 0:8e01dca41002 231
donatien 0:8e01dca41002 232 /*
donatien 0:8e01dca41002 233 * Return a new random number.
donatien 0:8e01dca41002 234 * Here we use the Borland rand() function to supply a pseudo random
donatien 0:8e01dca41002 235 * number which we make truely random by combining it with our own
donatien 0:8e01dca41002 236 * seed which is randomized by truely random events.
donatien 0:8e01dca41002 237 * Thus the numbers will be truely random unless there have been no
donatien 0:8e01dca41002 238 * operator or network events in which case it will be pseudo random
donatien 0:8e01dca41002 239 * seeded by the real time clock.
donatien 0:8e01dca41002 240 */
donatien 0:8e01dca41002 241 u32_t
donatien 0:8e01dca41002 242 avRandom()
donatien 0:8e01dca41002 243 {
donatien 0:8e01dca41002 244 return ((((u32_t)rand() << 16) + rand()) + avRandomSeed);
donatien 0:8e01dca41002 245 }
donatien 0:8e01dca41002 246
donatien 0:8e01dca41002 247 #endif /* MD5_SUPPORT */
donatien 0:8e01dca41002 248
donatien 0:8e01dca41002 249 #endif /* PPP_SUPPORT */