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:
Wed Dec 21 16:58:10 2016 +0100
Revision:
0:e3fb1267e3c3
Child:
5:f9a2b1916a8d
initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cassyarduino 0:e3fb1267e3c3 1 /*
cassyarduino 0:e3fb1267e3c3 2 UIPEthernet.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
cassyarduino 0:e3fb1267e3c3 20 #if defined(ARDUINO)
cassyarduino 0:e3fb1267e3c3 21 #include <Arduino.h>
cassyarduino 0:e3fb1267e3c3 22 #endif
cassyarduino 0:e3fb1267e3c3 23 #if defined(__MBED__)
cassyarduino 0:e3fb1267e3c3 24 #include <mbed.h>
cassyarduino 0:e3fb1267e3c3 25 #include "mbed/millis.h"
cassyarduino 0:e3fb1267e3c3 26 #endif
cassyarduino 0:e3fb1267e3c3 27 #include "UIPEthernet.h"
cassyarduino 0:e3fb1267e3c3 28 #include "utility/logging.h"
cassyarduino 0:e3fb1267e3c3 29 #include "utility/Enc28J60Network.h"
cassyarduino 0:e3fb1267e3c3 30
cassyarduino 0:e3fb1267e3c3 31 #include "UIPUdp.h"
cassyarduino 0:e3fb1267e3c3 32
cassyarduino 0:e3fb1267e3c3 33 extern "C"
cassyarduino 0:e3fb1267e3c3 34 {
cassyarduino 0:e3fb1267e3c3 35 #include "utility/uip-conf.h"
cassyarduino 0:e3fb1267e3c3 36 #include "utility/uip.h"
cassyarduino 0:e3fb1267e3c3 37 #include "utility/uip_arp.h"
cassyarduino 0:e3fb1267e3c3 38 #include "utility/uip_timer.h"
cassyarduino 0:e3fb1267e3c3 39 }
cassyarduino 0:e3fb1267e3c3 40
cassyarduino 0:e3fb1267e3c3 41 #define ETH_HDR ((struct uip_eth_hdr *)&uip_buf[0])
cassyarduino 0:e3fb1267e3c3 42
cassyarduino 0:e3fb1267e3c3 43 memhandle UIPEthernetClass::in_packet(NOBLOCK);
cassyarduino 0:e3fb1267e3c3 44 memhandle UIPEthernetClass::uip_packet(NOBLOCK);
cassyarduino 0:e3fb1267e3c3 45 uint8_t UIPEthernetClass::uip_hdrlen(0);
cassyarduino 0:e3fb1267e3c3 46 uint8_t UIPEthernetClass::packetstate(0);
cassyarduino 0:e3fb1267e3c3 47
cassyarduino 0:e3fb1267e3c3 48 IPAddress UIPEthernetClass::_dnsServerAddress;
cassyarduino 0:e3fb1267e3c3 49 DhcpClass* UIPEthernetClass::_dhcp(NULL);
cassyarduino 0:e3fb1267e3c3 50
cassyarduino 0:e3fb1267e3c3 51 unsigned long UIPEthernetClass::periodic_timer;
cassyarduino 0:e3fb1267e3c3 52
cassyarduino 0:e3fb1267e3c3 53 static DhcpClass s_dhcp; // Placing this instance here is saving 40K to final *.bin (see bug below)
cassyarduino 0:e3fb1267e3c3 54
cassyarduino 0:e3fb1267e3c3 55
cassyarduino 0:e3fb1267e3c3 56 // Because uIP isn't encapsulated within a class we have to use global
cassyarduino 0:e3fb1267e3c3 57 // variables, so we can only have one TCP/IP stack per program.
cassyarduino 0:e3fb1267e3c3 58
cassyarduino 0:e3fb1267e3c3 59 UIPEthernetClass::UIPEthernetClass()
cassyarduino 0:e3fb1267e3c3 60 {
cassyarduino 0:e3fb1267e3c3 61 }
cassyarduino 0:e3fb1267e3c3 62
cassyarduino 0:e3fb1267e3c3 63 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 64 int
cassyarduino 0:e3fb1267e3c3 65 UIPEthernetClass::begin(const uint8_t* mac)
cassyarduino 0:e3fb1267e3c3 66 {
cassyarduino 0:e3fb1267e3c3 67 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 68 LogObject.uart_send_strln(F("UIPEthernetClass::begin(const uint8_t* mac) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 69 #endif
cassyarduino 0:e3fb1267e3c3 70 //static DhcpClass s_dhcp; // <-- this is a bug !
cassyarduino 0:e3fb1267e3c3 71 // I leave it there commented for history. It is bring all GCC "new" memory allocation code, making the *.bin almost 40K bigger. I've move it globally.
cassyarduino 0:e3fb1267e3c3 72 _dhcp = &s_dhcp;
cassyarduino 0:e3fb1267e3c3 73 // Initialise the basic info
cassyarduino 0:e3fb1267e3c3 74 init(mac);
cassyarduino 0:e3fb1267e3c3 75
cassyarduino 0:e3fb1267e3c3 76 // Now try to get our config info from a DHCP server
cassyarduino 0:e3fb1267e3c3 77 int ret = _dhcp->beginWithDHCP((uint8_t*)mac);
cassyarduino 0:e3fb1267e3c3 78 if(ret == 1)
cassyarduino 0:e3fb1267e3c3 79 {
cassyarduino 0:e3fb1267e3c3 80 // We've successfully found a DHCP server and got our configuration info, so set things
cassyarduino 0:e3fb1267e3c3 81 // accordingly
cassyarduino 0:e3fb1267e3c3 82 configure(_dhcp->getLocalIp(),_dhcp->getDnsServerIp(),_dhcp->getGatewayIp(),_dhcp->getSubnetMask());
cassyarduino 0:e3fb1267e3c3 83 }
cassyarduino 0:e3fb1267e3c3 84 return ret;
cassyarduino 0:e3fb1267e3c3 85 }
cassyarduino 0:e3fb1267e3c3 86 #endif
cassyarduino 0:e3fb1267e3c3 87
cassyarduino 0:e3fb1267e3c3 88 void
cassyarduino 0:e3fb1267e3c3 89 UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip)
cassyarduino 0:e3fb1267e3c3 90 {
cassyarduino 0:e3fb1267e3c3 91 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 92 LogObject.uart_send_strln(F("UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 93 #endif
cassyarduino 0:e3fb1267e3c3 94 IPAddress dns = ip;
cassyarduino 0:e3fb1267e3c3 95 dns[3] = 1;
cassyarduino 0:e3fb1267e3c3 96 begin(mac, ip, dns);
cassyarduino 0:e3fb1267e3c3 97 }
cassyarduino 0:e3fb1267e3c3 98
cassyarduino 0:e3fb1267e3c3 99 void
cassyarduino 0:e3fb1267e3c3 100 UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns)
cassyarduino 0:e3fb1267e3c3 101 {
cassyarduino 0:e3fb1267e3c3 102 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 103 LogObject.uart_send_strln(F("UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 104 #endif
cassyarduino 0:e3fb1267e3c3 105 IPAddress gateway = ip;
cassyarduino 0:e3fb1267e3c3 106 gateway[3] = 1;
cassyarduino 0:e3fb1267e3c3 107 begin(mac, ip, dns, gateway);
cassyarduino 0:e3fb1267e3c3 108 }
cassyarduino 0:e3fb1267e3c3 109
cassyarduino 0:e3fb1267e3c3 110 void
cassyarduino 0:e3fb1267e3c3 111 UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway)
cassyarduino 0:e3fb1267e3c3 112 {
cassyarduino 0:e3fb1267e3c3 113 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 114 LogObject.uart_send_strln(F("UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 115 #endif
cassyarduino 0:e3fb1267e3c3 116 IPAddress subnet(255, 255, 255, 0);
cassyarduino 0:e3fb1267e3c3 117 begin(mac, ip, dns, gateway, subnet);
cassyarduino 0:e3fb1267e3c3 118 }
cassyarduino 0:e3fb1267e3c3 119
cassyarduino 0:e3fb1267e3c3 120 void
cassyarduino 0:e3fb1267e3c3 121 UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet)
cassyarduino 0:e3fb1267e3c3 122 {
cassyarduino 0:e3fb1267e3c3 123 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 124 LogObject.uart_send_strln(F("UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 125 #endif
cassyarduino 0:e3fb1267e3c3 126 init(mac);
cassyarduino 0:e3fb1267e3c3 127 configure(ip,dns,gateway,subnet);
cassyarduino 0:e3fb1267e3c3 128 }
cassyarduino 0:e3fb1267e3c3 129
cassyarduino 0:e3fb1267e3c3 130 int UIPEthernetClass::maintain(){
cassyarduino 0:e3fb1267e3c3 131 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 132 LogObject.uart_send_strln(F("UIPEthernetClass::maintain() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 133 #endif
cassyarduino 0:e3fb1267e3c3 134 tick();
cassyarduino 0:e3fb1267e3c3 135 int rc = DHCP_CHECK_NONE;
cassyarduino 0:e3fb1267e3c3 136 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 137 if(_dhcp != NULL){
cassyarduino 0:e3fb1267e3c3 138 //we have a pointer to dhcp, use it
cassyarduino 0:e3fb1267e3c3 139 rc = _dhcp->checkLease();
cassyarduino 0:e3fb1267e3c3 140 switch ( rc ){
cassyarduino 0:e3fb1267e3c3 141 case DHCP_CHECK_NONE:
cassyarduino 0:e3fb1267e3c3 142 //nothing done
cassyarduino 0:e3fb1267e3c3 143 break;
cassyarduino 0:e3fb1267e3c3 144 case DHCP_CHECK_RENEW_OK:
cassyarduino 0:e3fb1267e3c3 145 case DHCP_CHECK_REBIND_OK:
cassyarduino 0:e3fb1267e3c3 146 //we might have got a new IP.
cassyarduino 0:e3fb1267e3c3 147 configure(_dhcp->getLocalIp(),_dhcp->getDnsServerIp(),_dhcp->getGatewayIp(),_dhcp->getSubnetMask());
cassyarduino 0:e3fb1267e3c3 148 break;
cassyarduino 0:e3fb1267e3c3 149 default:
cassyarduino 0:e3fb1267e3c3 150 //this is actually a error, it will retry though
cassyarduino 0:e3fb1267e3c3 151 break;
cassyarduino 0:e3fb1267e3c3 152 }
cassyarduino 0:e3fb1267e3c3 153 }
cassyarduino 0:e3fb1267e3c3 154 return rc;
cassyarduino 0:e3fb1267e3c3 155 #endif
cassyarduino 0:e3fb1267e3c3 156 }
cassyarduino 0:e3fb1267e3c3 157
cassyarduino 0:e3fb1267e3c3 158 IPAddress UIPEthernetClass::localIP()
cassyarduino 0:e3fb1267e3c3 159 {
cassyarduino 0:e3fb1267e3c3 160 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 161 LogObject.uart_send_strln(F("UIPEthernetClass::localIP() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 162 #endif
cassyarduino 0:e3fb1267e3c3 163 IPAddress ret;
cassyarduino 0:e3fb1267e3c3 164 uip_ipaddr_t a;
cassyarduino 0:e3fb1267e3c3 165 uip_gethostaddr(a);
cassyarduino 0:e3fb1267e3c3 166 return ip_addr_uip(a);
cassyarduino 0:e3fb1267e3c3 167 }
cassyarduino 0:e3fb1267e3c3 168
cassyarduino 0:e3fb1267e3c3 169 IPAddress UIPEthernetClass::subnetMask()
cassyarduino 0:e3fb1267e3c3 170 {
cassyarduino 0:e3fb1267e3c3 171 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 172 LogObject.uart_send_strln(F("UIPEthernetClass::subnetMask() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 173 #endif
cassyarduino 0:e3fb1267e3c3 174 IPAddress ret;
cassyarduino 0:e3fb1267e3c3 175 uip_ipaddr_t a;
cassyarduino 0:e3fb1267e3c3 176 uip_getnetmask(a);
cassyarduino 0:e3fb1267e3c3 177 return ip_addr_uip(a);
cassyarduino 0:e3fb1267e3c3 178 }
cassyarduino 0:e3fb1267e3c3 179
cassyarduino 0:e3fb1267e3c3 180 IPAddress UIPEthernetClass::gatewayIP()
cassyarduino 0:e3fb1267e3c3 181 {
cassyarduino 0:e3fb1267e3c3 182 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 183 LogObject.uart_send_strln(F("UIPEthernetClass::gatewayIP() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 184 #endif
cassyarduino 0:e3fb1267e3c3 185 IPAddress ret;
cassyarduino 0:e3fb1267e3c3 186 uip_ipaddr_t a;
cassyarduino 0:e3fb1267e3c3 187 uip_getdraddr(a);
cassyarduino 0:e3fb1267e3c3 188 return ip_addr_uip(a);
cassyarduino 0:e3fb1267e3c3 189 }
cassyarduino 0:e3fb1267e3c3 190
cassyarduino 0:e3fb1267e3c3 191 IPAddress UIPEthernetClass::dnsServerIP()
cassyarduino 0:e3fb1267e3c3 192 {
cassyarduino 0:e3fb1267e3c3 193 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 194 LogObject.uart_send_strln(F("UIPEthernetClass::dnsServerIP() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 195 #endif
cassyarduino 0:e3fb1267e3c3 196 return _dnsServerAddress;
cassyarduino 0:e3fb1267e3c3 197 }
cassyarduino 0:e3fb1267e3c3 198
cassyarduino 0:e3fb1267e3c3 199 void
cassyarduino 0:e3fb1267e3c3 200 UIPEthernetClass::tick()
cassyarduino 0:e3fb1267e3c3 201 {
cassyarduino 0:e3fb1267e3c3 202 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 203 LogObject.uart_send_strln(F("UIPEthernetClass::tick() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 204 #endif
cassyarduino 0:e3fb1267e3c3 205 if (Enc28J60Network::geterevid()==0)
cassyarduino 0:e3fb1267e3c3 206 {
cassyarduino 0:e3fb1267e3c3 207 #if ACTLOGLEVEL>=LOG_ERR
cassyarduino 0:e3fb1267e3c3 208 LogObject.uart_send_strln(F("UIPEthernetClass::tick() ERROR:EREVID=0 -> Not found ENC28j60 device !!! Function ended !!!"));
cassyarduino 0:e3fb1267e3c3 209 #endif
cassyarduino 0:e3fb1267e3c3 210 return;
cassyarduino 0:e3fb1267e3c3 211 }
cassyarduino 0:e3fb1267e3c3 212 #if defined(ESP8266)
cassyarduino 0:e3fb1267e3c3 213 wdt_reset();
cassyarduino 0:e3fb1267e3c3 214 #endif
cassyarduino 0:e3fb1267e3c3 215 if (in_packet == NOBLOCK)
cassyarduino 0:e3fb1267e3c3 216 {
cassyarduino 0:e3fb1267e3c3 217 in_packet = Enc28J60Network::receivePacket();
cassyarduino 0:e3fb1267e3c3 218 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 219 if (in_packet != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 220 {
cassyarduino 0:e3fb1267e3c3 221 LogObject.uart_send_str(F("UIPEthernetClass::tick() DEBUG:receivePacket: "));
cassyarduino 0:e3fb1267e3c3 222 LogObject.uart_send_decln(in_packet);
cassyarduino 0:e3fb1267e3c3 223 }
cassyarduino 0:e3fb1267e3c3 224 #endif
cassyarduino 0:e3fb1267e3c3 225 }
cassyarduino 0:e3fb1267e3c3 226 if (in_packet != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 227 {
cassyarduino 0:e3fb1267e3c3 228 packetstate = UIPETHERNET_FREEPACKET;
cassyarduino 0:e3fb1267e3c3 229 uip_len = Enc28J60Network::blockSize(in_packet);
cassyarduino 0:e3fb1267e3c3 230 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 231 {
cassyarduino 0:e3fb1267e3c3 232 Enc28J60Network::readPacket(in_packet,0,(uint8_t*)uip_buf,UIP_BUFSIZE);
cassyarduino 0:e3fb1267e3c3 233 if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_IP))
cassyarduino 0:e3fb1267e3c3 234 {
cassyarduino 0:e3fb1267e3c3 235 uip_packet = in_packet; //required for upper_layer_checksum of in_packet!
cassyarduino 0:e3fb1267e3c3 236 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 237 LogObject.uart_send_str(F("UIPEthernetClass::tick() DEBUG:readPacket type IP, uip_len: "));
cassyarduino 0:e3fb1267e3c3 238 LogObject.uart_send_decln(uip_len);
cassyarduino 0:e3fb1267e3c3 239 #endif
cassyarduino 0:e3fb1267e3c3 240 uip_arp_ipin();
cassyarduino 0:e3fb1267e3c3 241 uip_input();
cassyarduino 0:e3fb1267e3c3 242 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 243 {
cassyarduino 0:e3fb1267e3c3 244 uip_arp_out();
cassyarduino 0:e3fb1267e3c3 245 network_send();
cassyarduino 0:e3fb1267e3c3 246 }
cassyarduino 0:e3fb1267e3c3 247 }
cassyarduino 0:e3fb1267e3c3 248 else if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_ARP))
cassyarduino 0:e3fb1267e3c3 249 {
cassyarduino 0:e3fb1267e3c3 250 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 251 LogObject.uart_send_str(F("UIPEthernetClass::tick() DEBUG:readPacket type ARP, uip_len: "));
cassyarduino 0:e3fb1267e3c3 252 LogObject.uart_send_decln(uip_len);
cassyarduino 0:e3fb1267e3c3 253 #endif
cassyarduino 0:e3fb1267e3c3 254 uip_arp_arpin();
cassyarduino 0:e3fb1267e3c3 255 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 256 {
cassyarduino 0:e3fb1267e3c3 257 network_send();
cassyarduino 0:e3fb1267e3c3 258 }
cassyarduino 0:e3fb1267e3c3 259 }
cassyarduino 0:e3fb1267e3c3 260 }
cassyarduino 0:e3fb1267e3c3 261 if (in_packet != NOBLOCK && (packetstate & UIPETHERNET_FREEPACKET))
cassyarduino 0:e3fb1267e3c3 262 {
cassyarduino 0:e3fb1267e3c3 263 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 264 LogObject.uart_send_str(F("UIPEthernetClass::tick() DEBUG:freeing packet: "));
cassyarduino 0:e3fb1267e3c3 265 LogObject.uart_send_decln(in_packet);
cassyarduino 0:e3fb1267e3c3 266 #endif
cassyarduino 0:e3fb1267e3c3 267 Enc28J60Network::freePacket();
cassyarduino 0:e3fb1267e3c3 268 in_packet = NOBLOCK;
cassyarduino 0:e3fb1267e3c3 269 }
cassyarduino 0:e3fb1267e3c3 270 }
cassyarduino 0:e3fb1267e3c3 271
cassyarduino 0:e3fb1267e3c3 272 unsigned long now = millis();
cassyarduino 0:e3fb1267e3c3 273
cassyarduino 0:e3fb1267e3c3 274 #if UIP_CLIENT_TIMER >= 0
cassyarduino 0:e3fb1267e3c3 275 bool periodic = (long)( now - periodic_timer ) >= 0;
cassyarduino 0:e3fb1267e3c3 276 for (int i = 0; i < UIP_CONNS; i++)
cassyarduino 0:e3fb1267e3c3 277 {
cassyarduino 0:e3fb1267e3c3 278 #else
cassyarduino 0:e3fb1267e3c3 279 if ((long)( now - periodic_timer ) >= 0)
cassyarduino 0:e3fb1267e3c3 280 {
cassyarduino 0:e3fb1267e3c3 281 periodic_timer = now + UIP_PERIODIC_TIMER;
cassyarduino 0:e3fb1267e3c3 282
cassyarduino 0:e3fb1267e3c3 283 for (int i = 0; i < UIP_CONNS; i++)
cassyarduino 0:e3fb1267e3c3 284 {
cassyarduino 0:e3fb1267e3c3 285 #endif
cassyarduino 0:e3fb1267e3c3 286
cassyarduino 0:e3fb1267e3c3 287 uip_conn = &uip_conns[i];
cassyarduino 0:e3fb1267e3c3 288
cassyarduino 0:e3fb1267e3c3 289 #if UIP_CLIENT_TIMER >= 0
cassyarduino 0:e3fb1267e3c3 290 if (periodic)
cassyarduino 0:e3fb1267e3c3 291 {
cassyarduino 0:e3fb1267e3c3 292 #endif
cassyarduino 0:e3fb1267e3c3 293
cassyarduino 0:e3fb1267e3c3 294 uip_process(UIP_TIMER);
cassyarduino 0:e3fb1267e3c3 295
cassyarduino 0:e3fb1267e3c3 296 #if UIP_CLIENT_TIMER >= 0
cassyarduino 0:e3fb1267e3c3 297 }
cassyarduino 0:e3fb1267e3c3 298 else
cassyarduino 0:e3fb1267e3c3 299 {
cassyarduino 0:e3fb1267e3c3 300 u8_t conntimer;
cassyarduino 0:e3fb1267e3c3 301 if (uip_conn!=NULL)
cassyarduino 0:e3fb1267e3c3 302 {
cassyarduino 0:e3fb1267e3c3 303 if (((uip_userdata_t*)uip_conn->appstate)!=NULL)
cassyarduino 0:e3fb1267e3c3 304 {
cassyarduino 0:e3fb1267e3c3 305 if ((long)( now - ((uip_userdata_t*)uip_conn->appstate)->timer) >= 0)
cassyarduino 0:e3fb1267e3c3 306 {
cassyarduino 0:e3fb1267e3c3 307 uip_process(UIP_POLL_REQUEST);
cassyarduino 0:e3fb1267e3c3 308 }
cassyarduino 0:e3fb1267e3c3 309 else
cassyarduino 0:e3fb1267e3c3 310 {
cassyarduino 0:e3fb1267e3c3 311 continue;
cassyarduino 0:e3fb1267e3c3 312 }
cassyarduino 0:e3fb1267e3c3 313 }
cassyarduino 0:e3fb1267e3c3 314 else
cassyarduino 0:e3fb1267e3c3 315 {
cassyarduino 0:e3fb1267e3c3 316 #if ACTLOGLEVEL>=LOG_DEBUG_V1
cassyarduino 0:e3fb1267e3c3 317 LogObject.uart_send_strln(F("UIPEthernetClass::tick() DEBUG_V1:((uip_userdata_t*)uip_conn->appstate) is NULL"));
cassyarduino 0:e3fb1267e3c3 318 #endif
cassyarduino 0:e3fb1267e3c3 319 if ((long)( now - ((uip_userdata_t*)uip_conn)->timer) >= 0)
cassyarduino 0:e3fb1267e3c3 320 {
cassyarduino 0:e3fb1267e3c3 321 uip_process(UIP_POLL_REQUEST);
cassyarduino 0:e3fb1267e3c3 322 }
cassyarduino 0:e3fb1267e3c3 323 else
cassyarduino 0:e3fb1267e3c3 324 {
cassyarduino 0:e3fb1267e3c3 325 continue;
cassyarduino 0:e3fb1267e3c3 326 }
cassyarduino 0:e3fb1267e3c3 327 }
cassyarduino 0:e3fb1267e3c3 328 }
cassyarduino 0:e3fb1267e3c3 329 else
cassyarduino 0:e3fb1267e3c3 330 {
cassyarduino 0:e3fb1267e3c3 331 #if ACTLOGLEVEL>=LOG_ERR
cassyarduino 0:e3fb1267e3c3 332 LogObject.uart_send_strln(F("UIPEthernetClass::tick() ERROR:uip_conn is NULL"));
cassyarduino 0:e3fb1267e3c3 333 #endif
cassyarduino 0:e3fb1267e3c3 334 continue;
cassyarduino 0:e3fb1267e3c3 335 }
cassyarduino 0:e3fb1267e3c3 336 }
cassyarduino 0:e3fb1267e3c3 337 #endif
cassyarduino 0:e3fb1267e3c3 338 // If the above function invocation resulted in data that
cassyarduino 0:e3fb1267e3c3 339 // should be sent out on the Enc28J60Network, the global variable
cassyarduino 0:e3fb1267e3c3 340 // uip_len is set to a value > 0.
cassyarduino 0:e3fb1267e3c3 341 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 342 {
cassyarduino 0:e3fb1267e3c3 343 uip_arp_out();
cassyarduino 0:e3fb1267e3c3 344 network_send();
cassyarduino 0:e3fb1267e3c3 345 }
cassyarduino 0:e3fb1267e3c3 346 }
cassyarduino 0:e3fb1267e3c3 347 #if UIP_CLIENT_TIMER >= 0
cassyarduino 0:e3fb1267e3c3 348 if (periodic)
cassyarduino 0:e3fb1267e3c3 349 {
cassyarduino 0:e3fb1267e3c3 350 periodic_timer = now + UIP_PERIODIC_TIMER;
cassyarduino 0:e3fb1267e3c3 351 #endif
cassyarduino 0:e3fb1267e3c3 352 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 353 for (int i = 0; i < UIP_UDP_CONNS; i++)
cassyarduino 0:e3fb1267e3c3 354 {
cassyarduino 0:e3fb1267e3c3 355 uip_udp_periodic(i);
cassyarduino 0:e3fb1267e3c3 356 // If the above function invocation resulted in data that
cassyarduino 0:e3fb1267e3c3 357 // should be sent out on the Enc28J60Network, the global variable
cassyarduino 0:e3fb1267e3c3 358 // uip_len is set to a value > 0. */
cassyarduino 0:e3fb1267e3c3 359 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 360 {
cassyarduino 0:e3fb1267e3c3 361 UIPUDP::_send((uip_udp_userdata_t *)(uip_udp_conns[i].appstate));
cassyarduino 0:e3fb1267e3c3 362 }
cassyarduino 0:e3fb1267e3c3 363 }
cassyarduino 0:e3fb1267e3c3 364 #endif /* UIP_UDP */
cassyarduino 0:e3fb1267e3c3 365 }
cassyarduino 0:e3fb1267e3c3 366 }
cassyarduino 0:e3fb1267e3c3 367
cassyarduino 0:e3fb1267e3c3 368 bool UIPEthernetClass::network_send()
cassyarduino 0:e3fb1267e3c3 369 {
cassyarduino 0:e3fb1267e3c3 370 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 371 LogObject.uart_send_strln(F("UIPEthernetClass::network_send() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 372 #endif
cassyarduino 0:e3fb1267e3c3 373 if (packetstate & UIPETHERNET_SENDPACKET)
cassyarduino 0:e3fb1267e3c3 374 {
cassyarduino 0:e3fb1267e3c3 375 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 376 LogObject.uart_send_str(F("UIPEthernetClass::network_send() DEBUG:uip_packet: "));
cassyarduino 0:e3fb1267e3c3 377 LogObject.uart_send_dec(uip_packet);
cassyarduino 0:e3fb1267e3c3 378 LogObject.uart_send_str(F(", hdrlen: "));
cassyarduino 0:e3fb1267e3c3 379 LogObject.uart_send_decln(uip_hdrlen);
cassyarduino 0:e3fb1267e3c3 380 #endif
cassyarduino 0:e3fb1267e3c3 381 Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_hdrlen);
cassyarduino 0:e3fb1267e3c3 382 packetstate &= ~ UIPETHERNET_SENDPACKET;
cassyarduino 0:e3fb1267e3c3 383 goto sendandfree;
cassyarduino 0:e3fb1267e3c3 384 }
cassyarduino 0:e3fb1267e3c3 385 uip_packet = Enc28J60Network::allocBlock(uip_len);
cassyarduino 0:e3fb1267e3c3 386 if (uip_packet != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 387 {
cassyarduino 0:e3fb1267e3c3 388 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 389 LogObject.uart_send_str(F("UIPEthernetClass::network_send() DEBUG:uip_buf (uip_len): "));
cassyarduino 0:e3fb1267e3c3 390 LogObject.uart_send_dec(uip_len);
cassyarduino 0:e3fb1267e3c3 391 LogObject.uart_send_str(F(", packet: "));
cassyarduino 0:e3fb1267e3c3 392 LogObject.uart_send_decln(uip_packet);
cassyarduino 0:e3fb1267e3c3 393 #endif
cassyarduino 0:e3fb1267e3c3 394 Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_len);
cassyarduino 0:e3fb1267e3c3 395 goto sendandfree;
cassyarduino 0:e3fb1267e3c3 396 }
cassyarduino 0:e3fb1267e3c3 397 return false;
cassyarduino 0:e3fb1267e3c3 398 sendandfree:
cassyarduino 0:e3fb1267e3c3 399 Enc28J60Network::sendPacket(uip_packet);
cassyarduino 0:e3fb1267e3c3 400 Enc28J60Network::freeBlock(uip_packet);
cassyarduino 0:e3fb1267e3c3 401 uip_packet = NOBLOCK;
cassyarduino 0:e3fb1267e3c3 402 return true;
cassyarduino 0:e3fb1267e3c3 403 }
cassyarduino 0:e3fb1267e3c3 404
cassyarduino 0:e3fb1267e3c3 405 void UIPEthernetClass::init(const uint8_t* mac) {
cassyarduino 0:e3fb1267e3c3 406 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 407 LogObject.uart_send_strln(F("UIPEthernetClass::init(const uint8_t* mac) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 408 #endif
cassyarduino 0:e3fb1267e3c3 409 periodic_timer = millis() + UIP_PERIODIC_TIMER;
cassyarduino 0:e3fb1267e3c3 410
cassyarduino 0:e3fb1267e3c3 411 Enc28J60Network::init((uint8_t*)mac);
cassyarduino 0:e3fb1267e3c3 412 uip_seteth_addr(mac);
cassyarduino 0:e3fb1267e3c3 413
cassyarduino 0:e3fb1267e3c3 414 uip_init();
cassyarduino 0:e3fb1267e3c3 415 uip_arp_init();
cassyarduino 0:e3fb1267e3c3 416 }
cassyarduino 0:e3fb1267e3c3 417
cassyarduino 0:e3fb1267e3c3 418 void UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) {
cassyarduino 0:e3fb1267e3c3 419 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 420 LogObject.uart_send_strln(F("UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 421 #endif
cassyarduino 0:e3fb1267e3c3 422 uip_ipaddr_t ipaddr;
cassyarduino 0:e3fb1267e3c3 423
cassyarduino 0:e3fb1267e3c3 424 uip_ip_addr(ipaddr, ip);
cassyarduino 0:e3fb1267e3c3 425 uip_sethostaddr(ipaddr);
cassyarduino 0:e3fb1267e3c3 426
cassyarduino 0:e3fb1267e3c3 427 uip_ip_addr(ipaddr, gateway);
cassyarduino 0:e3fb1267e3c3 428 uip_setdraddr(ipaddr);
cassyarduino 0:e3fb1267e3c3 429
cassyarduino 0:e3fb1267e3c3 430 uip_ip_addr(ipaddr, subnet);
cassyarduino 0:e3fb1267e3c3 431 uip_setnetmask(ipaddr);
cassyarduino 0:e3fb1267e3c3 432
cassyarduino 0:e3fb1267e3c3 433 _dnsServerAddress = dns;
cassyarduino 0:e3fb1267e3c3 434 }
cassyarduino 0:e3fb1267e3c3 435
cassyarduino 0:e3fb1267e3c3 436 UIPEthernetClass UIPEthernet;
cassyarduino 0:e3fb1267e3c3 437
cassyarduino 0:e3fb1267e3c3 438 /*---------------------------------------------------------------------------*/
cassyarduino 0:e3fb1267e3c3 439 uint16_t
cassyarduino 0:e3fb1267e3c3 440 UIPEthernetClass::chksum(uint16_t sum, const uint8_t *data, uint16_t len)
cassyarduino 0:e3fb1267e3c3 441 {
cassyarduino 0:e3fb1267e3c3 442 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 443 LogObject.uart_send_strln(F("UIPEthernetClass::chksum(uint16_t sum, const uint8_t *data, uint16_t len) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 444 #endif
cassyarduino 0:e3fb1267e3c3 445 uint16_t t;
cassyarduino 0:e3fb1267e3c3 446 const uint8_t *dataptr;
cassyarduino 0:e3fb1267e3c3 447 const uint8_t *last_byte;
cassyarduino 0:e3fb1267e3c3 448
cassyarduino 0:e3fb1267e3c3 449 dataptr = data;
cassyarduino 0:e3fb1267e3c3 450 last_byte = data + len - 1;
cassyarduino 0:e3fb1267e3c3 451
cassyarduino 0:e3fb1267e3c3 452 while(dataptr < last_byte) { /* At least two more bytes */
cassyarduino 0:e3fb1267e3c3 453 t = (dataptr[0] << 8) + dataptr[1];
cassyarduino 0:e3fb1267e3c3 454 sum += t;
cassyarduino 0:e3fb1267e3c3 455 if(sum < t) {
cassyarduino 0:e3fb1267e3c3 456 sum++; /* carry */
cassyarduino 0:e3fb1267e3c3 457 }
cassyarduino 0:e3fb1267e3c3 458 dataptr += 2;
cassyarduino 0:e3fb1267e3c3 459 }
cassyarduino 0:e3fb1267e3c3 460
cassyarduino 0:e3fb1267e3c3 461 if(dataptr == last_byte) {
cassyarduino 0:e3fb1267e3c3 462 t = (dataptr[0] << 8) + 0;
cassyarduino 0:e3fb1267e3c3 463 sum += t;
cassyarduino 0:e3fb1267e3c3 464 if(sum < t) {
cassyarduino 0:e3fb1267e3c3 465 sum++; /* carry */
cassyarduino 0:e3fb1267e3c3 466 }
cassyarduino 0:e3fb1267e3c3 467 }
cassyarduino 0:e3fb1267e3c3 468
cassyarduino 0:e3fb1267e3c3 469 /* Return sum in host byte order. */
cassyarduino 0:e3fb1267e3c3 470 return sum;
cassyarduino 0:e3fb1267e3c3 471 }
cassyarduino 0:e3fb1267e3c3 472
cassyarduino 0:e3fb1267e3c3 473 /*---------------------------------------------------------------------------*/
cassyarduino 0:e3fb1267e3c3 474
cassyarduino 0:e3fb1267e3c3 475 uint16_t
cassyarduino 0:e3fb1267e3c3 476 UIPEthernetClass::ipchksum(void)
cassyarduino 0:e3fb1267e3c3 477 {
cassyarduino 0:e3fb1267e3c3 478 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 479 LogObject.uart_send_strln(F("UIPEthernetClass::ipchksum(void) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 480 #endif
cassyarduino 0:e3fb1267e3c3 481 uint16_t sum;
cassyarduino 0:e3fb1267e3c3 482
cassyarduino 0:e3fb1267e3c3 483 sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
cassyarduino 0:e3fb1267e3c3 484 return (sum == 0) ? 0xffff : htons(sum);
cassyarduino 0:e3fb1267e3c3 485 }
cassyarduino 0:e3fb1267e3c3 486
cassyarduino 0:e3fb1267e3c3 487 /*---------------------------------------------------------------------------*/
cassyarduino 0:e3fb1267e3c3 488 uint16_t
cassyarduino 0:e3fb1267e3c3 489 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 490 UIPEthernetClass::upper_layer_chksum(uint8_t proto)
cassyarduino 0:e3fb1267e3c3 491 #else
cassyarduino 0:e3fb1267e3c3 492 uip_tcpchksum(void)
cassyarduino 0:e3fb1267e3c3 493 #endif
cassyarduino 0:e3fb1267e3c3 494 {
cassyarduino 0:e3fb1267e3c3 495 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 496 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 497 LogObject.uart_send_strln(F("UIPEthernetClass::upper_layer_chksum(uint8_t proto) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 498 #else
cassyarduino 0:e3fb1267e3c3 499 LogObject.uart_send_strln(F("uip_tcpchksum(void) INFO:Function started"));
cassyarduino 0:e3fb1267e3c3 500 #endif
cassyarduino 0:e3fb1267e3c3 501 #endif
cassyarduino 0:e3fb1267e3c3 502 uint16_t upper_layer_len;
cassyarduino 0:e3fb1267e3c3 503 uint16_t sum;
cassyarduino 0:e3fb1267e3c3 504
cassyarduino 0:e3fb1267e3c3 505 #if UIP_CONF_IPV6
cassyarduino 0:e3fb1267e3c3 506 upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);
cassyarduino 0:e3fb1267e3c3 507 #else /* UIP_CONF_IPV6 */
cassyarduino 0:e3fb1267e3c3 508 upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
cassyarduino 0:e3fb1267e3c3 509 #endif /* UIP_CONF_IPV6 */
cassyarduino 0:e3fb1267e3c3 510
cassyarduino 0:e3fb1267e3c3 511 /* First sum pseudoheader. */
cassyarduino 0:e3fb1267e3c3 512
cassyarduino 0:e3fb1267e3c3 513 /* IP protocol and length fields. This addition cannot carry. */
cassyarduino 0:e3fb1267e3c3 514 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 515 sum = upper_layer_len + proto;
cassyarduino 0:e3fb1267e3c3 516 #else
cassyarduino 0:e3fb1267e3c3 517 sum = upper_layer_len + UIP_PROTO_TCP;
cassyarduino 0:e3fb1267e3c3 518 #endif
cassyarduino 0:e3fb1267e3c3 519 /* Sum IP source and destination addresses. */
cassyarduino 0:e3fb1267e3c3 520 sum = UIPEthernetClass::chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
cassyarduino 0:e3fb1267e3c3 521
cassyarduino 0:e3fb1267e3c3 522 uint8_t upper_layer_memlen;
cassyarduino 0:e3fb1267e3c3 523 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 524 switch(proto)
cassyarduino 0:e3fb1267e3c3 525 {
cassyarduino 0:e3fb1267e3c3 526 // case UIP_PROTO_ICMP:
cassyarduino 0:e3fb1267e3c3 527 // case UIP_PROTO_ICMP6:
cassyarduino 0:e3fb1267e3c3 528 // upper_layer_memlen = upper_layer_len;
cassyarduino 0:e3fb1267e3c3 529 // break;
cassyarduino 0:e3fb1267e3c3 530 case UIP_PROTO_UDP:
cassyarduino 0:e3fb1267e3c3 531 upper_layer_memlen = UIP_UDPH_LEN;
cassyarduino 0:e3fb1267e3c3 532 break;
cassyarduino 0:e3fb1267e3c3 533 default:
cassyarduino 0:e3fb1267e3c3 534 // case UIP_PROTO_TCP:
cassyarduino 0:e3fb1267e3c3 535 #endif
cassyarduino 0:e3fb1267e3c3 536 upper_layer_memlen = (BUF->tcpoffset >> 4) << 2;
cassyarduino 0:e3fb1267e3c3 537 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 538 break;
cassyarduino 0:e3fb1267e3c3 539 }
cassyarduino 0:e3fb1267e3c3 540 #endif
cassyarduino 0:e3fb1267e3c3 541 sum = UIPEthernetClass::chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_memlen);
cassyarduino 0:e3fb1267e3c3 542 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 543 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 544 LogObject.uart_send_str(F("UIPEthernetClass::upper_layer_chksum(uint8_t proto) DEBUG:uip_buf["));
cassyarduino 0:e3fb1267e3c3 545 #else
cassyarduino 0:e3fb1267e3c3 546 LogObject.uart_send_str(F("uip_tcpchksum(void) DEBUG:uip_buf["));
cassyarduino 0:e3fb1267e3c3 547 #endif
cassyarduino 0:e3fb1267e3c3 548 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN);
cassyarduino 0:e3fb1267e3c3 549 LogObject.uart_send_str(F("-"));
cassyarduino 0:e3fb1267e3c3 550 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
cassyarduino 0:e3fb1267e3c3 551 LogObject.uart_send_str(F("]: "));
cassyarduino 0:e3fb1267e3c3 552 LogObject.uart_send_hexln(htons(sum));
cassyarduino 0:e3fb1267e3c3 553 #endif
cassyarduino 0:e3fb1267e3c3 554 if (upper_layer_memlen < upper_layer_len)
cassyarduino 0:e3fb1267e3c3 555 {
cassyarduino 0:e3fb1267e3c3 556 sum = Enc28J60Network::chksum(
cassyarduino 0:e3fb1267e3c3 557 sum,
cassyarduino 0:e3fb1267e3c3 558 UIPEthernetClass::uip_packet,
cassyarduino 0:e3fb1267e3c3 559 UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen,
cassyarduino 0:e3fb1267e3c3 560 upper_layer_len - upper_layer_memlen
cassyarduino 0:e3fb1267e3c3 561 );
cassyarduino 0:e3fb1267e3c3 562 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 563 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 564 LogObject.uart_send_str(F("UIPEthernetClass::upper_layer_chksum(uint8_t proto) DEBUG:uip_packet("));
cassyarduino 0:e3fb1267e3c3 565 #else
cassyarduino 0:e3fb1267e3c3 566 LogObject.uart_send_str(F("uip_tcpchksum(void) DEBUG:uip_packet("));
cassyarduino 0:e3fb1267e3c3 567 #endif
cassyarduino 0:e3fb1267e3c3 568 LogObject.uart_send_dec(uip_packet);
cassyarduino 0:e3fb1267e3c3 569 LogObject.uart_send_str(F(")["));
cassyarduino 0:e3fb1267e3c3 570 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
cassyarduino 0:e3fb1267e3c3 571 LogObject.uart_send_str(F("-"));
cassyarduino 0:e3fb1267e3c3 572 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_len);
cassyarduino 0:e3fb1267e3c3 573 LogObject.uart_send_str(F("]: "));
cassyarduino 0:e3fb1267e3c3 574 LogObject.uart_send_hexln(htons(sum));
cassyarduino 0:e3fb1267e3c3 575 #endif
cassyarduino 0:e3fb1267e3c3 576 }
cassyarduino 0:e3fb1267e3c3 577 return (sum == 0) ? 0xffff : htons(sum);
cassyarduino 0:e3fb1267e3c3 578 }
cassyarduino 0:e3fb1267e3c3 579
cassyarduino 0:e3fb1267e3c3 580 uint16_t
cassyarduino 0:e3fb1267e3c3 581 uip_ipchksum(void)
cassyarduino 0:e3fb1267e3c3 582 {
cassyarduino 0:e3fb1267e3c3 583 return UIPEthernet.ipchksum();
cassyarduino 0:e3fb1267e3c3 584 }
cassyarduino 0:e3fb1267e3c3 585
cassyarduino 0:e3fb1267e3c3 586 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 587 uint16_t
cassyarduino 0:e3fb1267e3c3 588 uip_tcpchksum(void)
cassyarduino 0:e3fb1267e3c3 589 {
cassyarduino 0:e3fb1267e3c3 590 uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_TCP);
cassyarduino 0:e3fb1267e3c3 591 return sum;
cassyarduino 0:e3fb1267e3c3 592 }
cassyarduino 0:e3fb1267e3c3 593
cassyarduino 0:e3fb1267e3c3 594 uint16_t
cassyarduino 0:e3fb1267e3c3 595 uip_udpchksum(void)
cassyarduino 0:e3fb1267e3c3 596 {
cassyarduino 0:e3fb1267e3c3 597 uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_UDP);
cassyarduino 0:e3fb1267e3c3 598 return sum;
cassyarduino 0:e3fb1267e3c3 599 }
cassyarduino 0:e3fb1267e3c3 600 #endif