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 23 15:08:43 2018 +0100
Revision:
39:deeb00b81cc9
Parent:
33:7ba5d53df0f2
Release: 2.0.4

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