My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Mon Aug 06 09:23:14 2012 +0000
Revision:
0:7a64fbb4069d
[mbed] converted /DGWWebServer/HTTPServer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:7a64fbb4069d 1 /**
screamer 0:7a64fbb4069d 2 * @file
screamer 0:7a64fbb4069d 3 * Functions common to all TCP/IPv4 modules, such as the byte order functions.
screamer 0:7a64fbb4069d 4 *
screamer 0:7a64fbb4069d 5 */
screamer 0:7a64fbb4069d 6
screamer 0:7a64fbb4069d 7 /*
screamer 0:7a64fbb4069d 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
screamer 0:7a64fbb4069d 9 * All rights reserved.
screamer 0:7a64fbb4069d 10 *
screamer 0:7a64fbb4069d 11 * Redistribution and use in source and binary forms, with or without modification,
screamer 0:7a64fbb4069d 12 * are permitted provided that the following conditions are met:
screamer 0:7a64fbb4069d 13 *
screamer 0:7a64fbb4069d 14 * 1. Redistributions of source code must retain the above copyright notice,
screamer 0:7a64fbb4069d 15 * this list of conditions and the following disclaimer.
screamer 0:7a64fbb4069d 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
screamer 0:7a64fbb4069d 17 * this list of conditions and the following disclaimer in the documentation
screamer 0:7a64fbb4069d 18 * and/or other materials provided with the distribution.
screamer 0:7a64fbb4069d 19 * 3. The name of the author may not be used to endorse or promote products
screamer 0:7a64fbb4069d 20 * derived from this software without specific prior written permission.
screamer 0:7a64fbb4069d 21 *
screamer 0:7a64fbb4069d 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
screamer 0:7a64fbb4069d 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
screamer 0:7a64fbb4069d 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
screamer 0:7a64fbb4069d 25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
screamer 0:7a64fbb4069d 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
screamer 0:7a64fbb4069d 27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
screamer 0:7a64fbb4069d 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
screamer 0:7a64fbb4069d 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
screamer 0:7a64fbb4069d 30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
screamer 0:7a64fbb4069d 31 * OF SUCH DAMAGE.
screamer 0:7a64fbb4069d 32 *
screamer 0:7a64fbb4069d 33 * This file is part of the lwIP TCP/IP stack.
screamer 0:7a64fbb4069d 34 *
screamer 0:7a64fbb4069d 35 * Author: Adam Dunkels <adam@sics.se>
screamer 0:7a64fbb4069d 36 *
screamer 0:7a64fbb4069d 37 */
screamer 0:7a64fbb4069d 38
screamer 0:7a64fbb4069d 39 #include "lwip/opt.h"
screamer 0:7a64fbb4069d 40
screamer 0:7a64fbb4069d 41 #include "lwip/inet.h"
screamer 0:7a64fbb4069d 42
screamer 0:7a64fbb4069d 43 /* Here for now until needed in other places in lwIP */
screamer 0:7a64fbb4069d 44 #ifndef isprint
screamer 0:7a64fbb4069d 45 #define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up)
screamer 0:7a64fbb4069d 46 #define isprint(c) in_range(c, 0x20, 0x7f)
screamer 0:7a64fbb4069d 47 #define isdigit(c) in_range(c, '0', '9')
screamer 0:7a64fbb4069d 48 #define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
screamer 0:7a64fbb4069d 49 #define islower(c) in_range(c, 'a', 'z')
screamer 0:7a64fbb4069d 50 #define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
screamer 0:7a64fbb4069d 51 #endif
screamer 0:7a64fbb4069d 52
screamer 0:7a64fbb4069d 53 /**
screamer 0:7a64fbb4069d 54 * Ascii internet address interpretation routine.
screamer 0:7a64fbb4069d 55 * The value returned is in network order.
screamer 0:7a64fbb4069d 56 *
screamer 0:7a64fbb4069d 57 * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
screamer 0:7a64fbb4069d 58 * @return ip address in network order
screamer 0:7a64fbb4069d 59 */
screamer 0:7a64fbb4069d 60 u32_t
screamer 0:7a64fbb4069d 61 inet_addr(const char *cp)
screamer 0:7a64fbb4069d 62 {
screamer 0:7a64fbb4069d 63 struct in_addr val;
screamer 0:7a64fbb4069d 64
screamer 0:7a64fbb4069d 65 if (inet_aton(cp, &val)) {
screamer 0:7a64fbb4069d 66 return (val.s_addr);
screamer 0:7a64fbb4069d 67 }
screamer 0:7a64fbb4069d 68 return (INADDR_NONE);
screamer 0:7a64fbb4069d 69 }
screamer 0:7a64fbb4069d 70
screamer 0:7a64fbb4069d 71 /**
screamer 0:7a64fbb4069d 72 * Check whether "cp" is a valid ascii representation
screamer 0:7a64fbb4069d 73 * of an Internet address and convert to a binary address.
screamer 0:7a64fbb4069d 74 * Returns 1 if the address is valid, 0 if not.
screamer 0:7a64fbb4069d 75 * This replaces inet_addr, the return value from which
screamer 0:7a64fbb4069d 76 * cannot distinguish between failure and a local broadcast address.
screamer 0:7a64fbb4069d 77 *
screamer 0:7a64fbb4069d 78 * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
screamer 0:7a64fbb4069d 79 * @param addr pointer to which to save the ip address in network order
screamer 0:7a64fbb4069d 80 * @return 1 if cp could be converted to addr, 0 on failure
screamer 0:7a64fbb4069d 81 */
screamer 0:7a64fbb4069d 82 int
screamer 0:7a64fbb4069d 83 inet_aton(const char *cp, struct in_addr *addr)
screamer 0:7a64fbb4069d 84 {
screamer 0:7a64fbb4069d 85 u32_t val;
screamer 0:7a64fbb4069d 86 u8_t base;
screamer 0:7a64fbb4069d 87 char c;
screamer 0:7a64fbb4069d 88 u32_t parts[4];
screamer 0:7a64fbb4069d 89 u32_t *pp = parts;
screamer 0:7a64fbb4069d 90
screamer 0:7a64fbb4069d 91 c = *cp;
screamer 0:7a64fbb4069d 92 for (;;) {
screamer 0:7a64fbb4069d 93 /*
screamer 0:7a64fbb4069d 94 * Collect number up to ``.''.
screamer 0:7a64fbb4069d 95 * Values are specified as for C:
screamer 0:7a64fbb4069d 96 * 0x=hex, 0=octal, 1-9=decimal.
screamer 0:7a64fbb4069d 97 */
screamer 0:7a64fbb4069d 98 if (!isdigit(c))
screamer 0:7a64fbb4069d 99 return (0);
screamer 0:7a64fbb4069d 100 val = 0;
screamer 0:7a64fbb4069d 101 base = 10;
screamer 0:7a64fbb4069d 102 if (c == '0') {
screamer 0:7a64fbb4069d 103 c = *++cp;
screamer 0:7a64fbb4069d 104 if (c == 'x' || c == 'X') {
screamer 0:7a64fbb4069d 105 base = 16;
screamer 0:7a64fbb4069d 106 c = *++cp;
screamer 0:7a64fbb4069d 107 } else
screamer 0:7a64fbb4069d 108 base = 8;
screamer 0:7a64fbb4069d 109 }
screamer 0:7a64fbb4069d 110 for (;;) {
screamer 0:7a64fbb4069d 111 if (isdigit(c)) {
screamer 0:7a64fbb4069d 112 val = (val * base) + (int)(c - '0');
screamer 0:7a64fbb4069d 113 c = *++cp;
screamer 0:7a64fbb4069d 114 } else if (base == 16 && isxdigit(c)) {
screamer 0:7a64fbb4069d 115 val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
screamer 0:7a64fbb4069d 116 c = *++cp;
screamer 0:7a64fbb4069d 117 } else
screamer 0:7a64fbb4069d 118 break;
screamer 0:7a64fbb4069d 119 }
screamer 0:7a64fbb4069d 120 if (c == '.') {
screamer 0:7a64fbb4069d 121 /*
screamer 0:7a64fbb4069d 122 * Internet format:
screamer 0:7a64fbb4069d 123 * a.b.c.d
screamer 0:7a64fbb4069d 124 * a.b.c (with c treated as 16 bits)
screamer 0:7a64fbb4069d 125 * a.b (with b treated as 24 bits)
screamer 0:7a64fbb4069d 126 */
screamer 0:7a64fbb4069d 127 if (pp >= parts + 3)
screamer 0:7a64fbb4069d 128 return (0);
screamer 0:7a64fbb4069d 129 *pp++ = val;
screamer 0:7a64fbb4069d 130 c = *++cp;
screamer 0:7a64fbb4069d 131 } else
screamer 0:7a64fbb4069d 132 break;
screamer 0:7a64fbb4069d 133 }
screamer 0:7a64fbb4069d 134 /*
screamer 0:7a64fbb4069d 135 * Check for trailing characters.
screamer 0:7a64fbb4069d 136 */
screamer 0:7a64fbb4069d 137 if (c != '\0' && !isspace(c))
screamer 0:7a64fbb4069d 138 return (0);
screamer 0:7a64fbb4069d 139 /*
screamer 0:7a64fbb4069d 140 * Concoct the address according to
screamer 0:7a64fbb4069d 141 * the number of parts specified.
screamer 0:7a64fbb4069d 142 */
screamer 0:7a64fbb4069d 143 switch (pp - parts + 1) {
screamer 0:7a64fbb4069d 144
screamer 0:7a64fbb4069d 145 case 0:
screamer 0:7a64fbb4069d 146 return (0); /* initial nondigit */
screamer 0:7a64fbb4069d 147
screamer 0:7a64fbb4069d 148 case 1: /* a -- 32 bits */
screamer 0:7a64fbb4069d 149 break;
screamer 0:7a64fbb4069d 150
screamer 0:7a64fbb4069d 151 case 2: /* a.b -- 8.24 bits */
screamer 0:7a64fbb4069d 152 if (val > 0xffffffUL)
screamer 0:7a64fbb4069d 153 return (0);
screamer 0:7a64fbb4069d 154 val |= parts[0] << 24;
screamer 0:7a64fbb4069d 155 break;
screamer 0:7a64fbb4069d 156
screamer 0:7a64fbb4069d 157 case 3: /* a.b.c -- 8.8.16 bits */
screamer 0:7a64fbb4069d 158 if (val > 0xffff)
screamer 0:7a64fbb4069d 159 return (0);
screamer 0:7a64fbb4069d 160 val |= (parts[0] << 24) | (parts[1] << 16);
screamer 0:7a64fbb4069d 161 break;
screamer 0:7a64fbb4069d 162
screamer 0:7a64fbb4069d 163 case 4: /* a.b.c.d -- 8.8.8.8 bits */
screamer 0:7a64fbb4069d 164 if (val > 0xff)
screamer 0:7a64fbb4069d 165 return (0);
screamer 0:7a64fbb4069d 166 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
screamer 0:7a64fbb4069d 167 break;
screamer 0:7a64fbb4069d 168 }
screamer 0:7a64fbb4069d 169 if (addr)
screamer 0:7a64fbb4069d 170 addr->s_addr = htonl(val);
screamer 0:7a64fbb4069d 171 return (1);
screamer 0:7a64fbb4069d 172 }
screamer 0:7a64fbb4069d 173
screamer 0:7a64fbb4069d 174 /**
screamer 0:7a64fbb4069d 175 * Convert numeric IP address into decimal dotted ASCII representation.
screamer 0:7a64fbb4069d 176 * returns ptr to static buffer; not reentrant!
screamer 0:7a64fbb4069d 177 *
screamer 0:7a64fbb4069d 178 * @param addr ip address in network order to convert
screamer 0:7a64fbb4069d 179 * @return pointer to a global static (!) buffer that holds the ASCII
screamer 0:7a64fbb4069d 180 * represenation of addr
screamer 0:7a64fbb4069d 181 */
screamer 0:7a64fbb4069d 182 char *
screamer 0:7a64fbb4069d 183 inet_ntoa(struct in_addr addr)
screamer 0:7a64fbb4069d 184 {
screamer 0:7a64fbb4069d 185 static char str[16];
screamer 0:7a64fbb4069d 186 u32_t s_addr = addr.s_addr;
screamer 0:7a64fbb4069d 187 char inv[3];
screamer 0:7a64fbb4069d 188 char *rp;
screamer 0:7a64fbb4069d 189 u8_t *ap;
screamer 0:7a64fbb4069d 190 u8_t rem;
screamer 0:7a64fbb4069d 191 u8_t n;
screamer 0:7a64fbb4069d 192 u8_t i;
screamer 0:7a64fbb4069d 193
screamer 0:7a64fbb4069d 194 rp = str;
screamer 0:7a64fbb4069d 195 ap = (u8_t *)&s_addr;
screamer 0:7a64fbb4069d 196 for(n = 0; n < 4; n++) {
screamer 0:7a64fbb4069d 197 i = 0;
screamer 0:7a64fbb4069d 198 do {
screamer 0:7a64fbb4069d 199 rem = *ap % (u8_t)10;
screamer 0:7a64fbb4069d 200 *ap /= (u8_t)10;
screamer 0:7a64fbb4069d 201 inv[i++] = '0' + rem;
screamer 0:7a64fbb4069d 202 } while(*ap);
screamer 0:7a64fbb4069d 203 while(i--)
screamer 0:7a64fbb4069d 204 *rp++ = inv[i];
screamer 0:7a64fbb4069d 205 *rp++ = '.';
screamer 0:7a64fbb4069d 206 ap++;
screamer 0:7a64fbb4069d 207 }
screamer 0:7a64fbb4069d 208 *--rp = 0;
screamer 0:7a64fbb4069d 209 return str;
screamer 0:7a64fbb4069d 210 }
screamer 0:7a64fbb4069d 211
screamer 0:7a64fbb4069d 212 /**
screamer 0:7a64fbb4069d 213 * These are reference implementations of the byte swapping functions.
screamer 0:7a64fbb4069d 214 * Again with the aim of being simple, correct and fully portable.
screamer 0:7a64fbb4069d 215 * Byte swapping is the second thing you would want to optimize. You will
screamer 0:7a64fbb4069d 216 * need to port it to your architecture and in your cc.h:
screamer 0:7a64fbb4069d 217 *
screamer 0:7a64fbb4069d 218 * #define LWIP_PLATFORM_BYTESWAP 1
screamer 0:7a64fbb4069d 219 * #define LWIP_PLATFORM_HTONS(x) <your_htons>
screamer 0:7a64fbb4069d 220 * #define LWIP_PLATFORM_HTONL(x) <your_htonl>
screamer 0:7a64fbb4069d 221 *
screamer 0:7a64fbb4069d 222 * Note ntohs() and ntohl() are merely references to the htonx counterparts.
screamer 0:7a64fbb4069d 223 */
screamer 0:7a64fbb4069d 224
screamer 0:7a64fbb4069d 225 #if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN)
screamer 0:7a64fbb4069d 226
screamer 0:7a64fbb4069d 227 /**
screamer 0:7a64fbb4069d 228 * Convert an u16_t from host- to network byte order.
screamer 0:7a64fbb4069d 229 *
screamer 0:7a64fbb4069d 230 * @param n u16_t in host byte order
screamer 0:7a64fbb4069d 231 * @return n in network byte order
screamer 0:7a64fbb4069d 232 */
screamer 0:7a64fbb4069d 233 u16_t
screamer 0:7a64fbb4069d 234 htons(u16_t n)
screamer 0:7a64fbb4069d 235 {
screamer 0:7a64fbb4069d 236 return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
screamer 0:7a64fbb4069d 237 }
screamer 0:7a64fbb4069d 238
screamer 0:7a64fbb4069d 239 /**
screamer 0:7a64fbb4069d 240 * Convert an u16_t from network- to host byte order.
screamer 0:7a64fbb4069d 241 *
screamer 0:7a64fbb4069d 242 * @param n u16_t in network byte order
screamer 0:7a64fbb4069d 243 * @return n in host byte order
screamer 0:7a64fbb4069d 244 */
screamer 0:7a64fbb4069d 245 u16_t
screamer 0:7a64fbb4069d 246 ntohs(u16_t n)
screamer 0:7a64fbb4069d 247 {
screamer 0:7a64fbb4069d 248 return htons(n);
screamer 0:7a64fbb4069d 249 }
screamer 0:7a64fbb4069d 250
screamer 0:7a64fbb4069d 251 /**
screamer 0:7a64fbb4069d 252 * Convert an u32_t from host- to network byte order.
screamer 0:7a64fbb4069d 253 *
screamer 0:7a64fbb4069d 254 * @param n u32_t in host byte order
screamer 0:7a64fbb4069d 255 * @return n in network byte order
screamer 0:7a64fbb4069d 256 */
screamer 0:7a64fbb4069d 257 u32_t
screamer 0:7a64fbb4069d 258 htonl(u32_t n)
screamer 0:7a64fbb4069d 259 {
screamer 0:7a64fbb4069d 260 return ((n & 0xff) << 24) |
screamer 0:7a64fbb4069d 261 ((n & 0xff00) << 8) |
screamer 0:7a64fbb4069d 262 ((n & 0xff0000UL) >> 8) |
screamer 0:7a64fbb4069d 263 ((n & 0xff000000UL) >> 24);
screamer 0:7a64fbb4069d 264 }
screamer 0:7a64fbb4069d 265
screamer 0:7a64fbb4069d 266 /**
screamer 0:7a64fbb4069d 267 * Convert an u32_t from network- to host byte order.
screamer 0:7a64fbb4069d 268 *
screamer 0:7a64fbb4069d 269 * @param n u32_t in network byte order
screamer 0:7a64fbb4069d 270 * @return n in host byte order
screamer 0:7a64fbb4069d 271 */
screamer 0:7a64fbb4069d 272 u32_t
screamer 0:7a64fbb4069d 273 ntohl(u32_t n)
screamer 0:7a64fbb4069d 274 {
screamer 0:7a64fbb4069d 275 return htonl(n);
screamer 0:7a64fbb4069d 276 }
screamer 0:7a64fbb4069d 277
screamer 0:7a64fbb4069d 278 #endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */