UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/

Committer:
cassyarduino
Date:
Tue Jan 03 11:39:33 2017 +0100
Revision:
18:904e3130a30c
Parent:
9:312e0937630f
Child:
20:fe5026169ec6
Changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cassyarduino 0:e3fb1267e3c3 1 /*
cassyarduino 0:e3fb1267e3c3 2 UIPClient.cpp - Arduino implementation of a uIP wrapper class.
cassyarduino 0:e3fb1267e3c3 3 Copyright (c) 2013 Norbert Truchsess <norbert.truchsess@t-online.de>
cassyarduino 0:e3fb1267e3c3 4 All rights reserved.
cassyarduino 0:e3fb1267e3c3 5
cassyarduino 0:e3fb1267e3c3 6 This program is free software: you can redistribute it and/or modify
cassyarduino 0:e3fb1267e3c3 7 it under the terms of the GNU General Public License as published by
cassyarduino 0:e3fb1267e3c3 8 the Free Software Foundation, either version 3 of the License, or
cassyarduino 0:e3fb1267e3c3 9 (at your option) any later version.
cassyarduino 0:e3fb1267e3c3 10
cassyarduino 0:e3fb1267e3c3 11 This program is distributed in the hope that it will be useful,
cassyarduino 0:e3fb1267e3c3 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
cassyarduino 0:e3fb1267e3c3 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cassyarduino 0:e3fb1267e3c3 14 GNU General Public License for more details.
cassyarduino 0:e3fb1267e3c3 15
cassyarduino 0:e3fb1267e3c3 16 You should have received a copy of the GNU General Public License
cassyarduino 0:e3fb1267e3c3 17 along with this program. If not, see <http://www.gnu.org/licenses/>.
cassyarduino 0:e3fb1267e3c3 18 */
cassyarduino 0:e3fb1267e3c3 19 #include "utility/logging.h"
cassyarduino 0:e3fb1267e3c3 20
cassyarduino 0:e3fb1267e3c3 21 extern "C"
cassyarduino 0:e3fb1267e3c3 22 {
cassyarduino 0:e3fb1267e3c3 23 #include "utility/uip-conf.h"
cassyarduino 0:e3fb1267e3c3 24 #include "utility/uip.h"
cassyarduino 0:e3fb1267e3c3 25 #include "utility/uip_arp.h"
cassyarduino 0:e3fb1267e3c3 26 #include "string.h"
cassyarduino 0:e3fb1267e3c3 27 }
cassyarduino 0:e3fb1267e3c3 28 #include "UIPEthernet.h"
cassyarduino 0:e3fb1267e3c3 29 #include "UIPClient.h"
cassyarduino 0:e3fb1267e3c3 30 #include "Dns.h"
cassyarduino 0:e3fb1267e3c3 31
cassyarduino 0:e3fb1267e3c3 32 #if defined(__AVR__)
cassyarduino 0:e3fb1267e3c3 33 #include <avr/wdt.h>
cassyarduino 0:e3fb1267e3c3 34 #endif
cassyarduino 0:e3fb1267e3c3 35
cassyarduino 0:e3fb1267e3c3 36 #if defined(__MBED__)
cassyarduino 0:e3fb1267e3c3 37 #include "mbed/millis.h"
cassyarduino 0:e3fb1267e3c3 38 #endif
cassyarduino 0:e3fb1267e3c3 39
cassyarduino 0:e3fb1267e3c3 40 #define UIP_TCP_PHYH_LEN UIP_LLH_LEN+UIP_IPTCPH_LEN
cassyarduino 0:e3fb1267e3c3 41
cassyarduino 0:e3fb1267e3c3 42 uip_userdata_t UIPClient::all_data[UIP_CONNS];
cassyarduino 0:e3fb1267e3c3 43
cassyarduino 0:e3fb1267e3c3 44 UIPClient::UIPClient() :
cassyarduino 0:e3fb1267e3c3 45 data(NULL)
cassyarduino 0:e3fb1267e3c3 46 {
cassyarduino 0:e3fb1267e3c3 47 }
cassyarduino 0:e3fb1267e3c3 48
cassyarduino 0:e3fb1267e3c3 49 UIPClient::UIPClient(uip_userdata_t* conn_data) :
cassyarduino 0:e3fb1267e3c3 50 data(conn_data)
cassyarduino 0:e3fb1267e3c3 51 {
cassyarduino 0:e3fb1267e3c3 52 }
cassyarduino 0:e3fb1267e3c3 53
cassyarduino 0:e3fb1267e3c3 54 int
cassyarduino 0:e3fb1267e3c3 55 UIPClient::connect(IPAddress ip, uint16_t port)
cassyarduino 0:e3fb1267e3c3 56 {
cassyarduino 0:e3fb1267e3c3 57 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 58 LogObject.uart_send_strln(F("UIPClient::connect(IPAddress ip, uint16_t port) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 59 #endif
cassyarduino 0:e3fb1267e3c3 60 stop();
cassyarduino 0:e3fb1267e3c3 61 uip_ipaddr_t ipaddr;
cassyarduino 0:e3fb1267e3c3 62 uip_ip_addr(ipaddr, ip);
cassyarduino 0:e3fb1267e3c3 63 struct uip_conn* conn = uip_connect(&ipaddr, htons(port));
cassyarduino 0:e3fb1267e3c3 64 if (conn)
cassyarduino 0:e3fb1267e3c3 65 {
cassyarduino 0:e3fb1267e3c3 66 #if UIP_CONNECT_TIMEOUT > 0
cassyarduino 0:e3fb1267e3c3 67 int32_t timeout = millis() + 1000 * UIP_CONNECT_TIMEOUT;
cassyarduino 0:e3fb1267e3c3 68 #endif
cassyarduino 0:e3fb1267e3c3 69 while((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED)
cassyarduino 0:e3fb1267e3c3 70 {
cassyarduino 0:e3fb1267e3c3 71 UIPEthernetClass::tick();
cassyarduino 0:e3fb1267e3c3 72 if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED)
cassyarduino 0:e3fb1267e3c3 73 {
cassyarduino 0:e3fb1267e3c3 74 data = (uip_userdata_t*) conn->appstate;
cassyarduino 0:e3fb1267e3c3 75 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 76 LogObject.uart_send_str(F("UIPClient::connect DEBUG:connected, state: "));
cassyarduino 0:e3fb1267e3c3 77 LogObject.uart_send_dec(data->state);
cassyarduino 0:e3fb1267e3c3 78 LogObject.uart_send_str(F(", first packet in: "));
cassyarduino 0:e3fb1267e3c3 79 LogObject.uart_send_decln(data->packets_in[0]);
cassyarduino 0:e3fb1267e3c3 80 #endif
cassyarduino 0:e3fb1267e3c3 81 return 1;
cassyarduino 0:e3fb1267e3c3 82 }
cassyarduino 0:e3fb1267e3c3 83 #if UIP_CONNECT_TIMEOUT > 0
cassyarduino 0:e3fb1267e3c3 84 if (((int32_t)(millis() - timeout)) > 0)
cassyarduino 0:e3fb1267e3c3 85 {
cassyarduino 0:e3fb1267e3c3 86 conn->tcpstateflags = UIP_CLOSED;
cassyarduino 0:e3fb1267e3c3 87 break;
cassyarduino 0:e3fb1267e3c3 88 }
cassyarduino 0:e3fb1267e3c3 89 #endif
cassyarduino 0:e3fb1267e3c3 90 }
cassyarduino 0:e3fb1267e3c3 91 }
cassyarduino 0:e3fb1267e3c3 92 return 0;
cassyarduino 0:e3fb1267e3c3 93 }
cassyarduino 0:e3fb1267e3c3 94
cassyarduino 0:e3fb1267e3c3 95 int
cassyarduino 0:e3fb1267e3c3 96 UIPClient::connect(const char *host, uint16_t port)
cassyarduino 0:e3fb1267e3c3 97 {
cassyarduino 0:e3fb1267e3c3 98 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 99 LogObject.uart_send_strln(F("UIPClient::connect(const char *host, uint16_t port) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 100 #endif
cassyarduino 0:e3fb1267e3c3 101 // Look up the host first
cassyarduino 0:e3fb1267e3c3 102 int ret = 0;
cassyarduino 0:e3fb1267e3c3 103 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 104 DNSClient dns;
cassyarduino 0:e3fb1267e3c3 105 IPAddress remote_addr;
cassyarduino 0:e3fb1267e3c3 106
cassyarduino 0:e3fb1267e3c3 107 dns.begin(UIPEthernetClass::_dnsServerAddress);
cassyarduino 0:e3fb1267e3c3 108 ret = dns.getHostByName(host, remote_addr);
cassyarduino 0:e3fb1267e3c3 109 if (ret == 1) {
cassyarduino 0:e3fb1267e3c3 110 return connect(remote_addr, port);
cassyarduino 0:e3fb1267e3c3 111 }
cassyarduino 0:e3fb1267e3c3 112 #endif
cassyarduino 0:e3fb1267e3c3 113 return ret;
cassyarduino 0:e3fb1267e3c3 114 }
cassyarduino 0:e3fb1267e3c3 115
cassyarduino 0:e3fb1267e3c3 116 void
cassyarduino 0:e3fb1267e3c3 117 UIPClient::stop()
cassyarduino 0:e3fb1267e3c3 118 {
cassyarduino 0:e3fb1267e3c3 119 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 120 LogObject.uart_send_strln(F("UIPClient::stop() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 121 #endif
cassyarduino 0:e3fb1267e3c3 122 if (data && data->state)
cassyarduino 0:e3fb1267e3c3 123 {
cassyarduino 0:e3fb1267e3c3 124 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 125 LogObject.uart_send_strln(F("UIPClient::stop() DEBUG_V2:Before stop(), with data"));
cassyarduino 0:e3fb1267e3c3 126 _dumpAllData();
cassyarduino 0:e3fb1267e3c3 127 #endif
cassyarduino 0:e3fb1267e3c3 128 _flushBlocks(&data->packets_in[0]);
cassyarduino 0:e3fb1267e3c3 129 if (data->state & UIP_CLIENT_REMOTECLOSED)
cassyarduino 0:e3fb1267e3c3 130 {
cassyarduino 0:e3fb1267e3c3 131 data->state = 0;
cassyarduino 0:e3fb1267e3c3 132 }
cassyarduino 0:e3fb1267e3c3 133 else
cassyarduino 0:e3fb1267e3c3 134 {
cassyarduino 0:e3fb1267e3c3 135 data->state |= UIP_CLIENT_CLOSE;
cassyarduino 0:e3fb1267e3c3 136 }
cassyarduino 0:e3fb1267e3c3 137 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 138 LogObject.uart_send_strln(F("UIPClient::stop() DEBUG_V2:after stop()"));
cassyarduino 0:e3fb1267e3c3 139 _dumpAllData();
cassyarduino 0:e3fb1267e3c3 140 #endif
cassyarduino 0:e3fb1267e3c3 141 }
cassyarduino 18:904e3130a30c 142 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 143 else
cassyarduino 0:e3fb1267e3c3 144 {
cassyarduino 18:904e3130a30c 145 LogObject.uart_send_strln(F("UIPClient::stop() DEBUG_V3:stop(), data: NULL"));
cassyarduino 0:e3fb1267e3c3 146 }
cassyarduino 0:e3fb1267e3c3 147 #endif
cassyarduino 0:e3fb1267e3c3 148 data = NULL;
cassyarduino 0:e3fb1267e3c3 149 UIPEthernetClass::tick();
cassyarduino 0:e3fb1267e3c3 150 }
cassyarduino 0:e3fb1267e3c3 151
cassyarduino 0:e3fb1267e3c3 152 uint8_t
cassyarduino 0:e3fb1267e3c3 153 UIPClient::connected()
cassyarduino 0:e3fb1267e3c3 154 {
cassyarduino 0:e3fb1267e3c3 155 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 156 LogObject.uart_send_strln(F("UIPClient::connected() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 157 #endif
cassyarduino 0:e3fb1267e3c3 158 return (data && (data->packets_in[0] != NOBLOCK || (data->state & UIP_CLIENT_CONNECTED))) ? 1 : 0;
cassyarduino 0:e3fb1267e3c3 159 }
cassyarduino 0:e3fb1267e3c3 160
cassyarduino 0:e3fb1267e3c3 161 bool
cassyarduino 0:e3fb1267e3c3 162 UIPClient::operator==(const UIPClient& rhs)
cassyarduino 0:e3fb1267e3c3 163 {
cassyarduino 0:e3fb1267e3c3 164 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 165 LogObject.uart_send_strln(F("UIPClient::operator==(const UIPClient& rhs) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 166 #endif
cassyarduino 0:e3fb1267e3c3 167 return data && rhs.data && (data == rhs.data);
cassyarduino 0:e3fb1267e3c3 168 }
cassyarduino 0:e3fb1267e3c3 169
cassyarduino 0:e3fb1267e3c3 170 UIPClient::operator bool()
cassyarduino 0:e3fb1267e3c3 171 {
cassyarduino 0:e3fb1267e3c3 172 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 173 LogObject.uart_send_strln(F("UIPClient::operator bool() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 174 #endif
cassyarduino 0:e3fb1267e3c3 175 UIPEthernetClass::tick();
cassyarduino 0:e3fb1267e3c3 176 return data && (!(data->state & UIP_CLIENT_REMOTECLOSED) || data->packets_in[0] != NOBLOCK);
cassyarduino 0:e3fb1267e3c3 177 }
cassyarduino 0:e3fb1267e3c3 178
cassyarduino 0:e3fb1267e3c3 179 size_t
cassyarduino 0:e3fb1267e3c3 180 UIPClient::write(uint8_t c)
cassyarduino 0:e3fb1267e3c3 181 {
cassyarduino 0:e3fb1267e3c3 182 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 183 LogObject.uart_send_strln(F("UIPClient::write(uint8_t c) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 184 #endif
cassyarduino 0:e3fb1267e3c3 185 return _write(data, &c, 1);
cassyarduino 0:e3fb1267e3c3 186 }
cassyarduino 0:e3fb1267e3c3 187
cassyarduino 0:e3fb1267e3c3 188 size_t
cassyarduino 0:e3fb1267e3c3 189 UIPClient::write(const uint8_t *buf, size_t size)
cassyarduino 0:e3fb1267e3c3 190 {
cassyarduino 0:e3fb1267e3c3 191 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 192 LogObject.uart_send_strln(F("UIPClient::write(const uint8_t *buf, size_t size) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 193 #endif
cassyarduino 0:e3fb1267e3c3 194 return _write(data, buf, size);
cassyarduino 0:e3fb1267e3c3 195 }
cassyarduino 0:e3fb1267e3c3 196
cassyarduino 18:904e3130a30c 197 uint16_t
cassyarduino 0:e3fb1267e3c3 198 UIPClient::_write(uip_userdata_t* u, const uint8_t *buf, size_t size)
cassyarduino 0:e3fb1267e3c3 199 {
cassyarduino 0:e3fb1267e3c3 200 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 201 LogObject.uart_send_strln(F("UIPClient::_write(uip_userdata_t* u, const uint8_t *buf, size_t size) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 202 #endif
cassyarduino 0:e3fb1267e3c3 203 int remain = size;
cassyarduino 0:e3fb1267e3c3 204 uint16_t written;
cassyarduino 0:e3fb1267e3c3 205 #if UIP_ATTEMPTS_ON_WRITE > 0
cassyarduino 0:e3fb1267e3c3 206 uint16_t attempts = UIP_ATTEMPTS_ON_WRITE;
cassyarduino 0:e3fb1267e3c3 207 #endif
cassyarduino 0:e3fb1267e3c3 208 repeat:
cassyarduino 0:e3fb1267e3c3 209 UIPEthernetClass::tick();
cassyarduino 0:e3fb1267e3c3 210 if (u && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
cassyarduino 0:e3fb1267e3c3 211 {
cassyarduino 0:e3fb1267e3c3 212 uint8_t p = _currentBlock(&u->packets_out[0]);
cassyarduino 0:e3fb1267e3c3 213 if (u->packets_out[p] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 214 {
cassyarduino 0:e3fb1267e3c3 215 newpacket:
cassyarduino 0:e3fb1267e3c3 216 u->packets_out[p] = Enc28J60Network::allocBlock(UIP_SOCKET_DATALEN);
cassyarduino 0:e3fb1267e3c3 217 if (u->packets_out[p] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 218 {
cassyarduino 0:e3fb1267e3c3 219 #if UIP_ATTEMPTS_ON_WRITE > 0
cassyarduino 0:e3fb1267e3c3 220 if ((--attempts)>0)
cassyarduino 0:e3fb1267e3c3 221 #endif
cassyarduino 0:e3fb1267e3c3 222 #if UIP_ATTEMPTS_ON_WRITE != 0
cassyarduino 0:e3fb1267e3c3 223 goto repeat;
cassyarduino 0:e3fb1267e3c3 224 #endif
cassyarduino 0:e3fb1267e3c3 225 goto ready;
cassyarduino 0:e3fb1267e3c3 226 }
cassyarduino 0:e3fb1267e3c3 227 u->out_pos = 0;
cassyarduino 0:e3fb1267e3c3 228 }
cassyarduino 0:e3fb1267e3c3 229 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 230 LogObject.uart_send_str(F("UIPClient::_write DEBUG:writePacket("));
cassyarduino 0:e3fb1267e3c3 231 LogObject.uart_send_dec(u->packets_out[p]);
cassyarduino 0:e3fb1267e3c3 232 LogObject.uart_send_str(F(") pos: "));
cassyarduino 0:e3fb1267e3c3 233 LogObject.uart_send_dec(u->out_pos);
cassyarduino 0:e3fb1267e3c3 234 LogObject.uart_send_str(F(", buf["));
cassyarduino 0:e3fb1267e3c3 235 LogObject.uart_send_dec(size-remain);
cassyarduino 0:e3fb1267e3c3 236 LogObject.uart_send_str(F("-"));
cassyarduino 0:e3fb1267e3c3 237 LogObject.uart_send_dec(remain);
cassyarduino 0:e3fb1267e3c3 238 LogObject.uart_send_str(F("]: '"));
cassyarduino 0:e3fb1267e3c3 239 #if defined(ARDUINO)
cassyarduino 0:e3fb1267e3c3 240 LogObject.uart_send_buf_len((uint8_t*)buf+size-remain,remain);
cassyarduino 0:e3fb1267e3c3 241 #endif
cassyarduino 0:e3fb1267e3c3 242 #if defined(__MBED__)
cassyarduino 0:e3fb1267e3c3 243 for(int i=0; i<remain; i++)
cassyarduino 0:e3fb1267e3c3 244 {
cassyarduino 0:e3fb1267e3c3 245 //LogObject.uart_send_buf_len((uint8_t*)buf+size-remain,remain); //MBED buffer out serial
cassyarduino 0:e3fb1267e3c3 246 }
cassyarduino 0:e3fb1267e3c3 247 #endif
cassyarduino 0:e3fb1267e3c3 248 LogObject.uart_send_strln(F("'"));
cassyarduino 0:e3fb1267e3c3 249 #endif
cassyarduino 0:e3fb1267e3c3 250 written = Enc28J60Network::writePacket(u->packets_out[p],u->out_pos,(uint8_t*)buf+size-remain,remain);
cassyarduino 0:e3fb1267e3c3 251 remain -= written;
cassyarduino 0:e3fb1267e3c3 252 u->out_pos+=written;
cassyarduino 0:e3fb1267e3c3 253 if (remain > 0)
cassyarduino 0:e3fb1267e3c3 254 {
cassyarduino 0:e3fb1267e3c3 255 if (p == UIP_SOCKET_NUMPACKETS-1)
cassyarduino 0:e3fb1267e3c3 256 {
cassyarduino 0:e3fb1267e3c3 257 #if UIP_ATTEMPTS_ON_WRITE > 0
cassyarduino 0:e3fb1267e3c3 258 if ((--attempts)>0)
cassyarduino 0:e3fb1267e3c3 259 #endif
cassyarduino 0:e3fb1267e3c3 260 #if UIP_ATTEMPTS_ON_WRITE != 0
cassyarduino 0:e3fb1267e3c3 261 goto repeat;
cassyarduino 0:e3fb1267e3c3 262 #endif
cassyarduino 0:e3fb1267e3c3 263 goto ready;
cassyarduino 0:e3fb1267e3c3 264 }
cassyarduino 0:e3fb1267e3c3 265 p++;
cassyarduino 0:e3fb1267e3c3 266 goto newpacket;
cassyarduino 0:e3fb1267e3c3 267 }
cassyarduino 0:e3fb1267e3c3 268 ready:
cassyarduino 0:e3fb1267e3c3 269 #if UIP_CLIENT_TIMER >= 0
cassyarduino 0:e3fb1267e3c3 270 u->timer = millis()+UIP_CLIENT_TIMER;
cassyarduino 0:e3fb1267e3c3 271 #endif
cassyarduino 0:e3fb1267e3c3 272 return size-remain;
cassyarduino 0:e3fb1267e3c3 273 }
cassyarduino 18:904e3130a30c 274 //return -1; -1 is wrong because return type is unsigned
cassyarduino 18:904e3130a30c 275 return 0;
cassyarduino 0:e3fb1267e3c3 276 }
cassyarduino 0:e3fb1267e3c3 277
cassyarduino 0:e3fb1267e3c3 278 int
cassyarduino 0:e3fb1267e3c3 279 UIPClient::available()
cassyarduino 0:e3fb1267e3c3 280 {
cassyarduino 0:e3fb1267e3c3 281 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 282 LogObject.uart_send_strln(F("UIPClient::available() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 283 #endif
cassyarduino 0:e3fb1267e3c3 284 if (*this)
cassyarduino 0:e3fb1267e3c3 285 return _available(data);
cassyarduino 0:e3fb1267e3c3 286 return 0;
cassyarduino 0:e3fb1267e3c3 287 }
cassyarduino 0:e3fb1267e3c3 288
cassyarduino 0:e3fb1267e3c3 289 int
cassyarduino 0:e3fb1267e3c3 290 UIPClient::_available(uip_userdata_t *u)
cassyarduino 0:e3fb1267e3c3 291 {
cassyarduino 0:e3fb1267e3c3 292 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 293 LogObject.uart_send_strln(F("UIPClient::_available(uip_userdata_t *u) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 294 #endif
cassyarduino 0:e3fb1267e3c3 295 int len = 0;
cassyarduino 0:e3fb1267e3c3 296 for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
cassyarduino 0:e3fb1267e3c3 297 {
cassyarduino 0:e3fb1267e3c3 298 len += Enc28J60Network::blockSize(u->packets_in[i]);
cassyarduino 0:e3fb1267e3c3 299 }
cassyarduino 0:e3fb1267e3c3 300 return len;
cassyarduino 0:e3fb1267e3c3 301 }
cassyarduino 0:e3fb1267e3c3 302
cassyarduino 0:e3fb1267e3c3 303 int
cassyarduino 0:e3fb1267e3c3 304 UIPClient::read(uint8_t *buf, size_t size)
cassyarduino 0:e3fb1267e3c3 305 {
cassyarduino 0:e3fb1267e3c3 306 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 307 LogObject.uart_send_strln(F("UIPClient::read(uint8_t *buf, size_t size) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 308 #endif
cassyarduino 0:e3fb1267e3c3 309 if (*this)
cassyarduino 0:e3fb1267e3c3 310 {
cassyarduino 0:e3fb1267e3c3 311 uint16_t remain = size;
cassyarduino 0:e3fb1267e3c3 312 if (data->packets_in[0] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 313 return 0;
cassyarduino 0:e3fb1267e3c3 314 uint16_t read;
cassyarduino 0:e3fb1267e3c3 315 do
cassyarduino 0:e3fb1267e3c3 316 {
cassyarduino 0:e3fb1267e3c3 317 read = Enc28J60Network::readPacket(data->packets_in[0],0,buf+size-remain,remain);
cassyarduino 0:e3fb1267e3c3 318 if (read == Enc28J60Network::blockSize(data->packets_in[0]))
cassyarduino 0:e3fb1267e3c3 319 {
cassyarduino 0:e3fb1267e3c3 320 remain -= read;
cassyarduino 0:e3fb1267e3c3 321 _eatBlock(&data->packets_in[0]);
cassyarduino 0:e3fb1267e3c3 322 if (uip_stopped(&uip_conns[data->state & UIP_CLIENT_SOCKETS]) && !(data->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
cassyarduino 0:e3fb1267e3c3 323 data->state |= UIP_CLIENT_RESTART;
cassyarduino 0:e3fb1267e3c3 324 if (data->packets_in[0] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 325 {
cassyarduino 0:e3fb1267e3c3 326 if (data->state & UIP_CLIENT_REMOTECLOSED)
cassyarduino 0:e3fb1267e3c3 327 {
cassyarduino 0:e3fb1267e3c3 328 data->state = 0;
cassyarduino 0:e3fb1267e3c3 329 data = NULL;
cassyarduino 0:e3fb1267e3c3 330 }
cassyarduino 0:e3fb1267e3c3 331 return size-remain;
cassyarduino 0:e3fb1267e3c3 332 }
cassyarduino 0:e3fb1267e3c3 333 }
cassyarduino 0:e3fb1267e3c3 334 else
cassyarduino 0:e3fb1267e3c3 335 {
cassyarduino 0:e3fb1267e3c3 336 Enc28J60Network::resizeBlock(data->packets_in[0],read);
cassyarduino 0:e3fb1267e3c3 337 break;
cassyarduino 0:e3fb1267e3c3 338 }
cassyarduino 0:e3fb1267e3c3 339 }
cassyarduino 0:e3fb1267e3c3 340 while(remain > 0);
cassyarduino 0:e3fb1267e3c3 341 return size;
cassyarduino 0:e3fb1267e3c3 342 }
cassyarduino 0:e3fb1267e3c3 343 return -1;
cassyarduino 0:e3fb1267e3c3 344 }
cassyarduino 0:e3fb1267e3c3 345
cassyarduino 0:e3fb1267e3c3 346 int
cassyarduino 0:e3fb1267e3c3 347 UIPClient::read()
cassyarduino 0:e3fb1267e3c3 348 {
cassyarduino 0:e3fb1267e3c3 349 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 350 LogObject.uart_send_strln(F("UIPClient::read() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 351 #endif
cassyarduino 0:e3fb1267e3c3 352 uint8_t c;
cassyarduino 0:e3fb1267e3c3 353 if (read(&c,1) < 0)
cassyarduino 0:e3fb1267e3c3 354 return -1;
cassyarduino 0:e3fb1267e3c3 355 return c;
cassyarduino 0:e3fb1267e3c3 356 }
cassyarduino 0:e3fb1267e3c3 357
cassyarduino 0:e3fb1267e3c3 358 int
cassyarduino 0:e3fb1267e3c3 359 UIPClient::peek()
cassyarduino 0:e3fb1267e3c3 360 {
cassyarduino 0:e3fb1267e3c3 361 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 362 LogObject.uart_send_strln(F("UIPClient::peek() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 363 #endif
cassyarduino 0:e3fb1267e3c3 364 if (*this)
cassyarduino 0:e3fb1267e3c3 365 {
cassyarduino 0:e3fb1267e3c3 366 if (data->packets_in[0] != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 367 {
cassyarduino 0:e3fb1267e3c3 368 uint8_t c;
cassyarduino 0:e3fb1267e3c3 369 Enc28J60Network::readPacket(data->packets_in[0],0,&c,1);
cassyarduino 0:e3fb1267e3c3 370 return c;
cassyarduino 0:e3fb1267e3c3 371 }
cassyarduino 0:e3fb1267e3c3 372 }
cassyarduino 0:e3fb1267e3c3 373 return -1;
cassyarduino 0:e3fb1267e3c3 374 }
cassyarduino 0:e3fb1267e3c3 375
cassyarduino 0:e3fb1267e3c3 376 void
cassyarduino 0:e3fb1267e3c3 377 UIPClient::flush()
cassyarduino 0:e3fb1267e3c3 378 {
cassyarduino 0:e3fb1267e3c3 379 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 380 LogObject.uart_send_strln(F("UIPClient::flush() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 381 #endif
cassyarduino 0:e3fb1267e3c3 382 if (*this)
cassyarduino 0:e3fb1267e3c3 383 {
cassyarduino 0:e3fb1267e3c3 384 _flushBlocks(&data->packets_in[0]);
cassyarduino 0:e3fb1267e3c3 385 }
cassyarduino 0:e3fb1267e3c3 386 }
cassyarduino 0:e3fb1267e3c3 387
cassyarduino 0:e3fb1267e3c3 388 void
cassyarduino 0:e3fb1267e3c3 389 uipclient_appcall(void)
cassyarduino 0:e3fb1267e3c3 390 {
cassyarduino 0:e3fb1267e3c3 391 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 392 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 393 #endif
cassyarduino 0:e3fb1267e3c3 394 uint16_t send_len = 0;
cassyarduino 0:e3fb1267e3c3 395 uip_userdata_t *u = (uip_userdata_t*)uip_conn->appstate;
cassyarduino 0:e3fb1267e3c3 396 if (!u && uip_connected())
cassyarduino 0:e3fb1267e3c3 397 {
cassyarduino 0:e3fb1267e3c3 398 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 399 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG_V2:UIPClient uip_connected"));
cassyarduino 0:e3fb1267e3c3 400 UIPClient::_dumpAllData();
cassyarduino 0:e3fb1267e3c3 401 #endif
cassyarduino 0:e3fb1267e3c3 402 u = (uip_userdata_t*) UIPClient::_allocateData();
cassyarduino 0:e3fb1267e3c3 403 if (u)
cassyarduino 0:e3fb1267e3c3 404 {
cassyarduino 0:e3fb1267e3c3 405 uip_conn->appstate = u;
cassyarduino 0:e3fb1267e3c3 406 #if ACTLOGLEVEL>=LOG_DEBUG_V1
cassyarduino 0:e3fb1267e3c3 407 LogObject.uart_send_str(F("uipclient_appcall(void) DEBUG_V1:UIPClient allocated state: "));
cassyarduino 0:e3fb1267e3c3 408 LogObject.uart_send_binln(u->state);
cassyarduino 0:e3fb1267e3c3 409 #endif
cassyarduino 0:e3fb1267e3c3 410 }
cassyarduino 0:e3fb1267e3c3 411 #if ACTLOGLEVEL>=LOG_ERR
cassyarduino 0:e3fb1267e3c3 412 else
cassyarduino 0:e3fb1267e3c3 413 LogObject.uart_send_strln(F("uipclient_appcall(void) ERROR:UIPClient allocation failed"));
cassyarduino 0:e3fb1267e3c3 414 #endif
cassyarduino 0:e3fb1267e3c3 415 }
cassyarduino 0:e3fb1267e3c3 416 if (u)
cassyarduino 0:e3fb1267e3c3 417 {
cassyarduino 0:e3fb1267e3c3 418 if (uip_newdata())
cassyarduino 0:e3fb1267e3c3 419 {
cassyarduino 0:e3fb1267e3c3 420 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 421 LogObject.uart_send_str(F("uipclient_appcall(void) DEBUG:UIPClient uip_newdata, uip_len:"));
cassyarduino 0:e3fb1267e3c3 422 LogObject.uart_send_decln(uip_len);
cassyarduino 0:e3fb1267e3c3 423 #endif
cassyarduino 0:e3fb1267e3c3 424 if (uip_len && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
cassyarduino 0:e3fb1267e3c3 425 {
cassyarduino 0:e3fb1267e3c3 426 for (uint8_t i=0; i < UIP_SOCKET_NUMPACKETS; i++)
cassyarduino 0:e3fb1267e3c3 427 {
cassyarduino 0:e3fb1267e3c3 428 if (u->packets_in[i] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 429 {
cassyarduino 0:e3fb1267e3c3 430 u->packets_in[i] = Enc28J60Network::allocBlock(uip_len);
cassyarduino 0:e3fb1267e3c3 431 if (u->packets_in[i] != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 432 {
cassyarduino 0:e3fb1267e3c3 433 Enc28J60Network::copyPacket(u->packets_in[i],0,UIPEthernetClass::in_packet,((uint8_t*)uip_appdata)-uip_buf,uip_len);
cassyarduino 0:e3fb1267e3c3 434 if (i == UIP_SOCKET_NUMPACKETS-1)
cassyarduino 0:e3fb1267e3c3 435 uip_stop();
cassyarduino 0:e3fb1267e3c3 436 goto finish_newdata;
cassyarduino 0:e3fb1267e3c3 437 }
cassyarduino 0:e3fb1267e3c3 438 }
cassyarduino 0:e3fb1267e3c3 439 }
cassyarduino 0:e3fb1267e3c3 440 UIPEthernetClass::packetstate &= ~UIPETHERNET_FREEPACKET;
cassyarduino 0:e3fb1267e3c3 441 uip_stop();
cassyarduino 0:e3fb1267e3c3 442 }
cassyarduino 0:e3fb1267e3c3 443 }
cassyarduino 0:e3fb1267e3c3 444 finish_newdata:
cassyarduino 0:e3fb1267e3c3 445 if (u->state & UIP_CLIENT_RESTART)
cassyarduino 0:e3fb1267e3c3 446 {
cassyarduino 0:e3fb1267e3c3 447 u->state &= ~UIP_CLIENT_RESTART;
cassyarduino 0:e3fb1267e3c3 448 uip_restart();
cassyarduino 0:e3fb1267e3c3 449 }
cassyarduino 0:e3fb1267e3c3 450 // If the connection has been closed, save received but unread data.
cassyarduino 0:e3fb1267e3c3 451 if (uip_closed() || uip_timedout())
cassyarduino 0:e3fb1267e3c3 452 {
cassyarduino 0:e3fb1267e3c3 453 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 454 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG_V2:UIPClient uip_closed"));
cassyarduino 0:e3fb1267e3c3 455 UIPClient::_dumpAllData();
cassyarduino 0:e3fb1267e3c3 456 #endif
cassyarduino 0:e3fb1267e3c3 457 // drop outgoing packets not sent yet:
cassyarduino 0:e3fb1267e3c3 458 UIPClient::_flushBlocks(&u->packets_out[0]);
cassyarduino 0:e3fb1267e3c3 459 if (u->packets_in[0] != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 460 {
cassyarduino 0:e3fb1267e3c3 461 ((uip_userdata_closed_t *)u)->lport = uip_conn->lport;
cassyarduino 0:e3fb1267e3c3 462 u->state |= UIP_CLIENT_REMOTECLOSED;
cassyarduino 0:e3fb1267e3c3 463 }
cassyarduino 0:e3fb1267e3c3 464 else
cassyarduino 0:e3fb1267e3c3 465 u->state = 0;
cassyarduino 0:e3fb1267e3c3 466 // disassociate appdata.
cassyarduino 0:e3fb1267e3c3 467 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 468 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG_V2:After UIPClient uip_closed"));
cassyarduino 0:e3fb1267e3c3 469 UIPClient::_dumpAllData();
cassyarduino 0:e3fb1267e3c3 470 #endif
cassyarduino 0:e3fb1267e3c3 471 uip_conn->appstate = NULL;
cassyarduino 0:e3fb1267e3c3 472 goto finish;
cassyarduino 0:e3fb1267e3c3 473 }
cassyarduino 0:e3fb1267e3c3 474 if (uip_acked())
cassyarduino 0:e3fb1267e3c3 475 {
cassyarduino 0:e3fb1267e3c3 476 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 477 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG:UIPClient uip_acked"));
cassyarduino 0:e3fb1267e3c3 478 #endif
cassyarduino 0:e3fb1267e3c3 479 UIPClient::_eatBlock(&u->packets_out[0]);
cassyarduino 0:e3fb1267e3c3 480 }
cassyarduino 0:e3fb1267e3c3 481 if (uip_poll() || uip_rexmit())
cassyarduino 0:e3fb1267e3c3 482 {
cassyarduino 0:e3fb1267e3c3 483 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 484 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG:UIPClient uip_poll ||uip_remix"));
cassyarduino 0:e3fb1267e3c3 485 #endif
cassyarduino 0:e3fb1267e3c3 486 if (u->packets_out[0] != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 487 {
cassyarduino 0:e3fb1267e3c3 488 if (u->packets_out[1] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 489 {
cassyarduino 0:e3fb1267e3c3 490 send_len = u->out_pos;
cassyarduino 0:e3fb1267e3c3 491 if (send_len > 0)
cassyarduino 0:e3fb1267e3c3 492 {
cassyarduino 0:e3fb1267e3c3 493 Enc28J60Network::resizeBlock(u->packets_out[0],0,send_len);
cassyarduino 0:e3fb1267e3c3 494 }
cassyarduino 0:e3fb1267e3c3 495 }
cassyarduino 0:e3fb1267e3c3 496 else
cassyarduino 0:e3fb1267e3c3 497 send_len = Enc28J60Network::blockSize(u->packets_out[0]);
cassyarduino 0:e3fb1267e3c3 498 if (send_len > 0)
cassyarduino 0:e3fb1267e3c3 499 {
cassyarduino 0:e3fb1267e3c3 500 UIPEthernetClass::uip_hdrlen = ((uint8_t*)uip_appdata)-uip_buf;
cassyarduino 0:e3fb1267e3c3 501 UIPEthernetClass::uip_packet = Enc28J60Network::allocBlock(UIPEthernetClass::uip_hdrlen+send_len);
cassyarduino 0:e3fb1267e3c3 502 if (UIPEthernetClass::uip_packet != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 503 {
cassyarduino 0:e3fb1267e3c3 504 Enc28J60Network::copyPacket(UIPEthernetClass::uip_packet,UIPEthernetClass::uip_hdrlen,u->packets_out[0],0,send_len);
cassyarduino 0:e3fb1267e3c3 505 UIPEthernetClass::packetstate |= UIPETHERNET_SENDPACKET;
cassyarduino 0:e3fb1267e3c3 506 }
cassyarduino 0:e3fb1267e3c3 507 }
cassyarduino 0:e3fb1267e3c3 508 goto finish;
cassyarduino 0:e3fb1267e3c3 509 }
cassyarduino 0:e3fb1267e3c3 510 }
cassyarduino 0:e3fb1267e3c3 511 // don't close connection unless all outgoing packets are sent
cassyarduino 0:e3fb1267e3c3 512 if (u->state & UIP_CLIENT_CLOSE)
cassyarduino 0:e3fb1267e3c3 513 {
cassyarduino 0:e3fb1267e3c3 514 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 515 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG_V2:UIPClient state UIP_CLIENT_CLOSE"));
cassyarduino 0:e3fb1267e3c3 516 UIPClient::_dumpAllData();
cassyarduino 0:e3fb1267e3c3 517 #endif
cassyarduino 0:e3fb1267e3c3 518 if (u->packets_out[0] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 519 {
cassyarduino 0:e3fb1267e3c3 520 u->state = 0;
cassyarduino 0:e3fb1267e3c3 521 uip_conn->appstate = NULL;
cassyarduino 0:e3fb1267e3c3 522 uip_close();
cassyarduino 0:e3fb1267e3c3 523 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 524 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG_V2:no blocks out -> free userdata"));
cassyarduino 0:e3fb1267e3c3 525 UIPClient::_dumpAllData();
cassyarduino 0:e3fb1267e3c3 526 #endif
cassyarduino 0:e3fb1267e3c3 527 }
cassyarduino 0:e3fb1267e3c3 528 else
cassyarduino 0:e3fb1267e3c3 529 {
cassyarduino 0:e3fb1267e3c3 530 uip_stop();
cassyarduino 0:e3fb1267e3c3 531 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 532 LogObject.uart_send_strln(F("uipclient_appcall(void) DEBUG:blocks outstanding transfer -> uip_stop()"));
cassyarduino 0:e3fb1267e3c3 533 #endif
cassyarduino 0:e3fb1267e3c3 534 }
cassyarduino 0:e3fb1267e3c3 535 }
cassyarduino 0:e3fb1267e3c3 536 }
cassyarduino 0:e3fb1267e3c3 537 finish:
cassyarduino 0:e3fb1267e3c3 538 uip_send(uip_appdata,send_len);
cassyarduino 0:e3fb1267e3c3 539 uip_len = send_len;
cassyarduino 0:e3fb1267e3c3 540 }
cassyarduino 0:e3fb1267e3c3 541
cassyarduino 0:e3fb1267e3c3 542 uip_userdata_t *
cassyarduino 0:e3fb1267e3c3 543 UIPClient::_allocateData()
cassyarduino 0:e3fb1267e3c3 544 {
cassyarduino 0:e3fb1267e3c3 545 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 546 LogObject.uart_send_strln(F("UIPClient::_allocateData() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 547 #endif
cassyarduino 0:e3fb1267e3c3 548 for ( uint8_t sock = 0; sock < UIP_CONNS; sock++ )
cassyarduino 0:e3fb1267e3c3 549 {
cassyarduino 0:e3fb1267e3c3 550 uip_userdata_t* data = &UIPClient::all_data[sock];
cassyarduino 0:e3fb1267e3c3 551 if (!data->state)
cassyarduino 0:e3fb1267e3c3 552 {
cassyarduino 0:e3fb1267e3c3 553 data->state = sock | UIP_CLIENT_CONNECTED;
cassyarduino 0:e3fb1267e3c3 554 memset(&data->packets_in[0],0,sizeof(uip_userdata_t)-sizeof(data->state));
cassyarduino 0:e3fb1267e3c3 555 return data;
cassyarduino 0:e3fb1267e3c3 556 }
cassyarduino 0:e3fb1267e3c3 557 }
cassyarduino 0:e3fb1267e3c3 558 return NULL;
cassyarduino 0:e3fb1267e3c3 559 }
cassyarduino 0:e3fb1267e3c3 560
cassyarduino 0:e3fb1267e3c3 561 uint8_t
cassyarduino 0:e3fb1267e3c3 562 UIPClient::_currentBlock(memhandle* block)
cassyarduino 0:e3fb1267e3c3 563 {
cassyarduino 0:e3fb1267e3c3 564 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 565 LogObject.uart_send_strln(F("UIPClient::_currentBlock(memhandle* block) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 566 #endif
cassyarduino 0:e3fb1267e3c3 567 for (uint8_t i = 1; i < UIP_SOCKET_NUMPACKETS; i++)
cassyarduino 0:e3fb1267e3c3 568 {
cassyarduino 0:e3fb1267e3c3 569 if (block[i] == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 570 return i-1;
cassyarduino 0:e3fb1267e3c3 571 }
cassyarduino 0:e3fb1267e3c3 572 return UIP_SOCKET_NUMPACKETS-1;
cassyarduino 0:e3fb1267e3c3 573 }
cassyarduino 0:e3fb1267e3c3 574
cassyarduino 0:e3fb1267e3c3 575 void
cassyarduino 0:e3fb1267e3c3 576 UIPClient::_eatBlock(memhandle* block)
cassyarduino 0:e3fb1267e3c3 577 {
cassyarduino 0:e3fb1267e3c3 578 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 579 LogObject.uart_send_strln(F("UIPClient::_eatBlock(memhandle* block) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 580 #endif
cassyarduino 0:e3fb1267e3c3 581 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 582 memhandle* start = block;
cassyarduino 0:e3fb1267e3c3 583 LogObject.uart_send_str(F("UIPClient::_eatBlock DEBUG:eatblock("));
cassyarduino 0:e3fb1267e3c3 584 LogObject.uart_send_dec(*block);
cassyarduino 0:e3fb1267e3c3 585 LogObject.uart_send_str(F("): "));
cassyarduino 0:e3fb1267e3c3 586 for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
cassyarduino 0:e3fb1267e3c3 587 {
cassyarduino 0:e3fb1267e3c3 588 LogObject.uart_send_dec(start[i]);
cassyarduino 0:e3fb1267e3c3 589 LogObject.uart_send_str(F(" "));
cassyarduino 0:e3fb1267e3c3 590 }
cassyarduino 0:e3fb1267e3c3 591 LogObject.uart_send_str(F("-> "));
cassyarduino 0:e3fb1267e3c3 592 #endif
cassyarduino 0:e3fb1267e3c3 593 Enc28J60Network::freeBlock(block[0]);
cassyarduino 0:e3fb1267e3c3 594 for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS-1; i++)
cassyarduino 0:e3fb1267e3c3 595 {
cassyarduino 0:e3fb1267e3c3 596 block[i] = block[i+1];
cassyarduino 0:e3fb1267e3c3 597 }
cassyarduino 0:e3fb1267e3c3 598 block[UIP_SOCKET_NUMPACKETS-1] = NOBLOCK;
cassyarduino 0:e3fb1267e3c3 599 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 600 for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
cassyarduino 0:e3fb1267e3c3 601 {
cassyarduino 0:e3fb1267e3c3 602 LogObject.uart_send_dec(start[i]);
cassyarduino 0:e3fb1267e3c3 603 LogObject.uart_send_str(F(" "));
cassyarduino 0:e3fb1267e3c3 604 }
cassyarduino 0:e3fb1267e3c3 605 LogObject.uart_send_strln(F(""));
cassyarduino 0:e3fb1267e3c3 606 #endif
cassyarduino 0:e3fb1267e3c3 607 }
cassyarduino 0:e3fb1267e3c3 608
cassyarduino 0:e3fb1267e3c3 609 void
cassyarduino 0:e3fb1267e3c3 610 UIPClient::_flushBlocks(memhandle* block)
cassyarduino 0:e3fb1267e3c3 611 {
cassyarduino 0:e3fb1267e3c3 612 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 613 LogObject.uart_send_strln(F("UIPClient::_flushBlocks(memhandle* block) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 614 #endif
cassyarduino 0:e3fb1267e3c3 615 for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++)
cassyarduino 0:e3fb1267e3c3 616 {
cassyarduino 0:e3fb1267e3c3 617 Enc28J60Network::freeBlock(block[i]);
cassyarduino 0:e3fb1267e3c3 618 block[i] = NOBLOCK;
cassyarduino 0:e3fb1267e3c3 619 }
cassyarduino 0:e3fb1267e3c3 620 }
cassyarduino 0:e3fb1267e3c3 621
cassyarduino 0:e3fb1267e3c3 622 #if ACTLOGLEVEL>=LOG_DEBUG_V2
cassyarduino 0:e3fb1267e3c3 623 void
cassyarduino 0:e3fb1267e3c3 624 UIPClient::_dumpAllData(void) {
cassyarduino 0:e3fb1267e3c3 625 for (uint8_t i=0; i < UIP_CONNS; i++)
cassyarduino 0:e3fb1267e3c3 626 {
cassyarduino 0:e3fb1267e3c3 627 LogObject.uart_send_str(F("UIPClient::_dumpAllData() DEBUG_V2:UIPClient::all_data["));
cassyarduino 0:e3fb1267e3c3 628 LogObject.uart_send_dec(i);
cassyarduino 0:e3fb1267e3c3 629 LogObject.uart_send_str(F("], state:"));
cassyarduino 0:e3fb1267e3c3 630 LogObject.uart_send_binln(all_data[i].state);
cassyarduino 0:e3fb1267e3c3 631 LogObject.uart_send_str(F("packets_in: "));
cassyarduino 0:e3fb1267e3c3 632 for (uint8_t j=0; j < UIP_SOCKET_NUMPACKETS; j++)
cassyarduino 0:e3fb1267e3c3 633 {
cassyarduino 0:e3fb1267e3c3 634 LogObject.uart_send_dec(all_data[i].packets_in[j]);
cassyarduino 0:e3fb1267e3c3 635 LogObject.uart_send_str(F(" "));
cassyarduino 0:e3fb1267e3c3 636 }
cassyarduino 0:e3fb1267e3c3 637 LogObject.uart_send_strln(F(""));
cassyarduino 0:e3fb1267e3c3 638 if (all_data[i].state & UIP_CLIENT_REMOTECLOSED)
cassyarduino 0:e3fb1267e3c3 639 {
cassyarduino 0:e3fb1267e3c3 640 LogObject.uart_send_str(F("state remote closed, local port: "));
cassyarduino 0:e3fb1267e3c3 641 LogObject.uart_send_decln(htons(((uip_userdata_closed_t *)(&all_data[i]))->lport));
cassyarduino 0:e3fb1267e3c3 642 }
cassyarduino 0:e3fb1267e3c3 643 else
cassyarduino 0:e3fb1267e3c3 644 {
cassyarduino 0:e3fb1267e3c3 645 LogObject.uart_send_str(F("packets_out: "));
cassyarduino 0:e3fb1267e3c3 646 for (uint8_t j=0; j < UIP_SOCKET_NUMPACKETS; j++)
cassyarduino 0:e3fb1267e3c3 647 {
cassyarduino 0:e3fb1267e3c3 648 LogObject.uart_send_dec(all_data[i].packets_out[j]);
cassyarduino 0:e3fb1267e3c3 649 LogObject.uart_send_str(F(" "));
cassyarduino 0:e3fb1267e3c3 650 }
cassyarduino 0:e3fb1267e3c3 651 LogObject.uart_send_strln(F(""));
cassyarduino 0:e3fb1267e3c3 652 LogObject.uart_send_str(F("out_pos: "));
cassyarduino 0:e3fb1267e3c3 653 LogObject.uart_send_decln(all_data[i].out_pos);
cassyarduino 0:e3fb1267e3c3 654 }
cassyarduino 0:e3fb1267e3c3 655 }
cassyarduino 0:e3fb1267e3c3 656 }
cassyarduino 0:e3fb1267e3c3 657 #endif