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.h - 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 #ifndef UIPETHERNET_H
cassyarduino 0:e3fb1267e3c3 21 #define UIPETHERNET_H
cassyarduino 0:e3fb1267e3c3 22
cassyarduino 0:e3fb1267e3c3 23 #include "ethernet_comp.h"
cassyarduino 0:e3fb1267e3c3 24 #if defined(__MBED__)
cassyarduino 0:e3fb1267e3c3 25 #include <mbed.h>
cassyarduino 0:e3fb1267e3c3 26 #endif
cassyarduino 0:e3fb1267e3c3 27 #if defined(ARDUINO)
cassyarduino 0:e3fb1267e3c3 28 #include <Arduino.h>
cassyarduino 33:7ba5d53df0f2 29 #if defined(__STM32F3__) || defined(STM32F3) || defined(__RFduino__)
cassyarduino 19:e416943f7119 30 #include "mbed/IPAddress.h"
cassyarduino 19:e416943f7119 31 #else
cassyarduino 19:e416943f7119 32 #include "IPAddress.h"
cassyarduino 19:e416943f7119 33 #endif
cassyarduino 0:e3fb1267e3c3 34 #endif
cassyarduino 33:7ba5d53df0f2 35 #include "utility/Enc28J60Network.h"
cassyarduino 39:deeb00b81cc9 36 #include "utility/uipopt.h"
cassyarduino 0:e3fb1267e3c3 37 #include "Dhcp.h"
cassyarduino 33:7ba5d53df0f2 38 #if UIP_UDP
cassyarduino 33:7ba5d53df0f2 39 #include "UIPUdp.h"
cassyarduino 33:7ba5d53df0f2 40 #endif
cassyarduino 0:e3fb1267e3c3 41 #include "UIPClient.h"
cassyarduino 0:e3fb1267e3c3 42 #include "UIPServer.h"
cassyarduino 0:e3fb1267e3c3 43
cassyarduino 0:e3fb1267e3c3 44 extern "C"
cassyarduino 0:e3fb1267e3c3 45 {
cassyarduino 0:e3fb1267e3c3 46 #include "utility/uip_timer.h"
cassyarduino 0:e3fb1267e3c3 47 #include "utility/uip.h"
cassyarduino 0:e3fb1267e3c3 48 }
cassyarduino 0:e3fb1267e3c3 49
cassyarduino 0:e3fb1267e3c3 50 #define UIPETHERNET_FREEPACKET 1
cassyarduino 0:e3fb1267e3c3 51 #define UIPETHERNET_SENDPACKET 2
cassyarduino 0:e3fb1267e3c3 52 #define UIPETHERNET_BUFFERREAD 4
cassyarduino 0:e3fb1267e3c3 53
cassyarduino 0:e3fb1267e3c3 54 #define uip_ip_addr(addr, ip) do { \
cassyarduino 0:e3fb1267e3c3 55 ((u16_t *)(addr))[0] = HTONS(((ip[0]) << 8) | (ip[1])); \
cassyarduino 0:e3fb1267e3c3 56 ((u16_t *)(addr))[1] = HTONS(((ip[2]) << 8) | (ip[3])); \
cassyarduino 0:e3fb1267e3c3 57 } while(0)
cassyarduino 0:e3fb1267e3c3 58
cassyarduino 0:e3fb1267e3c3 59 #define ip_addr_uip(a) IPAddress(a[0] & 0xFF, a[0] >> 8 , a[1] & 0xFF, a[1] >> 8) //TODO this is not IPV6 capable
cassyarduino 0:e3fb1267e3c3 60
cassyarduino 0:e3fb1267e3c3 61 #define uip_seteth_addr(eaddr) do {uip_ethaddr.addr[0] = eaddr[0]; \
cassyarduino 0:e3fb1267e3c3 62 uip_ethaddr.addr[1] = eaddr[1];\
cassyarduino 0:e3fb1267e3c3 63 uip_ethaddr.addr[2] = eaddr[2];\
cassyarduino 0:e3fb1267e3c3 64 uip_ethaddr.addr[3] = eaddr[3];\
cassyarduino 0:e3fb1267e3c3 65 uip_ethaddr.addr[4] = eaddr[4];\
cassyarduino 0:e3fb1267e3c3 66 uip_ethaddr.addr[5] = eaddr[5];} while(0)
cassyarduino 0:e3fb1267e3c3 67
cassyarduino 0:e3fb1267e3c3 68 #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
cassyarduino 0:e3fb1267e3c3 69
cassyarduino 0:e3fb1267e3c3 70 class UIPEthernetClass
cassyarduino 0:e3fb1267e3c3 71 {
cassyarduino 0:e3fb1267e3c3 72 public:
cassyarduino 0:e3fb1267e3c3 73 UIPEthernetClass();
cassyarduino 0:e3fb1267e3c3 74
cassyarduino 0:e3fb1267e3c3 75 int begin(const uint8_t* mac);
cassyarduino 0:e3fb1267e3c3 76 void begin(const uint8_t* mac, IPAddress ip);
cassyarduino 0:e3fb1267e3c3 77 void begin(const uint8_t* mac, IPAddress ip, IPAddress dns);
cassyarduino 0:e3fb1267e3c3 78 void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway);
cassyarduino 0:e3fb1267e3c3 79 void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
cassyarduino 0:e3fb1267e3c3 80
cassyarduino 0:e3fb1267e3c3 81 // maintain() must be called at regular intervals to process the incoming serial
cassyarduino 0:e3fb1267e3c3 82 // data and issue IP events to the sketch. It does not return until all IP
cassyarduino 0:e3fb1267e3c3 83 // events have been processed. Renews dhcp-lease if required.
cassyarduino 0:e3fb1267e3c3 84 int maintain();
cassyarduino 0:e3fb1267e3c3 85
cassyarduino 0:e3fb1267e3c3 86 IPAddress localIP();
cassyarduino 0:e3fb1267e3c3 87 IPAddress subnetMask();
cassyarduino 0:e3fb1267e3c3 88 IPAddress gatewayIP();
cassyarduino 0:e3fb1267e3c3 89 IPAddress dnsServerIP();
cassyarduino 0:e3fb1267e3c3 90
cassyarduino 0:e3fb1267e3c3 91 private:
cassyarduino 0:e3fb1267e3c3 92 static memhandle in_packet;
cassyarduino 0:e3fb1267e3c3 93 static memhandle uip_packet;
cassyarduino 0:e3fb1267e3c3 94 static uint8_t uip_hdrlen;
cassyarduino 0:e3fb1267e3c3 95 static uint8_t packetstate;
cassyarduino 0:e3fb1267e3c3 96
cassyarduino 0:e3fb1267e3c3 97 static IPAddress _dnsServerAddress;
cassyarduino 33:7ba5d53df0f2 98 #if UIP_UDP
cassyarduino 33:7ba5d53df0f2 99 static DhcpClass* _dhcp;
cassyarduino 33:7ba5d53df0f2 100 #endif
cassyarduino 0:e3fb1267e3c3 101 static unsigned long periodic_timer;
cassyarduino 0:e3fb1267e3c3 102
cassyarduino 0:e3fb1267e3c3 103 static void init(const uint8_t* mac);
cassyarduino 0:e3fb1267e3c3 104 static void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
cassyarduino 0:e3fb1267e3c3 105
cassyarduino 0:e3fb1267e3c3 106 static void tick();
cassyarduino 0:e3fb1267e3c3 107
cassyarduino 0:e3fb1267e3c3 108 static bool network_send();
cassyarduino 0:e3fb1267e3c3 109
cassyarduino 0:e3fb1267e3c3 110 friend class UIPServer;
cassyarduino 0:e3fb1267e3c3 111
cassyarduino 0:e3fb1267e3c3 112 friend class UIPClient;
cassyarduino 0:e3fb1267e3c3 113
cassyarduino 0:e3fb1267e3c3 114 friend class UIPUDP;
cassyarduino 0:e3fb1267e3c3 115
cassyarduino 0:e3fb1267e3c3 116 static uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len);
cassyarduino 0:e3fb1267e3c3 117 static uint16_t ipchksum(void);
cassyarduino 0:e3fb1267e3c3 118 #if UIP_UDP
cassyarduino 0:e3fb1267e3c3 119 static uint16_t upper_layer_chksum(uint8_t proto);
cassyarduino 0:e3fb1267e3c3 120 #endif
cassyarduino 0:e3fb1267e3c3 121 friend uint16_t uip_ipchksum(void);
cassyarduino 0:e3fb1267e3c3 122 friend uint16_t uip_tcpchksum(void);
cassyarduino 0:e3fb1267e3c3 123 friend uint16_t uip_udpchksum(void);
cassyarduino 0:e3fb1267e3c3 124
cassyarduino 0:e3fb1267e3c3 125 friend void uipclient_appcall(void);
cassyarduino 0:e3fb1267e3c3 126 friend void uipudp_appcall(void);
cassyarduino 0:e3fb1267e3c3 127
cassyarduino 0:e3fb1267e3c3 128 #if UIP_CONF_IPV6
cassyarduino 0:e3fb1267e3c3 129 uint16_t uip_icmp6chksum(void);
cassyarduino 0:e3fb1267e3c3 130 #endif /* UIP_CONF_IPV6 */
cassyarduino 0:e3fb1267e3c3 131 };
cassyarduino 0:e3fb1267e3c3 132
cassyarduino 0:e3fb1267e3c3 133 extern UIPEthernetClass UIPEthernet;
cassyarduino 0:e3fb1267e3c3 134
cassyarduino 0:e3fb1267e3c3 135 #endif