mbed OS5

Fork of UIPEthernet by Zoltan Hudak

Committer:
hudakz
Date:
Sun Mar 08 20:26:56 2015 +0000
Revision:
4:d774541a34da
Parent:
2:049ce85163c5
Child:
8:4acb22344932
Version 1.09 (fixed leaking client-data caused by race-condition on remote close)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 4:d774541a34da 1 /*
hudakz 4:d774541a34da 2 UIPEthernet.h - Arduino implementation of a uIP wrapper class.
hudakz 4:d774541a34da 3 Copyright (c) 2013 Norbert Truchsess <norbert.truchsess@t-online.de>
hudakz 4:d774541a34da 4 All rights reserved.
hudakz 4:d774541a34da 5
hudakz 4:d774541a34da 6 Modified (ported to mbed) by Zoltan Hudak <hudakz@inbox.com>
hudakz 4:d774541a34da 7
hudakz 4:d774541a34da 8 This program is free software: you can redistribute it and/or modify
hudakz 4:d774541a34da 9 it under the terms of the GNU General Public License as published by
hudakz 4:d774541a34da 10 the Free Software Foundation, either version 3 of the License, or
hudakz 4:d774541a34da 11 (at your option) any later version.
hudakz 4:d774541a34da 12
hudakz 4:d774541a34da 13 This program is distributed in the hope that it will be useful,
hudakz 4:d774541a34da 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
hudakz 4:d774541a34da 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 4:d774541a34da 16 GNU General Public License for more details.
hudakz 4:d774541a34da 17
hudakz 4:d774541a34da 18 You should have received a copy of the GNU General Public License
hudakz 4:d774541a34da 19 along with this program. If not, see <http://www.gnu.org/licenses/>.
hudakz 4:d774541a34da 20 */
hudakz 4:d774541a34da 21 #ifndef UIPETHERNET_H
hudakz 4:d774541a34da 22 #define UIPETHERNET_H
hudakz 4:d774541a34da 23
hudakz 4:d774541a34da 24 //#define UIPETHERNET_DEBUG
hudakz 4:d774541a34da 25
hudakz 4:d774541a34da 26 //#define UIPETHERNET_DEBUG_CHKSUM
hudakz 4:d774541a34da 27 //#define UIPETHERNET_DEBUG_UDP
hudakz 4:d774541a34da 28 //#define UIPETHERNET_DEBUG_CLIENT
hudakz 4:d774541a34da 29 #include "ethernet_comp.h"
hudakz 4:d774541a34da 30 #include <mbed.h>
hudakz 4:d774541a34da 31 #include "Dhcp.h"
hudakz 4:d774541a34da 32 #include "IPAddress.h"
hudakz 4:d774541a34da 33 #include "utility/Enc28J60Network.h"
hudakz 4:d774541a34da 34 #include "UIPClient.h"
hudakz 4:d774541a34da 35 #include "UIPServer.h"
hudakz 4:d774541a34da 36 #include "UIPUdp.h"
hudakz 4:d774541a34da 37
hudakz 4:d774541a34da 38 extern "C"
hudakz 4:d774541a34da 39 {
hudakz 4:d774541a34da 40 #include "utility/uip_timer.h"
hudakz 4:d774541a34da 41 #include "utility/uip.h"
hudakz 4:d774541a34da 42 }
hudakz 4:d774541a34da 43 #define UIPETHERNET_FREEPACKET 1
hudakz 4:d774541a34da 44 #define UIPETHERNET_SENDPACKET 2
hudakz 4:d774541a34da 45 #define UIPETHERNET_BUFFERREAD 4
hudakz 4:d774541a34da 46
hudakz 4:d774541a34da 47 #define uip_ip_addr(addr, ip) \
hudakz 4:d774541a34da 48 do \
hudakz 4:d774541a34da 49 { \
hudakz 4:d774541a34da 50 ((u16_t *) (addr))[0] = HTONS(((ip[0]) << 8) | (ip[1])); \
hudakz 4:d774541a34da 51 ((u16_t *) (addr))[1] = HTONS(((ip[2]) << 8) | (ip[3])); \
hudakz 4:d774541a34da 52 } while(0)
hudakz 4:d774541a34da 53 #define ip_addr_uip(a) IPAddress(a[0] & 0xFF, a[0] >> 8, a[1] & 0xFF, a[1] >> 8) //TODO this is not IPV6 capable
hudakz 4:d774541a34da 54
hudakz 4:d774541a34da 55 #define uip_seteth_addr(eaddr) \
hudakz 4:d774541a34da 56 do \
hudakz 4:d774541a34da 57 { \
hudakz 4:d774541a34da 58 uip_ethaddr.addr[0] = eaddr[0]; \
hudakz 4:d774541a34da 59 uip_ethaddr.addr[1] = eaddr[1]; \
hudakz 4:d774541a34da 60 uip_ethaddr.addr[2] = eaddr[2]; \
hudakz 4:d774541a34da 61 uip_ethaddr.addr[3] = eaddr[3]; \
hudakz 4:d774541a34da 62 uip_ethaddr.addr[4] = eaddr[4]; \
hudakz 4:d774541a34da 63 uip_ethaddr.addr[5] = eaddr[5]; \
hudakz 4:d774541a34da 64 } while(0)
hudakz 4:d774541a34da 65 #define BUF ((struct uip_tcpip_hdr*) &uip_buf[UIP_LLH_LEN])
hudakz 4:d774541a34da 66 class UIPEthernetClass
hudakz 4:d774541a34da 67 {
hudakz 4:d774541a34da 68 public:
hudakz 4:d774541a34da 69 Enc28J60Network network;
hudakz 4:d774541a34da 70
hudakz 4:d774541a34da 71 UIPEthernetClass(PinName mosi, PinName miso, PinName sck, PinName cs);
hudakz 4:d774541a34da 72
hudakz 4:d774541a34da 73 int begin(const uint8_t* mac);
hudakz 4:d774541a34da 74 void begin(const uint8_t* mac, IPAddress ip);
hudakz 4:d774541a34da 75 void begin(const uint8_t* mac, IPAddress ip, IPAddress dns);
hudakz 4:d774541a34da 76 void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway);
hudakz 4:d774541a34da 77 void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
hudakz 4:d774541a34da 78
hudakz 4:d774541a34da 79 // maintain() must be called at regular intervals to process the incoming serial
hudakz 4:d774541a34da 80 // data and issue IP events to the sketch. It does not return until all IP
hudakz 4:d774541a34da 81 // events have been processed. Renews dhcp-lease if required.
hudakz 4:d774541a34da 82 int maintain(void);
hudakz 4:d774541a34da 83
hudakz 4:d774541a34da 84 IPAddress localIP(void);
hudakz 4:d774541a34da 85 IPAddress subnetMask(void);
hudakz 4:d774541a34da 86 IPAddress gatewayIP(void);
hudakz 4:d774541a34da 87 IPAddress dnsServerIP(void);
hudakz 4:d774541a34da 88 private:
hudakz 4:d774541a34da 89 static memhandle in_packet;
hudakz 4:d774541a34da 90 static memhandle uip_packet;
hudakz 4:d774541a34da 91 static uint8_t uip_hdrlen;
hudakz 4:d774541a34da 92 static uint8_t packetstate;
hudakz 4:d774541a34da 93
hudakz 4:d774541a34da 94 static IPAddress _dnsServerAddress;
hudakz 4:d774541a34da 95 static DhcpClass* _dhcp;
hudakz 4:d774541a34da 96
hudakz 4:d774541a34da 97 static unsigned long periodic_timer;
hudakz 4:d774541a34da 98
hudakz 4:d774541a34da 99 void init(const uint8_t* mac);
hudakz 4:d774541a34da 100 static void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
hudakz 4:d774541a34da 101
hudakz 4:d774541a34da 102 void tick(void);
hudakz 4:d774541a34da 103
hudakz 4:d774541a34da 104 bool network_send(void);
hudakz 4:d774541a34da 105
hudakz 4:d774541a34da 106 friend class UIPServer;
hudakz 4:d774541a34da 107
hudakz 4:d774541a34da 108 friend class UIPClient;
hudakz 4:d774541a34da 109
hudakz 4:d774541a34da 110 friend class UIPUDP;
hudakz 4:d774541a34da 111
hudakz 4:d774541a34da 112 static uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len);
hudakz 4:d774541a34da 113 static uint16_t ipchksum(void);
hudakz 4:d774541a34da 114 #if UIP_UDP
hudakz 4:d774541a34da 115 uint16_t upper_layer_chksum(uint8_t proto);
hudakz 4:d774541a34da 116 #endif
hudakz 4:d774541a34da 117 friend uint16_t uip_ipchksum(void);
hudakz 4:d774541a34da 118 friend uint16_t uip_tcpchksum(void);
hudakz 4:d774541a34da 119 friend uint16_t uip_udpchksum(void);
hudakz 4:d774541a34da 120
hudakz 4:d774541a34da 121 friend void uipclient_appcall(void);
hudakz 4:d774541a34da 122 friend void uipudp_appcall(void);
hudakz 4:d774541a34da 123
hudakz 4:d774541a34da 124 #if UIP_CONF_IPV6
hudakz 4:d774541a34da 125 uint16_t uip_icmp6chksum(void);
hudakz 4:d774541a34da 126 #endif /* UIP_CONF_IPV6 */
hudakz 4:d774541a34da 127 };
hudakz 4:d774541a34da 128
hudakz 4:d774541a34da 129 extern UIPEthernetClass UIPEthernet;
hudakz 4:d774541a34da 130 #endif