mbed OS5

Fork of UIPEthernet by Zoltan Hudak

Committer:
hudakz
Date:
Sun Mar 08 20:26:56 2015 +0000
Revision:
4:d774541a34da
Parent:
2:049ce85163c5
Child:
5:59a504be7998
Version 1.09 (fixed leaking client-data caused by race-condition on remote close)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 4:d774541a34da 1 /*
hudakz 4:d774541a34da 2 UIPUdp.cpp - Arduino implementation of a uIP wrapper class.
hudakz 4:d774541a34da 3 Copyright (c) 2013 Norbert Truchsess <norbert.truchsess@t-online.de>
hudakz 4:d774541a34da 4 All rights reserved.
hudakz 4:d774541a34da 5
hudakz 4:d774541a34da 6 This program is free software: you can redistribute it and/or modify
hudakz 4:d774541a34da 7 it under the terms of the GNU General Public License as published by
hudakz 4:d774541a34da 8 the Free Software Foundation, either version 3 of the License, or
hudakz 4:d774541a34da 9 (at your option) any later version.
hudakz 4:d774541a34da 10
hudakz 4:d774541a34da 11 This program is distributed in the hope that it will be useful,
hudakz 4:d774541a34da 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
hudakz 4:d774541a34da 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 4:d774541a34da 14 GNU General Public License for more details.
hudakz 4:d774541a34da 15
hudakz 4:d774541a34da 16 You should have received a copy of the GNU General Public License
hudakz 4:d774541a34da 17 along with this program. If not, see <http://www.gnu.org/licenses/>.
hudakz 4:d774541a34da 18 */
hudakz 4:d774541a34da 19 #include "UIPEthernet.h"
hudakz 4:d774541a34da 20 #include "UIPUdp.h"
hudakz 4:d774541a34da 21 #include "Dns.h"
hudakz 4:d774541a34da 22
hudakz 4:d774541a34da 23 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 24 #include "HardwareSerial.h"
hudakz 4:d774541a34da 25 #endif
hudakz 4:d774541a34da 26 extern "C"
hudakz 4:d774541a34da 27 {
hudakz 4:d774541a34da 28 #include "utility/uip-conf.h"
hudakz 4:d774541a34da 29 #include "utility/uip.h"
hudakz 4:d774541a34da 30 #include "utility/uip_arp.h"
hudakz 4:d774541a34da 31 }
hudakz 4:d774541a34da 32 #if UIP_UDP
hudakz 4:d774541a34da 33 #define UIP_ARPHDRSIZE 42
hudakz 4:d774541a34da 34 #define UDPBUF ((struct uip_udpip_hdr*) &uip_buf[UIP_LLH_LEN])
hudakz 4:d774541a34da 35
hudakz 4:d774541a34da 36 // Constructor
hudakz 4:d774541a34da 37 UIPUDP::UIPUDP(void) :
hudakz 4:d774541a34da 38 _uip_udp_conn(NULL) {
hudakz 4:d774541a34da 39 memset(&appdata, 0, sizeof(appdata));
hudakz 4:d774541a34da 40 }
hudakz 4:d774541a34da 41
hudakz 4:d774541a34da 42 // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
hudakz 4:d774541a34da 43 uint8_t UIPUDP::begin(uint16_t port) {
hudakz 4:d774541a34da 44 if(!_uip_udp_conn) {
hudakz 4:d774541a34da 45 _uip_udp_conn = uip_udp_new(NULL, 0);
hudakz 4:d774541a34da 46 }
hudakz 4:d774541a34da 47
hudakz 4:d774541a34da 48 if(_uip_udp_conn) {
hudakz 4:d774541a34da 49 uip_udp_bind(_uip_udp_conn, htons(port));
hudakz 4:d774541a34da 50 _uip_udp_conn->appstate = &appdata;
hudakz 4:d774541a34da 51 return 1;
hudakz 4:d774541a34da 52 }
hudakz 4:d774541a34da 53
hudakz 4:d774541a34da 54 return 0;
hudakz 4:d774541a34da 55 }
hudakz 4:d774541a34da 56
hudakz 4:d774541a34da 57 // Finish with the UDP socket
hudakz 4:d774541a34da 58 void UIPUDP::stop(void) {
hudakz 4:d774541a34da 59 if(_uip_udp_conn) {
hudakz 4:d774541a34da 60 uip_udp_remove(_uip_udp_conn);
hudakz 4:d774541a34da 61 _uip_udp_conn->appstate = NULL;
hudakz 4:d774541a34da 62 _uip_udp_conn = NULL;
hudakz 4:d774541a34da 63 UIPEthernet.network.freeBlock(appdata.packet_in);
hudakz 4:d774541a34da 64 UIPEthernet.network.freeBlock(appdata.packet_next);
hudakz 4:d774541a34da 65 UIPEthernet.network.freeBlock(appdata.packet_out);
hudakz 4:d774541a34da 66 memset(&appdata, 0, sizeof(appdata));
hudakz 4:d774541a34da 67 }
hudakz 4:d774541a34da 68 }
hudakz 4:d774541a34da 69
hudakz 4:d774541a34da 70 // Sending UDP packets
hudakz 4:d774541a34da 71 // Start building up a packet to send to the remote host specific in ip and port
hudakz 4:d774541a34da 72
hudakz 4:d774541a34da 73 // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
hudakz 4:d774541a34da 74 int UIPUDP::beginPacket(IPAddress ip, uint16_t port) {
hudakz 4:d774541a34da 75 UIPEthernet.tick();
hudakz 4:d774541a34da 76 if(ip && port) {
hudakz 4:d774541a34da 77 uip_ipaddr_t ripaddr;
hudakz 4:d774541a34da 78 uip_ip_addr(&ripaddr, ip);
hudakz 4:d774541a34da 79 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 80 Serial.print(F("udp beginPacket, "));
hudakz 4:d774541a34da 81 #endif
hudakz 4:d774541a34da 82 if(_uip_udp_conn) {
hudakz 4:d774541a34da 83 _uip_udp_conn->rport = htons(port);
hudakz 4:d774541a34da 84 uip_ipaddr_copy(_uip_udp_conn->ripaddr, &ripaddr);
hudakz 4:d774541a34da 85 }
hudakz 4:d774541a34da 86 else {
hudakz 4:d774541a34da 87 _uip_udp_conn = uip_udp_new(&ripaddr, htons(port));
hudakz 4:d774541a34da 88 if(_uip_udp_conn)
hudakz 4:d774541a34da 89 {
hudakz 4:d774541a34da 90 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 91 Serial.print(F("new connection, "));
hudakz 4:d774541a34da 92 #endif
hudakz 4:d774541a34da 93 _uip_udp_conn->appstate = &appdata;
hudakz 4:d774541a34da 94 }
hudakz 4:d774541a34da 95 else
hudakz 4:d774541a34da 96 {
hudakz 4:d774541a34da 97 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 98 Serial.println(F("failed to allocate new connection"));
hudakz 4:d774541a34da 99 #endif
hudakz 4:d774541a34da 100 return 0;
hudakz 4:d774541a34da 101 }
hudakz 4:d774541a34da 102 }
hudakz 4:d774541a34da 103
hudakz 4:d774541a34da 104 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 105 Serial.print(F("rip: "));
hudakz 4:d774541a34da 106 Serial.print(ip);
hudakz 4:d774541a34da 107 Serial.print(F(", port: "));
hudakz 4:d774541a34da 108 Serial.println(port);
hudakz 4:d774541a34da 109 #endif
hudakz 4:d774541a34da 110 }
hudakz 4:d774541a34da 111
hudakz 4:d774541a34da 112 if(_uip_udp_conn) {
hudakz 4:d774541a34da 113 if(appdata.packet_out == NOBLOCK) {
hudakz 4:d774541a34da 114 appdata.packet_out = UIPEthernet.network.allocBlock(UIP_UDP_MAXPACKETSIZE);
hudakz 4:d774541a34da 115 appdata.out_pos = UIP_UDP_PHYH_LEN;
hudakz 4:d774541a34da 116 if(appdata.packet_out != NOBLOCK)
hudakz 4:d774541a34da 117 return 1;
hudakz 4:d774541a34da 118 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 119 else
hudakz 4:d774541a34da 120 Serial.println(F("failed to allocate memory for packet"));
hudakz 4:d774541a34da 121 #endif
hudakz 4:d774541a34da 122 }
hudakz 4:d774541a34da 123
hudakz 4:d774541a34da 124 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 125 else
hudakz 4:d774541a34da 126 Serial.println(F("previous packet on that connection not sent yet"));
hudakz 4:d774541a34da 127 #endif
hudakz 4:d774541a34da 128 }
hudakz 4:d774541a34da 129
hudakz 4:d774541a34da 130 return 0;
hudakz 4:d774541a34da 131 }
hudakz 4:d774541a34da 132
hudakz 4:d774541a34da 133 // Start building up a packet to send to the remote host specific in host and port
hudakz 4:d774541a34da 134
hudakz 4:d774541a34da 135 // Returns 1 if successful, 0 if there was a problem resolving the hostname or port
hudakz 4:d774541a34da 136 int UIPUDP::beginPacket(const char* host, uint16_t port) {
hudakz 4:d774541a34da 137
hudakz 4:d774541a34da 138 // Look up the host first
hudakz 4:d774541a34da 139 int ret = 0;
hudakz 4:d774541a34da 140 DNSClient dns;
hudakz 4:d774541a34da 141 IPAddress remote_addr;
hudakz 4:d774541a34da 142
hudakz 4:d774541a34da 143 dns.begin(UIPEthernet.dnsServerIP());
hudakz 4:d774541a34da 144 ret = dns.getHostByName(host, remote_addr);
hudakz 4:d774541a34da 145 if(ret == 1) {
hudakz 4:d774541a34da 146 return beginPacket(remote_addr, port);
hudakz 4:d774541a34da 147 }
hudakz 4:d774541a34da 148 else {
hudakz 4:d774541a34da 149 return ret;
hudakz 4:d774541a34da 150 }
hudakz 4:d774541a34da 151 }
hudakz 4:d774541a34da 152
hudakz 4:d774541a34da 153 // Finish off this packet and send it
hudakz 4:d774541a34da 154
hudakz 4:d774541a34da 155 // Returns 1 if the packet was sent successfully, 0 if there was an error
hudakz 4:d774541a34da 156 int UIPUDP::endPacket(void) {
hudakz 4:d774541a34da 157 if(_uip_udp_conn && appdata.packet_out != NOBLOCK) {
hudakz 4:d774541a34da 158 appdata.send = true;
hudakz 4:d774541a34da 159 UIPEthernet.network.resizeBlock(appdata.packet_out, 0, appdata.out_pos);
hudakz 4:d774541a34da 160 uip_udp_periodic_conn(_uip_udp_conn);
hudakz 4:d774541a34da 161 if(uip_len > 0) {
hudakz 4:d774541a34da 162 _send(&appdata);
hudakz 4:d774541a34da 163 return 1;
hudakz 4:d774541a34da 164 }
hudakz 4:d774541a34da 165 }
hudakz 4:d774541a34da 166
hudakz 4:d774541a34da 167 return 0;
hudakz 4:d774541a34da 168 }
hudakz 4:d774541a34da 169
hudakz 4:d774541a34da 170 // Write a single byte into the packet
hudakz 4:d774541a34da 171 size_t UIPUDP::write(uint8_t c) {
hudakz 4:d774541a34da 172 return write(&c, 1);
hudakz 4:d774541a34da 173 }
hudakz 4:d774541a34da 174
hudakz 4:d774541a34da 175 // Write size bytes from buffer into the packet
hudakz 4:d774541a34da 176 size_t UIPUDP::write(const uint8_t* buffer, size_t size) {
hudakz 4:d774541a34da 177 if(appdata.packet_out != NOBLOCK) {
hudakz 4:d774541a34da 178 size_t ret = UIPEthernet.network.writePacket(appdata.packet_out, appdata.out_pos, (uint8_t*)buffer, size);
hudakz 4:d774541a34da 179 appdata.out_pos += ret;
hudakz 4:d774541a34da 180 return ret;
hudakz 4:d774541a34da 181 }
hudakz 4:d774541a34da 182
hudakz 4:d774541a34da 183 return 0;
hudakz 4:d774541a34da 184 }
hudakz 4:d774541a34da 185
hudakz 4:d774541a34da 186 // Start processing the next available incoming packet
hudakz 4:d774541a34da 187
hudakz 4:d774541a34da 188 // Returns the size of the packet in bytes, or 0 if no packets are available
hudakz 4:d774541a34da 189 int UIPUDP::parsePacket(void) {
hudakz 4:d774541a34da 190 UIPEthernet.tick();
hudakz 4:d774541a34da 191 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 192 if(appdata.packet_in != NOBLOCK) {
hudakz 4:d774541a34da 193 Serial.print(F("udp parsePacket freeing previous packet: "));
hudakz 4:d774541a34da 194 Serial.println(appdata.packet_in);
hudakz 4:d774541a34da 195 }
hudakz 4:d774541a34da 196 #endif
hudakz 4:d774541a34da 197 UIPEthernet.network.freeBlock(appdata.packet_in);
hudakz 4:d774541a34da 198
hudakz 4:d774541a34da 199 appdata.packet_in = appdata.packet_next;
hudakz 4:d774541a34da 200 appdata.packet_next = NOBLOCK;
hudakz 4:d774541a34da 201
hudakz 4:d774541a34da 202 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 203 if(appdata.packet_in != NOBLOCK) {
hudakz 4:d774541a34da 204 Serial.print(F("udp parsePacket received packet: "));
hudakz 4:d774541a34da 205 Serial.print(appdata.packet_in);
hudakz 4:d774541a34da 206 }
hudakz 4:d774541a34da 207 #endif
hudakz 4:d774541a34da 208
hudakz 4:d774541a34da 209 int size = UIPEthernet.network.blockSize(appdata.packet_in);
hudakz 4:d774541a34da 210 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 211 if(appdata.packet_in != NOBLOCK) {
hudakz 4:d774541a34da 212 Serial.print(F(", size: "));
hudakz 4:d774541a34da 213 Serial.println(size);
hudakz 4:d774541a34da 214 }
hudakz 4:d774541a34da 215 #endif
hudakz 4:d774541a34da 216 return size;
hudakz 4:d774541a34da 217 }
hudakz 4:d774541a34da 218
hudakz 4:d774541a34da 219 // Number of bytes remaining in the current packet
hudakz 4:d774541a34da 220 int UIPUDP::available(void) {
hudakz 4:d774541a34da 221 UIPEthernet.tick();
hudakz 4:d774541a34da 222 return UIPEthernet.network.blockSize(appdata.packet_in);
hudakz 4:d774541a34da 223 }
hudakz 4:d774541a34da 224
hudakz 4:d774541a34da 225 // Read a single byte from the current packet
hudakz 4:d774541a34da 226 int UIPUDP::read(void) {
hudakz 4:d774541a34da 227 unsigned char c;
hudakz 4:d774541a34da 228 if(read(&c, 1) > 0) {
hudakz 4:d774541a34da 229 return c;
hudakz 4:d774541a34da 230 }
hudakz 4:d774541a34da 231
hudakz 4:d774541a34da 232 return -1;
hudakz 4:d774541a34da 233 }
hudakz 4:d774541a34da 234
hudakz 4:d774541a34da 235 // Read up to len bytes from the current packet and place them into buffer
hudakz 4:d774541a34da 236
hudakz 4:d774541a34da 237 // Returns the number of bytes read, or 0 if none are available
hudakz 4:d774541a34da 238 int UIPUDP::read(unsigned char* buffer, size_t len) {
hudakz 4:d774541a34da 239 UIPEthernet.tick();
hudakz 4:d774541a34da 240 if(appdata.packet_in != NOBLOCK) {
hudakz 4:d774541a34da 241 memaddress read = UIPEthernet.network.readPacket(appdata.packet_in, 0, buffer, len);
hudakz 4:d774541a34da 242 if(read == UIPEthernet.network.blockSize(appdata.packet_in)) {
hudakz 4:d774541a34da 243 UIPEthernet.network.freeBlock(appdata.packet_in);
hudakz 4:d774541a34da 244 appdata.packet_in = NOBLOCK;
hudakz 4:d774541a34da 245 }
hudakz 4:d774541a34da 246 else
hudakz 4:d774541a34da 247 UIPEthernet.network.resizeBlock(appdata.packet_in, read);
hudakz 4:d774541a34da 248 return read;
hudakz 4:d774541a34da 249 }
hudakz 4:d774541a34da 250
hudakz 4:d774541a34da 251 return 0;
hudakz 4:d774541a34da 252 }
hudakz 4:d774541a34da 253
hudakz 4:d774541a34da 254 // Return the next byte from the current packet without moving on to the next byte
hudakz 4:d774541a34da 255 int UIPUDP::peek(void) {
hudakz 4:d774541a34da 256 UIPEthernet.tick();
hudakz 4:d774541a34da 257 if(appdata.packet_in != NOBLOCK) {
hudakz 4:d774541a34da 258 unsigned char c;
hudakz 4:d774541a34da 259 if(UIPEthernet.network.readPacket(appdata.packet_in, 0, &c, 1) == 1)
hudakz 4:d774541a34da 260 return c;
hudakz 4:d774541a34da 261 }
hudakz 4:d774541a34da 262
hudakz 4:d774541a34da 263 return -1;
hudakz 4:d774541a34da 264 }
hudakz 4:d774541a34da 265
hudakz 4:d774541a34da 266 // Finish reading the current packet
hudakz 4:d774541a34da 267 void UIPUDP::flush(void) {
hudakz 4:d774541a34da 268 UIPEthernet.tick();
hudakz 4:d774541a34da 269 UIPEthernet.network.freeBlock(appdata.packet_in);
hudakz 4:d774541a34da 270 appdata.packet_in = NOBLOCK;
hudakz 4:d774541a34da 271 }
hudakz 4:d774541a34da 272
hudakz 4:d774541a34da 273 // Return the IP address of the host who sent the current incoming packet
hudakz 4:d774541a34da 274 IPAddress UIPUDP::remoteIP(void) {
hudakz 4:d774541a34da 275 return _uip_udp_conn ? ip_addr_uip(_uip_udp_conn->ripaddr) : IPAddress();
hudakz 4:d774541a34da 276 }
hudakz 4:d774541a34da 277
hudakz 4:d774541a34da 278 // Return the port of the host who sent the current incoming packet
hudakz 4:d774541a34da 279 uint16_t UIPUDP::remotePort(void) {
hudakz 4:d774541a34da 280 return _uip_udp_conn ? ntohs(_uip_udp_conn->rport) : 0;
hudakz 4:d774541a34da 281 }
hudakz 4:d774541a34da 282
hudakz 4:d774541a34da 283 // uIP callback function
hudakz 4:d774541a34da 284 void uipudp_appcall(void) {
hudakz 4:d774541a34da 285 if(uip_udp_userdata_t * data = (uip_udp_userdata_t *) (uip_udp_conn->appstate)) {
hudakz 4:d774541a34da 286 if(uip_newdata()) {
hudakz 4:d774541a34da 287 if(data->packet_next == NOBLOCK) {
hudakz 4:d774541a34da 288 uip_udp_conn->rport = UDPBUF->srcport;
hudakz 4:d774541a34da 289 uip_ipaddr_copy(uip_udp_conn->ripaddr, UDPBUF->srcipaddr);
hudakz 4:d774541a34da 290 data->packet_next = UIPEthernet.network.allocBlock(ntohs(UDPBUF->udplen) - UIP_UDPH_LEN);
hudakz 4:d774541a34da 291
hudakz 4:d774541a34da 292 //if we are unable to allocate memory the packet is dropped. udp doesn't guarantee packet delivery
hudakz 4:d774541a34da 293 if(data->packet_next != NOBLOCK) {
hudakz 4:d774541a34da 294
hudakz 4:d774541a34da 295 //discard Linklevel and IP and udp-header and any trailing bytes:
hudakz 4:d774541a34da 296 UIPEthernet.network.copyPacket
hudakz 4:d774541a34da 297 (
hudakz 4:d774541a34da 298 data->packet_next,
hudakz 4:d774541a34da 299 0,
hudakz 4:d774541a34da 300 UIPEthernetClass::in_packet,
hudakz 4:d774541a34da 301 UIP_UDP_PHYH_LEN,
hudakz 4:d774541a34da 302 UIPEthernet.network.blockSize(data->packet_next)
hudakz 4:d774541a34da 303 );
hudakz 4:d774541a34da 304 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 305 Serial.print(F("udp, uip_newdata received packet: "));
hudakz 4:d774541a34da 306 Serial.print(data->packet_next);
hudakz 4:d774541a34da 307 Serial.print(F(", size: "));
hudakz 4:d774541a34da 308 Serial.println(UIPEthernet.network.blockSize(data->packet_next));
hudakz 4:d774541a34da 309 #endif
hudakz 4:d774541a34da 310 }
hudakz 4:d774541a34da 311 }
hudakz 4:d774541a34da 312 }
hudakz 4:d774541a34da 313
hudakz 4:d774541a34da 314 if(uip_poll() && data->send)
hudakz 4:d774541a34da 315 {
hudakz 4:d774541a34da 316 //set uip_slen (uip private) by calling uip_udp_send
hudakz 4:d774541a34da 317 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 318 Serial.print(F("udp, uip_poll preparing packet to send: "));
hudakz 4:d774541a34da 319 Serial.print(data->packet_out);
hudakz 4:d774541a34da 320 Serial.print(F(", size: "));
hudakz 4:d774541a34da 321 Serial.println(UIPEthernet.network.blockSize(data->packet_out));
hudakz 4:d774541a34da 322 #endif
hudakz 4:d774541a34da 323 UIPEthernetClass::uip_packet = data->packet_out;
hudakz 4:d774541a34da 324 UIPEthernetClass::uip_hdrlen = UIP_UDP_PHYH_LEN;
hudakz 4:d774541a34da 325 uip_udp_send(data->out_pos - (UIP_UDP_PHYH_LEN));
hudakz 4:d774541a34da 326 }
hudakz 4:d774541a34da 327 }
hudakz 4:d774541a34da 328 }
hudakz 4:d774541a34da 329
hudakz 4:d774541a34da 330 /**
hudakz 4:d774541a34da 331 * @brief
hudakz 4:d774541a34da 332 * @note
hudakz 4:d774541a34da 333 * @param
hudakz 4:d774541a34da 334 * @retval
hudakz 4:d774541a34da 335 */
hudakz 4:d774541a34da 336 void UIPUDP::_send(uip_udp_userdata_t* data) {
hudakz 4:d774541a34da 337 uip_arp_out(); //add arp
hudakz 4:d774541a34da 338 if(uip_len == UIP_ARPHDRSIZE) {
hudakz 4:d774541a34da 339 UIPEthernetClass::uip_packet = NOBLOCK;
hudakz 4:d774541a34da 340 UIPEthernetClass::packetstate &= ~UIPETHERNET_SENDPACKET;
hudakz 4:d774541a34da 341 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 342 Serial.println(F("udp, uip_poll results in ARP-packet"));
hudakz 4:d774541a34da 343 #endif
hudakz 4:d774541a34da 344 }
hudakz 4:d774541a34da 345 else {
hudakz 4:d774541a34da 346
hudakz 4:d774541a34da 347 //arp found ethaddr for ip (otherwise packet is replaced by arp-request)
hudakz 4:d774541a34da 348 data->send = false;
hudakz 4:d774541a34da 349 data->packet_out = NOBLOCK;
hudakz 4:d774541a34da 350 UIPEthernetClass::packetstate |= UIPETHERNET_SENDPACKET;
hudakz 4:d774541a34da 351 #ifdef UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 352 Serial.print(F("udp, uip_packet to send: "));
hudakz 4:d774541a34da 353 Serial.println(UIPEthernetClass::uip_packet);
hudakz 4:d774541a34da 354 #endif
hudakz 4:d774541a34da 355 }
hudakz 4:d774541a34da 356
hudakz 4:d774541a34da 357 UIPEthernet.network_send();
hudakz 4:d774541a34da 358 }
hudakz 4:d774541a34da 359 #endif