forked from UIPEthernet/UIPEthernet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
UIPEthernet.h
157 lines (123 loc) · 4.36 KB
/
UIPEthernet.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
UIPEthernet.h - Arduino implementation of a uIP wrapper class.
Copyright (c) 2013 Norbert Truchsess <norbert.truchsess@t-online.de>
All rights reserved.
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
#include "ethernet_comp.h"
#if defined(__MBED__)
#include <mbed.h>
#endif
#if defined(ARDUINO)
#include <Arduino.h>
#if defined(__STM32F3__) || defined(STM32F3) || defined(__RFduino__)
#include "mbed/IPAddress.h"
#else
#include "IPAddress.h"
#endif
#endif
#include "utility/Enc28J60Network.h"
#include "utility/uipopt.h"
#include "Dhcp.h"
#if UIP_UDP
#include "UIPUdp.h"
#endif
extern "C"
{
#include "utility/uip_timer.h"
#include "utility/uip.h"
}
#define UIPETHERNET_FREEPACKET 1
#define UIPETHERNET_SENDPACKET 2
#define UIPETHERNET_BUFFERREAD 4
#define uip_ip_addr(addr, ip) do { \
((u16_t *)(addr))[0] = HTONS(((ip[0]) << 8) | (ip[1])); \
((u16_t *)(addr))[1] = HTONS(((ip[2]) << 8) | (ip[3])); \
} 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[if_idx].addr[0] = eaddr[0]; \
uip_ethaddr[if_idx].addr[1] = eaddr[1];\
uip_ethaddr[if_idx].addr[2] = eaddr[2];\
uip_ethaddr[if_idx].addr[3] = eaddr[3];\
uip_ethaddr[if_idx].addr[4] = eaddr[4];\
uip_ethaddr[if_idx].addr[5] = eaddr[5];} while(0)
#define BUF ((struct uip_tcpip_hdr *)&uip_buf[if_idx][UIP_LLH_LEN])
enum EthernetLinkStatus {
Unknown,
LinkON,
LinkOFF
};
#if UIP_UDP
class DhcpClass;
#endif
class UIPEthernetClass
{
public:
#if UIP_UDP
UIPEthernetClass(Enc28J60Network &, DhcpClass *);
#else
UIPEthernetClass(Enc28J60Network &);
#endif
int begin(const uint8_t* mac);
void begin(const uint8_t* mac, IPAddress ip);
void begin(const uint8_t* mac, IPAddress ip, IPAddress dns);
void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway);
void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
// maintain() must be called at regular intervals to process the incoming serial
// data and issue IP events to the sketch. It does not return until all IP
// events have been processed. Renews dhcp-lease if required.
int maintain();
EthernetLinkStatus linkStatus();
IPAddress localIP();
IPAddress subnetMask();
IPAddress gatewayIP();
IPAddress dnsServerIP();
private:
Enc28J60Network &Enc28J60;
memhandle in_packet;
memhandle uip_packet;
uint8_t uip_hdrlen;
uint8_t packetstate;
IPAddress _dnsServerAddress;
#if UIP_UDP
DhcpClass *_dhcp;
#endif
unsigned long periodic_timer;
void netInit(const uint8_t* mac);
void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
void tick();
bool network_send();
friend class UIPServer;
friend class UIPClient;
#if UIP_UDP
friend class UIPUDP;
#endif
uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len);
uint16_t ipchksum(void);
#if UIP_UDP
uint16_t upper_layer_chksum(uint8_t proto);
#endif
friend uint16_t uip_ipchksum(void);
friend uint16_t uip_tcpchksum(void);
friend uint16_t uip_udpchksum(void);
friend void uipclient_appcall(void);
friend void uipudp_appcall(void);
#if UIP_CONF_IPV6
uint16_t uip_icmp6chksum(void);
#endif /* UIP_CONF_IPV6 */
};
extern UIPEthernetClass UIPEthernet_0;
extern UIPEthernetClass UIPEthernet_1;
extern UIPEthernetClass *uip_eth[UIP_NUM_INTERFACES];
#endif // UIPETHERNET_H