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 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 39:deeb00b81cc9 35 #include "utility/uipopt.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 unsigned long UIPEthernetClass::periodic_timer;
cassyarduino 0:e3fb1267e3c3 49
cassyarduino 33:7ba5d53df0f2 50 IPAddress UIPEthernetClass::_dnsServerAddress;
cassyarduino 33:7ba5d53df0f2 51 #if UIP_UDP
cassyarduino 33:7ba5d53df0f2 52 DhcpClass* UIPEthernetClass::_dhcp(NULL);
cassyarduino 33:7ba5d53df0f2 53 static DhcpClass s_dhcp; // Placing this instance here is saving 40K to final *.bin (see bug below)
cassyarduino 33:7ba5d53df0f2 54 #endif
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 if (uip_conn!=NULL)
cassyarduino 0:e3fb1267e3c3 301 {
cassyarduino 0:e3fb1267e3c3 302 if (((uip_userdata_t*)uip_conn->appstate)!=NULL)
cassyarduino 0:e3fb1267e3c3 303 {
cassyarduino 0:e3fb1267e3c3 304 if ((long)( now - ((uip_userdata_t*)uip_conn->appstate)->timer) >= 0)
cassyarduino 0:e3fb1267e3c3 305 {
cassyarduino 0:e3fb1267e3c3 306 uip_process(UIP_POLL_REQUEST);
cassyarduino 0:e3fb1267e3c3 307 }
cassyarduino 0:e3fb1267e3c3 308 else
cassyarduino 0:e3fb1267e3c3 309 {
cassyarduino 0:e3fb1267e3c3 310 continue;
cassyarduino 0:e3fb1267e3c3 311 }
cassyarduino 0:e3fb1267e3c3 312 }
cassyarduino 0:e3fb1267e3c3 313 else
cassyarduino 0:e3fb1267e3c3 314 {
cassyarduino 21:c4439c50a5af 315 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 21:c4439c50a5af 316 LogObject.uart_send_strln(F("UIPEthernetClass::tick() DEBUG_V3:((uip_userdata_t*)uip_conn->appstate) is NULL"));
cassyarduino 0:e3fb1267e3c3 317 #endif
cassyarduino 0:e3fb1267e3c3 318 if ((long)( now - ((uip_userdata_t*)uip_conn)->timer) >= 0)
cassyarduino 0:e3fb1267e3c3 319 {
cassyarduino 0:e3fb1267e3c3 320 uip_process(UIP_POLL_REQUEST);
cassyarduino 0:e3fb1267e3c3 321 }
cassyarduino 0:e3fb1267e3c3 322 else
cassyarduino 0:e3fb1267e3c3 323 {
cassyarduino 0:e3fb1267e3c3 324 continue;
cassyarduino 0:e3fb1267e3c3 325 }
cassyarduino 0:e3fb1267e3c3 326 }
cassyarduino 0:e3fb1267e3c3 327 }
cassyarduino 0:e3fb1267e3c3 328 else
cassyarduino 0:e3fb1267e3c3 329 {
cassyarduino 0:e3fb1267e3c3 330 #if ACTLOGLEVEL>=LOG_ERR
cassyarduino 0:e3fb1267e3c3 331 LogObject.uart_send_strln(F("UIPEthernetClass::tick() ERROR:uip_conn is NULL"));
cassyarduino 0:e3fb1267e3c3 332 #endif
cassyarduino 0:e3fb1267e3c3 333 continue;
cassyarduino 0:e3fb1267e3c3 334 }
cassyarduino 0:e3fb1267e3c3 335 }
cassyarduino 0:e3fb1267e3c3 336 #endif
cassyarduino 0:e3fb1267e3c3 337 // If the above function invocation resulted in data that
cassyarduino 0:e3fb1267e3c3 338 // should be sent out on the Enc28J60Network, the global variable
cassyarduino 0:e3fb1267e3c3 339 // uip_len is set to a value > 0.
cassyarduino 0:e3fb1267e3c3 340 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 341 {
cassyarduino 0:e3fb1267e3c3 342 uip_arp_out();
cassyarduino 0:e3fb1267e3c3 343 network_send();
cassyarduino 0:e3fb1267e3c3 344 }
cassyarduino 0:e3fb1267e3c3 345 }
cassyarduino 0:e3fb1267e3c3 346 #if UIP_CLIENT_TIMER >= 0
cassyarduino 0:e3fb1267e3c3 347 if (periodic)
cassyarduino 0:e3fb1267e3c3 348 {
cassyarduino 0:e3fb1267e3c3 349 periodic_timer = now + UIP_PERIODIC_TIMER;
cassyarduino 0:e3fb1267e3c3 350 #endif
cassyarduino 0:e3fb1267e3c3 351 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 352 for (int i = 0; i < UIP_UDP_CONNS; i++)
cassyarduino 0:e3fb1267e3c3 353 {
cassyarduino 0:e3fb1267e3c3 354 uip_udp_periodic(i);
cassyarduino 0:e3fb1267e3c3 355 // If the above function invocation resulted in data that
cassyarduino 0:e3fb1267e3c3 356 // should be sent out on the Enc28J60Network, the global variable
cassyarduino 0:e3fb1267e3c3 357 // uip_len is set to a value > 0. */
cassyarduino 0:e3fb1267e3c3 358 if (uip_len > 0)
cassyarduino 0:e3fb1267e3c3 359 {
cassyarduino 0:e3fb1267e3c3 360 UIPUDP::_send((uip_udp_userdata_t *)(uip_udp_conns[i].appstate));
cassyarduino 0:e3fb1267e3c3 361 }
cassyarduino 0:e3fb1267e3c3 362 }
cassyarduino 0:e3fb1267e3c3 363 #endif /* UIP_UDP */
cassyarduino 0:e3fb1267e3c3 364 }
cassyarduino 0:e3fb1267e3c3 365 }
cassyarduino 0:e3fb1267e3c3 366
cassyarduino 0:e3fb1267e3c3 367 bool UIPEthernetClass::network_send()
cassyarduino 0:e3fb1267e3c3 368 {
cassyarduino 0:e3fb1267e3c3 369 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 370 LogObject.uart_send_strln(F("UIPEthernetClass::network_send() DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 371 #endif
cassyarduino 0:e3fb1267e3c3 372 if (packetstate & UIPETHERNET_SENDPACKET)
cassyarduino 0:e3fb1267e3c3 373 {
cassyarduino 0:e3fb1267e3c3 374 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 375 LogObject.uart_send_str(F("UIPEthernetClass::network_send() DEBUG:uip_packet: "));
cassyarduino 0:e3fb1267e3c3 376 LogObject.uart_send_dec(uip_packet);
cassyarduino 0:e3fb1267e3c3 377 LogObject.uart_send_str(F(", hdrlen: "));
cassyarduino 0:e3fb1267e3c3 378 LogObject.uart_send_decln(uip_hdrlen);
cassyarduino 0:e3fb1267e3c3 379 #endif
cassyarduino 0:e3fb1267e3c3 380 Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_hdrlen);
cassyarduino 0:e3fb1267e3c3 381 packetstate &= ~ UIPETHERNET_SENDPACKET;
cassyarduino 0:e3fb1267e3c3 382 goto sendandfree;
cassyarduino 0:e3fb1267e3c3 383 }
cassyarduino 0:e3fb1267e3c3 384 uip_packet = Enc28J60Network::allocBlock(uip_len);
cassyarduino 0:e3fb1267e3c3 385 if (uip_packet != NOBLOCK)
cassyarduino 0:e3fb1267e3c3 386 {
cassyarduino 0:e3fb1267e3c3 387 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 388 LogObject.uart_send_str(F("UIPEthernetClass::network_send() DEBUG:uip_buf (uip_len): "));
cassyarduino 0:e3fb1267e3c3 389 LogObject.uart_send_dec(uip_len);
cassyarduino 0:e3fb1267e3c3 390 LogObject.uart_send_str(F(", packet: "));
cassyarduino 0:e3fb1267e3c3 391 LogObject.uart_send_decln(uip_packet);
cassyarduino 0:e3fb1267e3c3 392 #endif
cassyarduino 0:e3fb1267e3c3 393 Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_len);
cassyarduino 0:e3fb1267e3c3 394 goto sendandfree;
cassyarduino 0:e3fb1267e3c3 395 }
cassyarduino 0:e3fb1267e3c3 396 return false;
cassyarduino 0:e3fb1267e3c3 397 sendandfree:
cassyarduino 0:e3fb1267e3c3 398 Enc28J60Network::sendPacket(uip_packet);
cassyarduino 0:e3fb1267e3c3 399 Enc28J60Network::freeBlock(uip_packet);
cassyarduino 0:e3fb1267e3c3 400 uip_packet = NOBLOCK;
cassyarduino 0:e3fb1267e3c3 401 return true;
cassyarduino 0:e3fb1267e3c3 402 }
cassyarduino 0:e3fb1267e3c3 403
cassyarduino 0:e3fb1267e3c3 404 void UIPEthernetClass::init(const uint8_t* mac) {
cassyarduino 0:e3fb1267e3c3 405 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 406 LogObject.uart_send_strln(F("UIPEthernetClass::init(const uint8_t* mac) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 407 #endif
cassyarduino 0:e3fb1267e3c3 408 periodic_timer = millis() + UIP_PERIODIC_TIMER;
cassyarduino 0:e3fb1267e3c3 409
cassyarduino 0:e3fb1267e3c3 410 Enc28J60Network::init((uint8_t*)mac);
cassyarduino 0:e3fb1267e3c3 411 uip_seteth_addr(mac);
cassyarduino 0:e3fb1267e3c3 412
cassyarduino 0:e3fb1267e3c3 413 uip_init();
cassyarduino 0:e3fb1267e3c3 414 uip_arp_init();
cassyarduino 0:e3fb1267e3c3 415 }
cassyarduino 0:e3fb1267e3c3 416
cassyarduino 0:e3fb1267e3c3 417 void UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) {
cassyarduino 0:e3fb1267e3c3 418 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 419 LogObject.uart_send_strln(F("UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 420 #endif
cassyarduino 0:e3fb1267e3c3 421 uip_ipaddr_t ipaddr;
cassyarduino 0:e3fb1267e3c3 422
cassyarduino 0:e3fb1267e3c3 423 uip_ip_addr(ipaddr, ip);
cassyarduino 0:e3fb1267e3c3 424 uip_sethostaddr(ipaddr);
cassyarduino 0:e3fb1267e3c3 425
cassyarduino 0:e3fb1267e3c3 426 uip_ip_addr(ipaddr, gateway);
cassyarduino 0:e3fb1267e3c3 427 uip_setdraddr(ipaddr);
cassyarduino 0:e3fb1267e3c3 428
cassyarduino 0:e3fb1267e3c3 429 uip_ip_addr(ipaddr, subnet);
cassyarduino 0:e3fb1267e3c3 430 uip_setnetmask(ipaddr);
cassyarduino 0:e3fb1267e3c3 431
cassyarduino 0:e3fb1267e3c3 432 _dnsServerAddress = dns;
cassyarduino 0:e3fb1267e3c3 433 }
cassyarduino 0:e3fb1267e3c3 434
cassyarduino 0:e3fb1267e3c3 435 UIPEthernetClass UIPEthernet;
cassyarduino 0:e3fb1267e3c3 436
cassyarduino 0:e3fb1267e3c3 437 /*---------------------------------------------------------------------------*/
cassyarduino 0:e3fb1267e3c3 438 uint16_t
cassyarduino 0:e3fb1267e3c3 439 UIPEthernetClass::chksum(uint16_t sum, const uint8_t *data, uint16_t len)
cassyarduino 0:e3fb1267e3c3 440 {
cassyarduino 0:e3fb1267e3c3 441 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 442 LogObject.uart_send_strln(F("UIPEthernetClass::chksum(uint16_t sum, const uint8_t *data, uint16_t len) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 443 #endif
cassyarduino 0:e3fb1267e3c3 444 uint16_t t;
cassyarduino 0:e3fb1267e3c3 445 const uint8_t *dataptr;
cassyarduino 0:e3fb1267e3c3 446 const uint8_t *last_byte;
cassyarduino 0:e3fb1267e3c3 447
cassyarduino 0:e3fb1267e3c3 448 dataptr = data;
cassyarduino 0:e3fb1267e3c3 449 last_byte = data + len - 1;
cassyarduino 0:e3fb1267e3c3 450
cassyarduino 0:e3fb1267e3c3 451 while(dataptr < last_byte) { /* At least two more bytes */
cassyarduino 0:e3fb1267e3c3 452 t = (dataptr[0] << 8) + dataptr[1];
cassyarduino 0:e3fb1267e3c3 453 sum += t;
cassyarduino 0:e3fb1267e3c3 454 if(sum < t) {
cassyarduino 0:e3fb1267e3c3 455 sum++; /* carry */
cassyarduino 0:e3fb1267e3c3 456 }
cassyarduino 0:e3fb1267e3c3 457 dataptr += 2;
cassyarduino 0:e3fb1267e3c3 458 }
cassyarduino 0:e3fb1267e3c3 459
cassyarduino 0:e3fb1267e3c3 460 if(dataptr == last_byte) {
cassyarduino 0:e3fb1267e3c3 461 t = (dataptr[0] << 8) + 0;
cassyarduino 0:e3fb1267e3c3 462 sum += t;
cassyarduino 0:e3fb1267e3c3 463 if(sum < t) {
cassyarduino 0:e3fb1267e3c3 464 sum++; /* carry */
cassyarduino 0:e3fb1267e3c3 465 }
cassyarduino 0:e3fb1267e3c3 466 }
cassyarduino 0:e3fb1267e3c3 467
cassyarduino 0:e3fb1267e3c3 468 /* Return sum in host byte order. */
cassyarduino 0:e3fb1267e3c3 469 return sum;
cassyarduino 0:e3fb1267e3c3 470 }
cassyarduino 0:e3fb1267e3c3 471
cassyarduino 0:e3fb1267e3c3 472 /*---------------------------------------------------------------------------*/
cassyarduino 0:e3fb1267e3c3 473
cassyarduino 0:e3fb1267e3c3 474 uint16_t
cassyarduino 0:e3fb1267e3c3 475 UIPEthernetClass::ipchksum(void)
cassyarduino 0:e3fb1267e3c3 476 {
cassyarduino 0:e3fb1267e3c3 477 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 478 LogObject.uart_send_strln(F("UIPEthernetClass::ipchksum(void) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 479 #endif
cassyarduino 0:e3fb1267e3c3 480 uint16_t sum;
cassyarduino 0:e3fb1267e3c3 481
cassyarduino 0:e3fb1267e3c3 482 sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
cassyarduino 0:e3fb1267e3c3 483 return (sum == 0) ? 0xffff : htons(sum);
cassyarduino 0:e3fb1267e3c3 484 }
cassyarduino 0:e3fb1267e3c3 485
cassyarduino 0:e3fb1267e3c3 486 /*---------------------------------------------------------------------------*/
cassyarduino 0:e3fb1267e3c3 487 uint16_t
cassyarduino 0:e3fb1267e3c3 488 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 489 UIPEthernetClass::upper_layer_chksum(uint8_t proto)
cassyarduino 0:e3fb1267e3c3 490 #else
cassyarduino 0:e3fb1267e3c3 491 uip_tcpchksum(void)
cassyarduino 0:e3fb1267e3c3 492 #endif
cassyarduino 0:e3fb1267e3c3 493 {
cassyarduino 0:e3fb1267e3c3 494 #if ACTLOGLEVEL>=LOG_DEBUG_V3
cassyarduino 0:e3fb1267e3c3 495 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 496 LogObject.uart_send_strln(F("UIPEthernetClass::upper_layer_chksum(uint8_t proto) DEBUG_V3:Function started"));
cassyarduino 0:e3fb1267e3c3 497 #else
cassyarduino 0:e3fb1267e3c3 498 LogObject.uart_send_strln(F("uip_tcpchksum(void) INFO:Function started"));
cassyarduino 0:e3fb1267e3c3 499 #endif
cassyarduino 0:e3fb1267e3c3 500 #endif
cassyarduino 0:e3fb1267e3c3 501 uint16_t upper_layer_len;
cassyarduino 0:e3fb1267e3c3 502 uint16_t sum;
cassyarduino 0:e3fb1267e3c3 503
cassyarduino 0:e3fb1267e3c3 504 #if UIP_CONF_IPV6
cassyarduino 0:e3fb1267e3c3 505 upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);
cassyarduino 0:e3fb1267e3c3 506 #else /* UIP_CONF_IPV6 */
cassyarduino 0:e3fb1267e3c3 507 upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
cassyarduino 0:e3fb1267e3c3 508 #endif /* UIP_CONF_IPV6 */
cassyarduino 0:e3fb1267e3c3 509
cassyarduino 0:e3fb1267e3c3 510 /* First sum pseudoheader. */
cassyarduino 0:e3fb1267e3c3 511
cassyarduino 0:e3fb1267e3c3 512 /* IP protocol and length fields. This addition cannot carry. */
cassyarduino 0:e3fb1267e3c3 513 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 514 sum = upper_layer_len + proto;
cassyarduino 0:e3fb1267e3c3 515 #else
cassyarduino 0:e3fb1267e3c3 516 sum = upper_layer_len + UIP_PROTO_TCP;
cassyarduino 0:e3fb1267e3c3 517 #endif
cassyarduino 0:e3fb1267e3c3 518 /* Sum IP source and destination addresses. */
cassyarduino 0:e3fb1267e3c3 519 sum = UIPEthernetClass::chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
cassyarduino 0:e3fb1267e3c3 520
cassyarduino 0:e3fb1267e3c3 521 uint8_t upper_layer_memlen;
cassyarduino 0:e3fb1267e3c3 522 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 523 switch(proto)
cassyarduino 0:e3fb1267e3c3 524 {
cassyarduino 0:e3fb1267e3c3 525 // case UIP_PROTO_ICMP:
cassyarduino 0:e3fb1267e3c3 526 // case UIP_PROTO_ICMP6:
cassyarduino 0:e3fb1267e3c3 527 // upper_layer_memlen = upper_layer_len;
cassyarduino 0:e3fb1267e3c3 528 // break;
cassyarduino 0:e3fb1267e3c3 529 case UIP_PROTO_UDP:
cassyarduino 0:e3fb1267e3c3 530 upper_layer_memlen = UIP_UDPH_LEN;
cassyarduino 0:e3fb1267e3c3 531 break;
cassyarduino 0:e3fb1267e3c3 532 default:
cassyarduino 0:e3fb1267e3c3 533 // case UIP_PROTO_TCP:
cassyarduino 0:e3fb1267e3c3 534 #endif
cassyarduino 0:e3fb1267e3c3 535 upper_layer_memlen = (BUF->tcpoffset >> 4) << 2;
cassyarduino 0:e3fb1267e3c3 536 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 537 break;
cassyarduino 0:e3fb1267e3c3 538 }
cassyarduino 0:e3fb1267e3c3 539 #endif
cassyarduino 0:e3fb1267e3c3 540 sum = UIPEthernetClass::chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_memlen);
cassyarduino 0:e3fb1267e3c3 541 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 542 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 543 LogObject.uart_send_str(F("UIPEthernetClass::upper_layer_chksum(uint8_t proto) DEBUG:uip_buf["));
cassyarduino 0:e3fb1267e3c3 544 #else
cassyarduino 0:e3fb1267e3c3 545 LogObject.uart_send_str(F("uip_tcpchksum(void) DEBUG:uip_buf["));
cassyarduino 0:e3fb1267e3c3 546 #endif
cassyarduino 0:e3fb1267e3c3 547 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN);
cassyarduino 0:e3fb1267e3c3 548 LogObject.uart_send_str(F("-"));
cassyarduino 0:e3fb1267e3c3 549 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
cassyarduino 0:e3fb1267e3c3 550 LogObject.uart_send_str(F("]: "));
cassyarduino 0:e3fb1267e3c3 551 LogObject.uart_send_hexln(htons(sum));
cassyarduino 0:e3fb1267e3c3 552 #endif
cassyarduino 0:e3fb1267e3c3 553 if (upper_layer_memlen < upper_layer_len)
cassyarduino 0:e3fb1267e3c3 554 {
cassyarduino 0:e3fb1267e3c3 555 sum = Enc28J60Network::chksum(
cassyarduino 0:e3fb1267e3c3 556 sum,
cassyarduino 0:e3fb1267e3c3 557 UIPEthernetClass::uip_packet,
cassyarduino 0:e3fb1267e3c3 558 UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen,
cassyarduino 0:e3fb1267e3c3 559 upper_layer_len - upper_layer_memlen
cassyarduino 0:e3fb1267e3c3 560 );
cassyarduino 0:e3fb1267e3c3 561 #if ACTLOGLEVEL>=LOG_DEBUG
cassyarduino 0:e3fb1267e3c3 562 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 563 LogObject.uart_send_str(F("UIPEthernetClass::upper_layer_chksum(uint8_t proto) DEBUG:uip_packet("));
cassyarduino 0:e3fb1267e3c3 564 #else
cassyarduino 0:e3fb1267e3c3 565 LogObject.uart_send_str(F("uip_tcpchksum(void) DEBUG:uip_packet("));
cassyarduino 0:e3fb1267e3c3 566 #endif
cassyarduino 33:7ba5d53df0f2 567 LogObject.uart_send_dec(UIPEthernetClass::uip_packet);
cassyarduino 0:e3fb1267e3c3 568 LogObject.uart_send_str(F(")["));
cassyarduino 0:e3fb1267e3c3 569 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen);
cassyarduino 0:e3fb1267e3c3 570 LogObject.uart_send_str(F("-"));
cassyarduino 0:e3fb1267e3c3 571 LogObject.uart_send_dec(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_len);
cassyarduino 0:e3fb1267e3c3 572 LogObject.uart_send_str(F("]: "));
cassyarduino 0:e3fb1267e3c3 573 LogObject.uart_send_hexln(htons(sum));
cassyarduino 0:e3fb1267e3c3 574 #endif
cassyarduino 0:e3fb1267e3c3 575 }
cassyarduino 0:e3fb1267e3c3 576 return (sum == 0) ? 0xffff : htons(sum);
cassyarduino 0:e3fb1267e3c3 577 }
cassyarduino 0:e3fb1267e3c3 578
cassyarduino 0:e3fb1267e3c3 579 uint16_t
cassyarduino 0:e3fb1267e3c3 580 uip_ipchksum(void)
cassyarduino 0:e3fb1267e3c3 581 {
cassyarduino 0:e3fb1267e3c3 582 return UIPEthernet.ipchksum();
cassyarduino 0:e3fb1267e3c3 583 }
cassyarduino 0:e3fb1267e3c3 584
cassyarduino 0:e3fb1267e3c3 585 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 586 uint16_t
cassyarduino 0:e3fb1267e3c3 587 uip_tcpchksum(void)
cassyarduino 0:e3fb1267e3c3 588 {
cassyarduino 0:e3fb1267e3c3 589 uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_TCP);
cassyarduino 0:e3fb1267e3c3 590 return sum;
cassyarduino 0:e3fb1267e3c3 591 }
cassyarduino 0:e3fb1267e3c3 592
cassyarduino 0:e3fb1267e3c3 593 uint16_t
cassyarduino 0:e3fb1267e3c3 594 uip_udpchksum(void)
cassyarduino 0:e3fb1267e3c3 595 {
cassyarduino 0:e3fb1267e3c3 596 uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_UDP);
cassyarduino 0:e3fb1267e3c3 597 return sum;
cassyarduino 0:e3fb1267e3c3 598 }
cassyarduino 0:e3fb1267e3c3 599 #endif