Deprecated fork of old network stack source from github. Please use official library instead: https://mbed.org/users/mbed_official/code/EthernetInterface/

Committer:
AdamGreen
Date:
Sat Oct 26 08:51:36 2013 +0000
Revision:
1:eadc868c2acf
Parent:
0:3b00827bb0b7
Fix TCP checksum bug and stranded large TCP segments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdamGreen 0:3b00827bb0b7 1 /**
AdamGreen 0:3b00827bb0b7 2 * @file
AdamGreen 0:3b00827bb0b7 3 * Network buffer management
AdamGreen 0:3b00827bb0b7 4 *
AdamGreen 0:3b00827bb0b7 5 */
AdamGreen 0:3b00827bb0b7 6
AdamGreen 0:3b00827bb0b7 7 /*
AdamGreen 0:3b00827bb0b7 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
AdamGreen 0:3b00827bb0b7 9 * All rights reserved.
AdamGreen 0:3b00827bb0b7 10 *
AdamGreen 0:3b00827bb0b7 11 * Redistribution and use in source and binary forms, with or without modification,
AdamGreen 0:3b00827bb0b7 12 * are permitted provided that the following conditions are met:
AdamGreen 0:3b00827bb0b7 13 *
AdamGreen 0:3b00827bb0b7 14 * 1. Redistributions of source code must retain the above copyright notice,
AdamGreen 0:3b00827bb0b7 15 * this list of conditions and the following disclaimer.
AdamGreen 0:3b00827bb0b7 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
AdamGreen 0:3b00827bb0b7 17 * this list of conditions and the following disclaimer in the documentation
AdamGreen 0:3b00827bb0b7 18 * and/or other materials provided with the distribution.
AdamGreen 0:3b00827bb0b7 19 * 3. The name of the author may not be used to endorse or promote products
AdamGreen 0:3b00827bb0b7 20 * derived from this software without specific prior written permission.
AdamGreen 0:3b00827bb0b7 21 *
AdamGreen 0:3b00827bb0b7 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
AdamGreen 0:3b00827bb0b7 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
AdamGreen 0:3b00827bb0b7 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
AdamGreen 0:3b00827bb0b7 25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
AdamGreen 0:3b00827bb0b7 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
AdamGreen 0:3b00827bb0b7 27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
AdamGreen 0:3b00827bb0b7 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
AdamGreen 0:3b00827bb0b7 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
AdamGreen 0:3b00827bb0b7 30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
AdamGreen 0:3b00827bb0b7 31 * OF SUCH DAMAGE.
AdamGreen 0:3b00827bb0b7 32 *
AdamGreen 0:3b00827bb0b7 33 * This file is part of the lwIP TCP/IP stack.
AdamGreen 0:3b00827bb0b7 34 *
AdamGreen 0:3b00827bb0b7 35 * Author: Adam Dunkels <adam@sics.se>
AdamGreen 0:3b00827bb0b7 36 *
AdamGreen 0:3b00827bb0b7 37 */
AdamGreen 0:3b00827bb0b7 38
AdamGreen 0:3b00827bb0b7 39 #include "lwip/opt.h"
AdamGreen 0:3b00827bb0b7 40
AdamGreen 0:3b00827bb0b7 41 #if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
AdamGreen 0:3b00827bb0b7 42
AdamGreen 0:3b00827bb0b7 43 #include "lwip/netbuf.h"
AdamGreen 0:3b00827bb0b7 44 #include "lwip/memp.h"
AdamGreen 0:3b00827bb0b7 45
AdamGreen 0:3b00827bb0b7 46 #include <string.h>
AdamGreen 0:3b00827bb0b7 47
AdamGreen 0:3b00827bb0b7 48 /**
AdamGreen 0:3b00827bb0b7 49 * Create (allocate) and initialize a new netbuf.
AdamGreen 0:3b00827bb0b7 50 * The netbuf doesn't yet contain a packet buffer!
AdamGreen 0:3b00827bb0b7 51 *
AdamGreen 0:3b00827bb0b7 52 * @return a pointer to a new netbuf
AdamGreen 0:3b00827bb0b7 53 * NULL on lack of memory
AdamGreen 0:3b00827bb0b7 54 */
AdamGreen 0:3b00827bb0b7 55 struct
AdamGreen 0:3b00827bb0b7 56 netbuf *netbuf_new(void)
AdamGreen 0:3b00827bb0b7 57 {
AdamGreen 0:3b00827bb0b7 58 struct netbuf *buf;
AdamGreen 0:3b00827bb0b7 59
AdamGreen 0:3b00827bb0b7 60 buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
AdamGreen 0:3b00827bb0b7 61 if (buf != NULL) {
AdamGreen 0:3b00827bb0b7 62 buf->p = NULL;
AdamGreen 0:3b00827bb0b7 63 buf->ptr = NULL;
AdamGreen 0:3b00827bb0b7 64 ip_addr_set_any(&buf->addr);
AdamGreen 0:3b00827bb0b7 65 buf->port = 0;
AdamGreen 0:3b00827bb0b7 66 #if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY
AdamGreen 0:3b00827bb0b7 67 #if LWIP_CHECKSUM_ON_COPY
AdamGreen 0:3b00827bb0b7 68 buf->flags = 0;
AdamGreen 0:3b00827bb0b7 69 #endif /* LWIP_CHECKSUM_ON_COPY */
AdamGreen 0:3b00827bb0b7 70 buf->toport_chksum = 0;
AdamGreen 0:3b00827bb0b7 71 #if LWIP_NETBUF_RECVINFO
AdamGreen 0:3b00827bb0b7 72 ip_addr_set_any(&buf->toaddr);
AdamGreen 0:3b00827bb0b7 73 #endif /* LWIP_NETBUF_RECVINFO */
AdamGreen 0:3b00827bb0b7 74 #endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */
AdamGreen 0:3b00827bb0b7 75 return buf;
AdamGreen 0:3b00827bb0b7 76 } else {
AdamGreen 0:3b00827bb0b7 77 return NULL;
AdamGreen 0:3b00827bb0b7 78 }
AdamGreen 0:3b00827bb0b7 79 }
AdamGreen 0:3b00827bb0b7 80
AdamGreen 0:3b00827bb0b7 81 /**
AdamGreen 0:3b00827bb0b7 82 * Deallocate a netbuf allocated by netbuf_new().
AdamGreen 0:3b00827bb0b7 83 *
AdamGreen 0:3b00827bb0b7 84 * @param buf pointer to a netbuf allocated by netbuf_new()
AdamGreen 0:3b00827bb0b7 85 */
AdamGreen 0:3b00827bb0b7 86 void
AdamGreen 0:3b00827bb0b7 87 netbuf_delete(struct netbuf *buf)
AdamGreen 0:3b00827bb0b7 88 {
AdamGreen 0:3b00827bb0b7 89 if (buf != NULL) {
AdamGreen 0:3b00827bb0b7 90 if (buf->p != NULL) {
AdamGreen 0:3b00827bb0b7 91 pbuf_free(buf->p);
AdamGreen 0:3b00827bb0b7 92 buf->p = buf->ptr = NULL;
AdamGreen 0:3b00827bb0b7 93 }
AdamGreen 0:3b00827bb0b7 94 memp_free(MEMP_NETBUF, buf);
AdamGreen 0:3b00827bb0b7 95 }
AdamGreen 0:3b00827bb0b7 96 }
AdamGreen 0:3b00827bb0b7 97
AdamGreen 0:3b00827bb0b7 98 /**
AdamGreen 0:3b00827bb0b7 99 * Allocate memory for a packet buffer for a given netbuf.
AdamGreen 0:3b00827bb0b7 100 *
AdamGreen 0:3b00827bb0b7 101 * @param buf the netbuf for which to allocate a packet buffer
AdamGreen 0:3b00827bb0b7 102 * @param size the size of the packet buffer to allocate
AdamGreen 0:3b00827bb0b7 103 * @return pointer to the allocated memory
AdamGreen 0:3b00827bb0b7 104 * NULL if no memory could be allocated
AdamGreen 0:3b00827bb0b7 105 */
AdamGreen 0:3b00827bb0b7 106 void *
AdamGreen 0:3b00827bb0b7 107 netbuf_alloc(struct netbuf *buf, u16_t size)
AdamGreen 0:3b00827bb0b7 108 {
AdamGreen 0:3b00827bb0b7 109 LWIP_ERROR("netbuf_alloc: invalid buf", (buf != NULL), return NULL;);
AdamGreen 0:3b00827bb0b7 110
AdamGreen 0:3b00827bb0b7 111 /* Deallocate any previously allocated memory. */
AdamGreen 0:3b00827bb0b7 112 if (buf->p != NULL) {
AdamGreen 0:3b00827bb0b7 113 pbuf_free(buf->p);
AdamGreen 0:3b00827bb0b7 114 }
AdamGreen 0:3b00827bb0b7 115 buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
AdamGreen 0:3b00827bb0b7 116 if (buf->p == NULL) {
AdamGreen 0:3b00827bb0b7 117 return NULL;
AdamGreen 0:3b00827bb0b7 118 }
AdamGreen 0:3b00827bb0b7 119 LWIP_ASSERT("check that first pbuf can hold size",
AdamGreen 0:3b00827bb0b7 120 (buf->p->len >= size));
AdamGreen 0:3b00827bb0b7 121 buf->ptr = buf->p;
AdamGreen 0:3b00827bb0b7 122 return buf->p->payload;
AdamGreen 0:3b00827bb0b7 123 }
AdamGreen 0:3b00827bb0b7 124
AdamGreen 0:3b00827bb0b7 125 /**
AdamGreen 0:3b00827bb0b7 126 * Free the packet buffer included in a netbuf
AdamGreen 0:3b00827bb0b7 127 *
AdamGreen 0:3b00827bb0b7 128 * @param buf pointer to the netbuf which contains the packet buffer to free
AdamGreen 0:3b00827bb0b7 129 */
AdamGreen 0:3b00827bb0b7 130 void
AdamGreen 0:3b00827bb0b7 131 netbuf_free(struct netbuf *buf)
AdamGreen 0:3b00827bb0b7 132 {
AdamGreen 0:3b00827bb0b7 133 LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
AdamGreen 0:3b00827bb0b7 134 if (buf->p != NULL) {
AdamGreen 0:3b00827bb0b7 135 pbuf_free(buf->p);
AdamGreen 0:3b00827bb0b7 136 }
AdamGreen 0:3b00827bb0b7 137 buf->p = buf->ptr = NULL;
AdamGreen 0:3b00827bb0b7 138 }
AdamGreen 0:3b00827bb0b7 139
AdamGreen 0:3b00827bb0b7 140 /**
AdamGreen 0:3b00827bb0b7 141 * Let a netbuf reference existing (non-volatile) data.
AdamGreen 0:3b00827bb0b7 142 *
AdamGreen 0:3b00827bb0b7 143 * @param buf netbuf which should reference the data
AdamGreen 0:3b00827bb0b7 144 * @param dataptr pointer to the data to reference
AdamGreen 0:3b00827bb0b7 145 * @param size size of the data
AdamGreen 0:3b00827bb0b7 146 * @return ERR_OK if data is referenced
AdamGreen 0:3b00827bb0b7 147 * ERR_MEM if data couldn't be referenced due to lack of memory
AdamGreen 0:3b00827bb0b7 148 */
AdamGreen 0:3b00827bb0b7 149 err_t
AdamGreen 0:3b00827bb0b7 150 netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)
AdamGreen 0:3b00827bb0b7 151 {
AdamGreen 0:3b00827bb0b7 152 LWIP_ERROR("netbuf_ref: invalid buf", (buf != NULL), return ERR_ARG;);
AdamGreen 0:3b00827bb0b7 153 if (buf->p != NULL) {
AdamGreen 0:3b00827bb0b7 154 pbuf_free(buf->p);
AdamGreen 0:3b00827bb0b7 155 }
AdamGreen 0:3b00827bb0b7 156 buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
AdamGreen 0:3b00827bb0b7 157 if (buf->p == NULL) {
AdamGreen 0:3b00827bb0b7 158 buf->ptr = NULL;
AdamGreen 0:3b00827bb0b7 159 return ERR_MEM;
AdamGreen 0:3b00827bb0b7 160 }
AdamGreen 0:3b00827bb0b7 161 buf->p->payload = (void*)dataptr;
AdamGreen 0:3b00827bb0b7 162 buf->p->len = buf->p->tot_len = size;
AdamGreen 0:3b00827bb0b7 163 buf->ptr = buf->p;
AdamGreen 0:3b00827bb0b7 164 return ERR_OK;
AdamGreen 0:3b00827bb0b7 165 }
AdamGreen 0:3b00827bb0b7 166
AdamGreen 0:3b00827bb0b7 167 /**
AdamGreen 0:3b00827bb0b7 168 * Chain one netbuf to another (@see pbuf_chain)
AdamGreen 0:3b00827bb0b7 169 *
AdamGreen 0:3b00827bb0b7 170 * @param head the first netbuf
AdamGreen 0:3b00827bb0b7 171 * @param tail netbuf to chain after head, freed by this function, may not be reference after returning
AdamGreen 0:3b00827bb0b7 172 */
AdamGreen 0:3b00827bb0b7 173 void
AdamGreen 0:3b00827bb0b7 174 netbuf_chain(struct netbuf *head, struct netbuf *tail)
AdamGreen 0:3b00827bb0b7 175 {
AdamGreen 0:3b00827bb0b7 176 LWIP_ERROR("netbuf_ref: invalid head", (head != NULL), return;);
AdamGreen 0:3b00827bb0b7 177 LWIP_ERROR("netbuf_chain: invalid tail", (tail != NULL), return;);
AdamGreen 0:3b00827bb0b7 178 pbuf_cat(head->p, tail->p);
AdamGreen 0:3b00827bb0b7 179 head->ptr = head->p;
AdamGreen 0:3b00827bb0b7 180 memp_free(MEMP_NETBUF, tail);
AdamGreen 0:3b00827bb0b7 181 }
AdamGreen 0:3b00827bb0b7 182
AdamGreen 0:3b00827bb0b7 183 /**
AdamGreen 0:3b00827bb0b7 184 * Get the data pointer and length of the data inside a netbuf.
AdamGreen 0:3b00827bb0b7 185 *
AdamGreen 0:3b00827bb0b7 186 * @param buf netbuf to get the data from
AdamGreen 0:3b00827bb0b7 187 * @param dataptr pointer to a void pointer where to store the data pointer
AdamGreen 0:3b00827bb0b7 188 * @param len pointer to an u16_t where the length of the data is stored
AdamGreen 0:3b00827bb0b7 189 * @return ERR_OK if the information was retreived,
AdamGreen 0:3b00827bb0b7 190 * ERR_BUF on error.
AdamGreen 0:3b00827bb0b7 191 */
AdamGreen 0:3b00827bb0b7 192 err_t
AdamGreen 0:3b00827bb0b7 193 netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)
AdamGreen 0:3b00827bb0b7 194 {
AdamGreen 0:3b00827bb0b7 195 LWIP_ERROR("netbuf_data: invalid buf", (buf != NULL), return ERR_ARG;);
AdamGreen 0:3b00827bb0b7 196 LWIP_ERROR("netbuf_data: invalid dataptr", (dataptr != NULL), return ERR_ARG;);
AdamGreen 0:3b00827bb0b7 197 LWIP_ERROR("netbuf_data: invalid len", (len != NULL), return ERR_ARG;);
AdamGreen 0:3b00827bb0b7 198
AdamGreen 0:3b00827bb0b7 199 if (buf->ptr == NULL) {
AdamGreen 0:3b00827bb0b7 200 return ERR_BUF;
AdamGreen 0:3b00827bb0b7 201 }
AdamGreen 0:3b00827bb0b7 202 *dataptr = buf->ptr->payload;
AdamGreen 0:3b00827bb0b7 203 *len = buf->ptr->len;
AdamGreen 0:3b00827bb0b7 204 return ERR_OK;
AdamGreen 0:3b00827bb0b7 205 }
AdamGreen 0:3b00827bb0b7 206
AdamGreen 0:3b00827bb0b7 207 /**
AdamGreen 0:3b00827bb0b7 208 * Move the current data pointer of a packet buffer contained in a netbuf
AdamGreen 0:3b00827bb0b7 209 * to the next part.
AdamGreen 0:3b00827bb0b7 210 * The packet buffer itself is not modified.
AdamGreen 0:3b00827bb0b7 211 *
AdamGreen 0:3b00827bb0b7 212 * @param buf the netbuf to modify
AdamGreen 0:3b00827bb0b7 213 * @return -1 if there is no next part
AdamGreen 0:3b00827bb0b7 214 * 1 if moved to the next part but now there is no next part
AdamGreen 0:3b00827bb0b7 215 * 0 if moved to the next part and there are still more parts
AdamGreen 0:3b00827bb0b7 216 */
AdamGreen 0:3b00827bb0b7 217 s8_t
AdamGreen 0:3b00827bb0b7 218 netbuf_next(struct netbuf *buf)
AdamGreen 0:3b00827bb0b7 219 {
AdamGreen 0:3b00827bb0b7 220 LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return -1;);
AdamGreen 0:3b00827bb0b7 221 if (buf->ptr->next == NULL) {
AdamGreen 0:3b00827bb0b7 222 return -1;
AdamGreen 0:3b00827bb0b7 223 }
AdamGreen 0:3b00827bb0b7 224 buf->ptr = buf->ptr->next;
AdamGreen 0:3b00827bb0b7 225 if (buf->ptr->next == NULL) {
AdamGreen 0:3b00827bb0b7 226 return 1;
AdamGreen 0:3b00827bb0b7 227 }
AdamGreen 0:3b00827bb0b7 228 return 0;
AdamGreen 0:3b00827bb0b7 229 }
AdamGreen 0:3b00827bb0b7 230
AdamGreen 0:3b00827bb0b7 231 /**
AdamGreen 0:3b00827bb0b7 232 * Move the current data pointer of a packet buffer contained in a netbuf
AdamGreen 0:3b00827bb0b7 233 * to the beginning of the packet.
AdamGreen 0:3b00827bb0b7 234 * The packet buffer itself is not modified.
AdamGreen 0:3b00827bb0b7 235 *
AdamGreen 0:3b00827bb0b7 236 * @param buf the netbuf to modify
AdamGreen 0:3b00827bb0b7 237 */
AdamGreen 0:3b00827bb0b7 238 void
AdamGreen 0:3b00827bb0b7 239 netbuf_first(struct netbuf *buf)
AdamGreen 0:3b00827bb0b7 240 {
AdamGreen 0:3b00827bb0b7 241 LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
AdamGreen 0:3b00827bb0b7 242 buf->ptr = buf->p;
AdamGreen 0:3b00827bb0b7 243 }
AdamGreen 0:3b00827bb0b7 244
AdamGreen 0:3b00827bb0b7 245 #endif /* LWIP_NETCONN */