ProjetoBB

Dependencies:   F7_Ethernet WebSocketClient mbed mcp3008

Fork of Nucleo_F746ZG_Ethernet by Dieter Graef

Committer:
DieterGraef
Date:
Sat Jun 18 10:49:12 2016 +0000
Revision:
0:f9b6112278fe
Ethernet for the NUCLEO STM32F746 Board Testprogram uses DHCP and NTP to set the clock

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DieterGraef 0:f9b6112278fe 1 /**
DieterGraef 0:f9b6112278fe 2 * @file
DieterGraef 0:f9b6112278fe 3 * Implementation of raw protocol PCBs for low-level handling of
DieterGraef 0:f9b6112278fe 4 * different types of protocols besides (or overriding) those
DieterGraef 0:f9b6112278fe 5 * already available in lwIP.
DieterGraef 0:f9b6112278fe 6 *
DieterGraef 0:f9b6112278fe 7 */
DieterGraef 0:f9b6112278fe 8
DieterGraef 0:f9b6112278fe 9 /*
DieterGraef 0:f9b6112278fe 10 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
DieterGraef 0:f9b6112278fe 11 * All rights reserved.
DieterGraef 0:f9b6112278fe 12 *
DieterGraef 0:f9b6112278fe 13 * Redistribution and use in source and binary forms, with or without modification,
DieterGraef 0:f9b6112278fe 14 * are permitted provided that the following conditions are met:
DieterGraef 0:f9b6112278fe 15 *
DieterGraef 0:f9b6112278fe 16 * 1. Redistributions of source code must retain the above copyright notice,
DieterGraef 0:f9b6112278fe 17 * this list of conditions and the following disclaimer.
DieterGraef 0:f9b6112278fe 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
DieterGraef 0:f9b6112278fe 19 * this list of conditions and the following disclaimer in the documentation
DieterGraef 0:f9b6112278fe 20 * and/or other materials provided with the distribution.
DieterGraef 0:f9b6112278fe 21 * 3. The name of the author may not be used to endorse or promote products
DieterGraef 0:f9b6112278fe 22 * derived from this software without specific prior written permission.
DieterGraef 0:f9b6112278fe 23 *
DieterGraef 0:f9b6112278fe 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
DieterGraef 0:f9b6112278fe 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
DieterGraef 0:f9b6112278fe 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
DieterGraef 0:f9b6112278fe 27 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
DieterGraef 0:f9b6112278fe 28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
DieterGraef 0:f9b6112278fe 29 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
DieterGraef 0:f9b6112278fe 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
DieterGraef 0:f9b6112278fe 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
DieterGraef 0:f9b6112278fe 32 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
DieterGraef 0:f9b6112278fe 33 * OF SUCH DAMAGE.
DieterGraef 0:f9b6112278fe 34 *
DieterGraef 0:f9b6112278fe 35 * This file is part of the lwIP TCP/IP stack.
DieterGraef 0:f9b6112278fe 36 *
DieterGraef 0:f9b6112278fe 37 * Author: Adam Dunkels <adam@sics.se>
DieterGraef 0:f9b6112278fe 38 *
DieterGraef 0:f9b6112278fe 39 */
DieterGraef 0:f9b6112278fe 40
DieterGraef 0:f9b6112278fe 41 #include "lwip/opt.h"
DieterGraef 0:f9b6112278fe 42
DieterGraef 0:f9b6112278fe 43 #if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
DieterGraef 0:f9b6112278fe 44
DieterGraef 0:f9b6112278fe 45 #include "lwip/def.h"
DieterGraef 0:f9b6112278fe 46 #include "lwip/memp.h"
DieterGraef 0:f9b6112278fe 47 #include "lwip/ip_addr.h"
DieterGraef 0:f9b6112278fe 48 #include "lwip/netif.h"
DieterGraef 0:f9b6112278fe 49 #include "lwip/raw.h"
DieterGraef 0:f9b6112278fe 50 #include "lwip/stats.h"
DieterGraef 0:f9b6112278fe 51 #include "arch/perf.h"
DieterGraef 0:f9b6112278fe 52
DieterGraef 0:f9b6112278fe 53 #include <string.h>
DieterGraef 0:f9b6112278fe 54
DieterGraef 0:f9b6112278fe 55 /** The list of RAW PCBs */
DieterGraef 0:f9b6112278fe 56 static struct raw_pcb *raw_pcbs;
DieterGraef 0:f9b6112278fe 57
DieterGraef 0:f9b6112278fe 58 /**
DieterGraef 0:f9b6112278fe 59 * Determine if in incoming IP packet is covered by a RAW PCB
DieterGraef 0:f9b6112278fe 60 * and if so, pass it to a user-provided receive callback function.
DieterGraef 0:f9b6112278fe 61 *
DieterGraef 0:f9b6112278fe 62 * Given an incoming IP datagram (as a chain of pbufs) this function
DieterGraef 0:f9b6112278fe 63 * finds a corresponding RAW PCB and calls the corresponding receive
DieterGraef 0:f9b6112278fe 64 * callback function.
DieterGraef 0:f9b6112278fe 65 *
DieterGraef 0:f9b6112278fe 66 * @param p pbuf to be demultiplexed to a RAW PCB.
DieterGraef 0:f9b6112278fe 67 * @param inp network interface on which the datagram was received.
DieterGraef 0:f9b6112278fe 68 * @return - 1 if the packet has been eaten by a RAW PCB receive
DieterGraef 0:f9b6112278fe 69 * callback function. The caller MAY NOT not reference the
DieterGraef 0:f9b6112278fe 70 * packet any longer, and MAY NOT call pbuf_free().
DieterGraef 0:f9b6112278fe 71 * @return - 0 if packet is not eaten (pbuf is still referenced by the
DieterGraef 0:f9b6112278fe 72 * caller).
DieterGraef 0:f9b6112278fe 73 *
DieterGraef 0:f9b6112278fe 74 */
DieterGraef 0:f9b6112278fe 75 u8_t
DieterGraef 0:f9b6112278fe 76 raw_input(struct pbuf *p, struct netif *inp)
DieterGraef 0:f9b6112278fe 77 {
DieterGraef 0:f9b6112278fe 78 struct raw_pcb *pcb, *prev;
DieterGraef 0:f9b6112278fe 79 struct ip_hdr *iphdr;
DieterGraef 0:f9b6112278fe 80 s16_t proto;
DieterGraef 0:f9b6112278fe 81 u8_t eaten = 0;
DieterGraef 0:f9b6112278fe 82
DieterGraef 0:f9b6112278fe 83 LWIP_UNUSED_ARG(inp);
DieterGraef 0:f9b6112278fe 84
DieterGraef 0:f9b6112278fe 85 iphdr = (struct ip_hdr *)p->payload;
DieterGraef 0:f9b6112278fe 86 proto = IPH_PROTO(iphdr);
DieterGraef 0:f9b6112278fe 87
DieterGraef 0:f9b6112278fe 88 prev = NULL;
DieterGraef 0:f9b6112278fe 89 pcb = raw_pcbs;
DieterGraef 0:f9b6112278fe 90 /* loop through all raw pcbs until the packet is eaten by one */
DieterGraef 0:f9b6112278fe 91 /* this allows multiple pcbs to match against the packet by design */
DieterGraef 0:f9b6112278fe 92 while ((eaten == 0) && (pcb != NULL)) {
DieterGraef 0:f9b6112278fe 93 if ((pcb->protocol == proto) &&
DieterGraef 0:f9b6112278fe 94 (ip_addr_isany(&pcb->local_ip) ||
DieterGraef 0:f9b6112278fe 95 ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest))) {
DieterGraef 0:f9b6112278fe 96 #if IP_SOF_BROADCAST_RECV
DieterGraef 0:f9b6112278fe 97 /* broadcast filter? */
DieterGraef 0:f9b6112278fe 98 if (ip_get_option(pcb, SOF_BROADCAST) || !ip_addr_isbroadcast(&current_iphdr_dest, inp))
DieterGraef 0:f9b6112278fe 99 #endif /* IP_SOF_BROADCAST_RECV */
DieterGraef 0:f9b6112278fe 100 {
DieterGraef 0:f9b6112278fe 101 /* receive callback function available? */
DieterGraef 0:f9b6112278fe 102 if (pcb->recv != NULL) {
DieterGraef 0:f9b6112278fe 103 /* the receive callback function did not eat the packet? */
DieterGraef 0:f9b6112278fe 104 if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) {
DieterGraef 0:f9b6112278fe 105 /* receive function ate the packet */
DieterGraef 0:f9b6112278fe 106 p = NULL;
DieterGraef 0:f9b6112278fe 107 eaten = 1;
DieterGraef 0:f9b6112278fe 108 if (prev != NULL) {
DieterGraef 0:f9b6112278fe 109 /* move the pcb to the front of raw_pcbs so that is
DieterGraef 0:f9b6112278fe 110 found faster next time */
DieterGraef 0:f9b6112278fe 111 prev->next = pcb->next;
DieterGraef 0:f9b6112278fe 112 pcb->next = raw_pcbs;
DieterGraef 0:f9b6112278fe 113 raw_pcbs = pcb;
DieterGraef 0:f9b6112278fe 114 }
DieterGraef 0:f9b6112278fe 115 }
DieterGraef 0:f9b6112278fe 116 }
DieterGraef 0:f9b6112278fe 117 /* no receive callback function was set for this raw PCB */
DieterGraef 0:f9b6112278fe 118 }
DieterGraef 0:f9b6112278fe 119 /* drop the packet */
DieterGraef 0:f9b6112278fe 120 }
DieterGraef 0:f9b6112278fe 121 prev = pcb;
DieterGraef 0:f9b6112278fe 122 pcb = pcb->next;
DieterGraef 0:f9b6112278fe 123 }
DieterGraef 0:f9b6112278fe 124 return eaten;
DieterGraef 0:f9b6112278fe 125 }
DieterGraef 0:f9b6112278fe 126
DieterGraef 0:f9b6112278fe 127 /**
DieterGraef 0:f9b6112278fe 128 * Bind a RAW PCB.
DieterGraef 0:f9b6112278fe 129 *
DieterGraef 0:f9b6112278fe 130 * @param pcb RAW PCB to be bound with a local address ipaddr.
DieterGraef 0:f9b6112278fe 131 * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to
DieterGraef 0:f9b6112278fe 132 * bind to all local interfaces.
DieterGraef 0:f9b6112278fe 133 *
DieterGraef 0:f9b6112278fe 134 * @return lwIP error code.
DieterGraef 0:f9b6112278fe 135 * - ERR_OK. Successful. No error occured.
DieterGraef 0:f9b6112278fe 136 * - ERR_USE. The specified IP address is already bound to by
DieterGraef 0:f9b6112278fe 137 * another RAW PCB.
DieterGraef 0:f9b6112278fe 138 *
DieterGraef 0:f9b6112278fe 139 * @see raw_disconnect()
DieterGraef 0:f9b6112278fe 140 */
DieterGraef 0:f9b6112278fe 141 err_t
DieterGraef 0:f9b6112278fe 142 raw_bind(struct raw_pcb *pcb, ip_addr_t *ipaddr)
DieterGraef 0:f9b6112278fe 143 {
DieterGraef 0:f9b6112278fe 144 ip_addr_set(&pcb->local_ip, ipaddr);
DieterGraef 0:f9b6112278fe 145 return ERR_OK;
DieterGraef 0:f9b6112278fe 146 }
DieterGraef 0:f9b6112278fe 147
DieterGraef 0:f9b6112278fe 148 /**
DieterGraef 0:f9b6112278fe 149 * Connect an RAW PCB. This function is required by upper layers
DieterGraef 0:f9b6112278fe 150 * of lwip. Using the raw api you could use raw_sendto() instead
DieterGraef 0:f9b6112278fe 151 *
DieterGraef 0:f9b6112278fe 152 * This will associate the RAW PCB with the remote address.
DieterGraef 0:f9b6112278fe 153 *
DieterGraef 0:f9b6112278fe 154 * @param pcb RAW PCB to be connected with remote address ipaddr and port.
DieterGraef 0:f9b6112278fe 155 * @param ipaddr remote IP address to connect with.
DieterGraef 0:f9b6112278fe 156 *
DieterGraef 0:f9b6112278fe 157 * @return lwIP error code
DieterGraef 0:f9b6112278fe 158 *
DieterGraef 0:f9b6112278fe 159 * @see raw_disconnect() and raw_sendto()
DieterGraef 0:f9b6112278fe 160 */
DieterGraef 0:f9b6112278fe 161 err_t
DieterGraef 0:f9b6112278fe 162 raw_connect(struct raw_pcb *pcb, ip_addr_t *ipaddr)
DieterGraef 0:f9b6112278fe 163 {
DieterGraef 0:f9b6112278fe 164 ip_addr_set(&pcb->remote_ip, ipaddr);
DieterGraef 0:f9b6112278fe 165 return ERR_OK;
DieterGraef 0:f9b6112278fe 166 }
DieterGraef 0:f9b6112278fe 167
DieterGraef 0:f9b6112278fe 168
DieterGraef 0:f9b6112278fe 169 /**
DieterGraef 0:f9b6112278fe 170 * Set the callback function for received packets that match the
DieterGraef 0:f9b6112278fe 171 * raw PCB's protocol and binding.
DieterGraef 0:f9b6112278fe 172 *
DieterGraef 0:f9b6112278fe 173 * The callback function MUST either
DieterGraef 0:f9b6112278fe 174 * - eat the packet by calling pbuf_free() and returning non-zero. The
DieterGraef 0:f9b6112278fe 175 * packet will not be passed to other raw PCBs or other protocol layers.
DieterGraef 0:f9b6112278fe 176 * - not free the packet, and return zero. The packet will be matched
DieterGraef 0:f9b6112278fe 177 * against further PCBs and/or forwarded to another protocol layers.
DieterGraef 0:f9b6112278fe 178 *
DieterGraef 0:f9b6112278fe 179 * @return non-zero if the packet was free()d, zero if the packet remains
DieterGraef 0:f9b6112278fe 180 * available for others.
DieterGraef 0:f9b6112278fe 181 */
DieterGraef 0:f9b6112278fe 182 void
DieterGraef 0:f9b6112278fe 183 raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg)
DieterGraef 0:f9b6112278fe 184 {
DieterGraef 0:f9b6112278fe 185 /* remember recv() callback and user data */
DieterGraef 0:f9b6112278fe 186 pcb->recv = recv;
DieterGraef 0:f9b6112278fe 187 pcb->recv_arg = recv_arg;
DieterGraef 0:f9b6112278fe 188 }
DieterGraef 0:f9b6112278fe 189
DieterGraef 0:f9b6112278fe 190 /**
DieterGraef 0:f9b6112278fe 191 * Send the raw IP packet to the given address. Note that actually you cannot
DieterGraef 0:f9b6112278fe 192 * modify the IP headers (this is inconsistent with the receive callback where
DieterGraef 0:f9b6112278fe 193 * you actually get the IP headers), you can only specify the IP payload here.
DieterGraef 0:f9b6112278fe 194 * It requires some more changes in lwIP. (there will be a raw_send() function
DieterGraef 0:f9b6112278fe 195 * then.)
DieterGraef 0:f9b6112278fe 196 *
DieterGraef 0:f9b6112278fe 197 * @param pcb the raw pcb which to send
DieterGraef 0:f9b6112278fe 198 * @param p the IP payload to send
DieterGraef 0:f9b6112278fe 199 * @param ipaddr the destination address of the IP packet
DieterGraef 0:f9b6112278fe 200 *
DieterGraef 0:f9b6112278fe 201 */
DieterGraef 0:f9b6112278fe 202 err_t
DieterGraef 0:f9b6112278fe 203 raw_sendto(struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr)
DieterGraef 0:f9b6112278fe 204 {
DieterGraef 0:f9b6112278fe 205 err_t err;
DieterGraef 0:f9b6112278fe 206 struct netif *netif;
DieterGraef 0:f9b6112278fe 207 ip_addr_t *src_ip;
DieterGraef 0:f9b6112278fe 208 struct pbuf *q; /* q will be sent down the stack */
DieterGraef 0:f9b6112278fe 209
DieterGraef 0:f9b6112278fe 210 LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n"));
DieterGraef 0:f9b6112278fe 211
DieterGraef 0:f9b6112278fe 212 /* not enough space to add an IP header to first pbuf in given p chain? */
DieterGraef 0:f9b6112278fe 213 if (pbuf_header(p, IP_HLEN)) {
DieterGraef 0:f9b6112278fe 214 /* allocate header in new pbuf */
DieterGraef 0:f9b6112278fe 215 q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM);
DieterGraef 0:f9b6112278fe 216 /* new header pbuf could not be allocated? */
DieterGraef 0:f9b6112278fe 217 if (q == NULL) {
DieterGraef 0:f9b6112278fe 218 LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("raw_sendto: could not allocate header\n"));
DieterGraef 0:f9b6112278fe 219 return ERR_MEM;
DieterGraef 0:f9b6112278fe 220 }
DieterGraef 0:f9b6112278fe 221 if (p->tot_len != 0) {
DieterGraef 0:f9b6112278fe 222 /* chain header q in front of given pbuf p */
DieterGraef 0:f9b6112278fe 223 pbuf_chain(q, p);
DieterGraef 0:f9b6112278fe 224 }
DieterGraef 0:f9b6112278fe 225 /* { first pbuf q points to header pbuf } */
DieterGraef 0:f9b6112278fe 226 LWIP_DEBUGF(RAW_DEBUG, ("raw_sendto: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
DieterGraef 0:f9b6112278fe 227 } else {
DieterGraef 0:f9b6112278fe 228 /* first pbuf q equals given pbuf */
DieterGraef 0:f9b6112278fe 229 q = p;
DieterGraef 0:f9b6112278fe 230 if(pbuf_header(q, -IP_HLEN)) {
DieterGraef 0:f9b6112278fe 231 LWIP_ASSERT("Can't restore header we just removed!", 0);
DieterGraef 0:f9b6112278fe 232 return ERR_MEM;
DieterGraef 0:f9b6112278fe 233 }
DieterGraef 0:f9b6112278fe 234 }
DieterGraef 0:f9b6112278fe 235
DieterGraef 0:f9b6112278fe 236 if ((netif = ip_route(ipaddr)) == NULL) {
DieterGraef 0:f9b6112278fe 237 LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
DieterGraef 0:f9b6112278fe 238 ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
DieterGraef 0:f9b6112278fe 239 /* free any temporary header pbuf allocated by pbuf_header() */
DieterGraef 0:f9b6112278fe 240 if (q != p) {
DieterGraef 0:f9b6112278fe 241 pbuf_free(q);
DieterGraef 0:f9b6112278fe 242 }
DieterGraef 0:f9b6112278fe 243 return ERR_RTE;
DieterGraef 0:f9b6112278fe 244 }
DieterGraef 0:f9b6112278fe 245
DieterGraef 0:f9b6112278fe 246 #if IP_SOF_BROADCAST
DieterGraef 0:f9b6112278fe 247 /* broadcast filter? */
DieterGraef 0:f9b6112278fe 248 if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, netif)) {
DieterGraef 0:f9b6112278fe 249 LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb));
DieterGraef 0:f9b6112278fe 250 /* free any temporary header pbuf allocated by pbuf_header() */
DieterGraef 0:f9b6112278fe 251 if (q != p) {
DieterGraef 0:f9b6112278fe 252 pbuf_free(q);
DieterGraef 0:f9b6112278fe 253 }
DieterGraef 0:f9b6112278fe 254 return ERR_VAL;
DieterGraef 0:f9b6112278fe 255 }
DieterGraef 0:f9b6112278fe 256 #endif /* IP_SOF_BROADCAST */
DieterGraef 0:f9b6112278fe 257
DieterGraef 0:f9b6112278fe 258 if (ip_addr_isany(&pcb->local_ip)) {
DieterGraef 0:f9b6112278fe 259 /* use outgoing network interface IP address as source address */
DieterGraef 0:f9b6112278fe 260 src_ip = &(netif->ip_addr);
DieterGraef 0:f9b6112278fe 261 } else {
DieterGraef 0:f9b6112278fe 262 /* use RAW PCB local IP address as source address */
DieterGraef 0:f9b6112278fe 263 src_ip = &(pcb->local_ip);
DieterGraef 0:f9b6112278fe 264 }
DieterGraef 0:f9b6112278fe 265
DieterGraef 0:f9b6112278fe 266 NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint);
DieterGraef 0:f9b6112278fe 267 err = ip_output_if (q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif);
DieterGraef 0:f9b6112278fe 268 NETIF_SET_HWADDRHINT(netif, NULL);
DieterGraef 0:f9b6112278fe 269
DieterGraef 0:f9b6112278fe 270 /* did we chain a header earlier? */
DieterGraef 0:f9b6112278fe 271 if (q != p) {
DieterGraef 0:f9b6112278fe 272 /* free the header */
DieterGraef 0:f9b6112278fe 273 pbuf_free(q);
DieterGraef 0:f9b6112278fe 274 }
DieterGraef 0:f9b6112278fe 275 return err;
DieterGraef 0:f9b6112278fe 276 }
DieterGraef 0:f9b6112278fe 277
DieterGraef 0:f9b6112278fe 278 /**
DieterGraef 0:f9b6112278fe 279 * Send the raw IP packet to the address given by raw_connect()
DieterGraef 0:f9b6112278fe 280 *
DieterGraef 0:f9b6112278fe 281 * @param pcb the raw pcb which to send
DieterGraef 0:f9b6112278fe 282 * @param p the IP payload to send
DieterGraef 0:f9b6112278fe 283 *
DieterGraef 0:f9b6112278fe 284 */
DieterGraef 0:f9b6112278fe 285 err_t
DieterGraef 0:f9b6112278fe 286 raw_send(struct raw_pcb *pcb, struct pbuf *p)
DieterGraef 0:f9b6112278fe 287 {
DieterGraef 0:f9b6112278fe 288 return raw_sendto(pcb, p, &pcb->remote_ip);
DieterGraef 0:f9b6112278fe 289 }
DieterGraef 0:f9b6112278fe 290
DieterGraef 0:f9b6112278fe 291 /**
DieterGraef 0:f9b6112278fe 292 * Remove an RAW PCB.
DieterGraef 0:f9b6112278fe 293 *
DieterGraef 0:f9b6112278fe 294 * @param pcb RAW PCB to be removed. The PCB is removed from the list of
DieterGraef 0:f9b6112278fe 295 * RAW PCB's and the data structure is freed from memory.
DieterGraef 0:f9b6112278fe 296 *
DieterGraef 0:f9b6112278fe 297 * @see raw_new()
DieterGraef 0:f9b6112278fe 298 */
DieterGraef 0:f9b6112278fe 299 void
DieterGraef 0:f9b6112278fe 300 raw_remove(struct raw_pcb *pcb)
DieterGraef 0:f9b6112278fe 301 {
DieterGraef 0:f9b6112278fe 302 struct raw_pcb *pcb2;
DieterGraef 0:f9b6112278fe 303 /* pcb to be removed is first in list? */
DieterGraef 0:f9b6112278fe 304 if (raw_pcbs == pcb) {
DieterGraef 0:f9b6112278fe 305 /* make list start at 2nd pcb */
DieterGraef 0:f9b6112278fe 306 raw_pcbs = raw_pcbs->next;
DieterGraef 0:f9b6112278fe 307 /* pcb not 1st in list */
DieterGraef 0:f9b6112278fe 308 } else {
DieterGraef 0:f9b6112278fe 309 for(pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
DieterGraef 0:f9b6112278fe 310 /* find pcb in raw_pcbs list */
DieterGraef 0:f9b6112278fe 311 if (pcb2->next != NULL && pcb2->next == pcb) {
DieterGraef 0:f9b6112278fe 312 /* remove pcb from list */
DieterGraef 0:f9b6112278fe 313 pcb2->next = pcb->next;
DieterGraef 0:f9b6112278fe 314 }
DieterGraef 0:f9b6112278fe 315 }
DieterGraef 0:f9b6112278fe 316 }
DieterGraef 0:f9b6112278fe 317 memp_free(MEMP_RAW_PCB, pcb);
DieterGraef 0:f9b6112278fe 318 }
DieterGraef 0:f9b6112278fe 319
DieterGraef 0:f9b6112278fe 320 /**
DieterGraef 0:f9b6112278fe 321 * Create a RAW PCB.
DieterGraef 0:f9b6112278fe 322 *
DieterGraef 0:f9b6112278fe 323 * @return The RAW PCB which was created. NULL if the PCB data structure
DieterGraef 0:f9b6112278fe 324 * could not be allocated.
DieterGraef 0:f9b6112278fe 325 *
DieterGraef 0:f9b6112278fe 326 * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP)
DieterGraef 0:f9b6112278fe 327 *
DieterGraef 0:f9b6112278fe 328 * @see raw_remove()
DieterGraef 0:f9b6112278fe 329 */
DieterGraef 0:f9b6112278fe 330 struct raw_pcb *
DieterGraef 0:f9b6112278fe 331 raw_new(u8_t proto)
DieterGraef 0:f9b6112278fe 332 {
DieterGraef 0:f9b6112278fe 333 struct raw_pcb *pcb;
DieterGraef 0:f9b6112278fe 334
DieterGraef 0:f9b6112278fe 335 LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n"));
DieterGraef 0:f9b6112278fe 336
DieterGraef 0:f9b6112278fe 337 pcb = (struct raw_pcb *)memp_malloc(MEMP_RAW_PCB);
DieterGraef 0:f9b6112278fe 338 /* could allocate RAW PCB? */
DieterGraef 0:f9b6112278fe 339 if (pcb != NULL) {
DieterGraef 0:f9b6112278fe 340 /* initialize PCB to all zeroes */
DieterGraef 0:f9b6112278fe 341 memset(pcb, 0, sizeof(struct raw_pcb));
DieterGraef 0:f9b6112278fe 342 pcb->protocol = proto;
DieterGraef 0:f9b6112278fe 343 pcb->ttl = RAW_TTL;
DieterGraef 0:f9b6112278fe 344 pcb->next = raw_pcbs;
DieterGraef 0:f9b6112278fe 345 raw_pcbs = pcb;
DieterGraef 0:f9b6112278fe 346 }
DieterGraef 0:f9b6112278fe 347 return pcb;
DieterGraef 0:f9b6112278fe 348 }
DieterGraef 0:f9b6112278fe 349
DieterGraef 0:f9b6112278fe 350 #endif /* LWIP_RAW */