forked from ntruchsess/arduino_uip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUIPEthernet.h
131 lines (98 loc) · 3.87 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
/*
UIPEthernet.h - Arduino implementation of a uIP wrapper class.
Copyright (c) 2013 Norbert Truchsess <[email protected]>
work based on
SerialIP.h (Copyright (c) 2010 Adam Nielsen <[email protected]>)
All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef UIPETHERNET_H
#define UIPETHERNET_H
#include <Arduino.h>
#include "Dhcp.h"
#include "IPAddress.h"
extern "C"
{
#include "utility/timer.h"
#include "utility/uip.h"
}
#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.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 UIP_STREAM_READ 1;
#define UIP_STREAM_WRITE 2;
typedef void
(*fn_uip_cb_t)(uip_tcp_appstate_t *conn);
typedef void
(*fn_uip_udp_cb_t)(uip_udp_appstate_t *conn);
class UIPEthernetClass
{
public:
UIPEthernetClass();
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();
IPAddress localIP();
IPAddress subnetMask();
IPAddress gatewayIP();
IPAddress dnsServerIP();
// Set a user function to handle raw uIP events as they happen. The
// callback function can only use uIP functions, but it can also use uIP's
// protosockets.
void set_uip_callback(fn_uip_cb_t fn);
void set_uip_udp_callback(fn_uip_udp_cb_t fn);
private:
IPAddress _dnsServerAddress;
DhcpClass* _dhcp;
struct timer periodic_timer;
fn_uip_cb_t fn_uip_cb;
fn_uip_udp_cb_t fn_uip_udp_cb;
uint16_t packetlen;
uint16_t num;
uint8_t left;
uint8_t packetstream;
uint8_t hdrlen;
void stream_packet_read_start();
void stream_packet_read_end();
void stream_packet_write_start();
void stream_packet_write_end();
int stream_packet_read(unsigned char* buffer, size_t len);
int stream_packet_peek();
void stream_packet_write(unsigned char* buffer, size_t len);
void init(const uint8_t* mac);
void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);
void tick();
void uip_callback();
friend void uipethernet_appcall(void);
void uip_udp_callback();
friend void uipudp_appcall(void);
friend class UIPServer;
friend class UIPClient;
friend class UIPUDP;
};
extern UIPEthernetClass UIPEthernet;
#endif