123
Diff: UipEthernet.h
- Revision:
- 9:a156d3de5647
- Child:
- 11:647d53d146f1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UipEthernet.h Tue Aug 27 15:01:10 2019 +0000 @@ -0,0 +1,117 @@ +/* + UipEthernet.h - Arduino implementation of a UIP wrapper class. + Copyright (c) 2013 Norbert Truchsess <norbert.truchsess@t-online.de> + All rights reserved. + + Modified (ported to mbed) by Zoltan Hudak <hudakz@inbox.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef UIPETHERNET_H +#define UIPETHERNET_H + +//#define UIPETHERNET_DEBUG +//#define UIPETHERNET_DEBUG_CHKSUM +//#define UIPETHERNET_DEBUG_UDP +//#define UIPETHERNET_DEBUG_CLIENT +#include "mbed.h" +#include "DhcpClient.h" +#include "IpAddress.h" +#include "utility/Enc28j60Py.h" +#include "TcpClient.h" +#include "TcpServer.h" +#include "UdpSocket.h" + +extern "C" +{ +#include "utility/uip_timer.h" +#include "utility/uip.h" +} +#define UIPETHERNET_FREEPACKET 1 +#define UIPETHERNET_SENDPACKET 2 + +#define uip_ip_addr(addr, ip) \ + do { \ + ((u16_t *) (addr))[0] = (((ip[1]) << 8) | (ip[0])); \ + ((u16_t *) (addr))[1] = (((ip[3]) << 8) | (ip[2])); \ + } while (0) +#define ip_addr_uip(a) IpAddress(a[0] & 0xFF, a[0] >> 8, a[1] & 0xFF, a[1] >> 8) //TODO this is not IPV6 capable + +#define uip_seteth_addr(eaddr) \ + do { \ + uip_ethaddr.addr[0] = eaddr[0]; \ + uip_ethaddr.addr[1] = eaddr[1]; \ + uip_ethaddr.addr[2] = eaddr[2]; \ + uip_ethaddr.addr[3] = eaddr[3]; \ + uip_ethaddr.addr[4] = eaddr[4]; \ + uip_ethaddr.addr[5] = eaddr[5]; \ + } while (0) +#define BUF ((struct uip_tcpip_hdr*) &uip_buf[UIP_LLH_LEN]) + +class UipEthernet +{ +public: + static UipEthernet* ethernet; + static IpAddress dnsServerAddress; + Enc28j60Phy phy; + + UipEthernet (const uint8_t mac[6], PinName mosi, PinName miso, PinName sck, PinName cs); + + int connect(); + void set_network(uint8_t octet1, uint8_t octet2, uint8_t octet3, uint8_t octet4); + void set_network(IpAddress ip); + void set_network(IpAddress ip, IpAddress dns); + void set_network(IpAddress ip, IpAddress dns, IpAddress gateway); + void set_network(IpAddress ip, IpAddress dns, IpAddress gateway, IpAddress subnet); + void tick(); + IpAddress localIP(); + IpAddress subnetMask(); + IpAddress gatewayIP(); + IpAddress dnsServerIP(); + const char* get_ip_address(); + const char* get_netmask(); + const char* get_gateway(); + static uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len); + static uint16_t ipchksum(); +private: + uint8_t *const _mac; + IpAddress _ip; + IpAddress _dns; + IpAddress _gateway; + IpAddress _subnet; + static memhandle inPacket; + static memhandle uipPacket; + static uint8_t uipHeaderLen; + static uint8_t packetState; + DhcpClient dhcpClient; + Timer periodicTimer; + void init(const uint8_t* mac); + bool network_send(); + friend class TcpServer; + friend class TcpClient; + friend class UdpSocket; +#if UIP_UDP + uint16_t upper_layer_chksum(uint8_t proto); +#endif + friend uint16_t uip_ipchksum(); + friend uint16_t uip_tcpchksum(); + friend uint16_t uip_udpchksum(); + friend void uipclient_appcall(); + friend void uipudp_appcall(); + +#if UIP_CONF_IPV6 + uint16_t uip_icmp6chksum(); +#endif +}; +#endif