Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

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