embkernel
 All Classes Functions Variables Typedefs Groups Pages
NetDefs.hpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #ifndef NET_DEFS_HPP_
7 #define NET_DEFS_HPP_
8 
9 #include <stdint.h>
10 
11 class NetDefs {
12 public:
13 
14  static const uint16_t UDP_PORT_DHCP_SERVER = 67;
15  static const uint16_t UDP_PORT_DHCP_CLIENT = 68;
16  static const uint16_t UDP_PORT_NBNS = 137;
17 
18  static const unsigned int MAX_FRAME_LEN = 1524;
19 
20  typedef struct tagMacAddr {
21  uint8_t v[6];
22  bool operator ==(const tagMacAddr& other) const {
23  return ((v[0] == other.v[0]) && (v[1] == other.v[1]) && (v[2] == other.v[2]) && (v[3] == other.v[3]) && (v[4] == other.v[4]) && (v[5] == other.v[5]));
24  }
25  ;
26  bool operator !=(const tagMacAddr& other) const {
27  return !((v[0] == other.v[0]) && (v[1] == other.v[1]) && (v[2] == other.v[2]) && (v[3] == other.v[3]) && (v[4] == other.v[4])
28  && (v[5] == other.v[5]));
29  }
30  ;
31  }__attribute__((packed)) MAC_ADDR;
32 
33  static const MAC_ADDR MAC_BROADCAST;
34 
35  typedef enum
36  :uint16_t {
37  MAC_TYPE_IP = 0x0800,
38  MAC_TYPE_ARP = 0x0806
39  } MAC_TYPE;
40 
41  typedef struct {
42  uint16_t len;
43  MAC_ADDR dstAddr;
44  MAC_ADDR srcAddr;
45  MAC_TYPE type;
46  }__attribute__((packed)) MAC_HEADER;
47 
48  typedef union tagIpAddr {
49  uint8_t v[4];
50  uint32_t val;
51  bool operator ==(const tagIpAddr& other) const {
52  return (val == other.val);
53  }
54  }__attribute__((packed)) IP_ADDR;
55 
56  static const IP_ADDR IP_BROADCAST;
57 
58  typedef enum
59  :uint8_t {
60  IP_PROTOCOL_ICMP = 1,
61  IP_PROTOCOL_TCP = 6,
62  IP_PROTOCOL_UDP = 17
63  } IP_PROTOCOL;
64 
65  typedef struct {
66  IP_ADDR srcAddr;
67  IP_ADDR dstAddr;
68  uint8_t zero;
69  IP_PROTOCOL protocol;
70  uint16_t len;
71  }__attribute__((packed)) IP_PSEUDO_HEADER;
72 
73  typedef struct {
74  uint8_t headerLen :4;
75  uint8_t version :4;
76  uint8_t typeOfService;
77  uint16_t totalLen;
78  uint16_t identification;
79  uint16_t fragmentInfo;
80  uint8_t timeToLive;
81  IP_PROTOCOL protocol;
82  uint16_t headerChecksum;
83  IP_ADDR srcAddr;
84  IP_ADDR dstAddr;
85  }__attribute__((packed)) IP_HEADER;
86 
87  typedef enum
88  :uint16_t {
89  ARP_HW_TYPE_ETHERNET = 0x0001
90  } ARP_HW_TYPE;
91 
92  typedef enum
93  :uint16_t {
94  ARP_PROTOCOL_IP = 0x0800
95  } ARP_PROTOCOL;
96 
97  typedef enum
98  :uint16_t {
99  ARP_OPERATION_REQ = 0x01,
100  ARP_OPERATION_RESP = 0x02
101  } ARP_OPERATION;
102 
103  typedef struct {
104  ARP_HW_TYPE hardwareType;
105  ARP_PROTOCOL protocol;
106  uint8_t macAddrLen;
107  uint8_t protocolLen;
108  ARP_OPERATION operation;
109  MAC_ADDR srcMacAddr;
110  IP_ADDR srcIpAddr;
111  MAC_ADDR dstMacAddr;
112  IP_ADDR dstIpAddr;
113  }__attribute__((packed)) ARP_HEADER;
114 
115  typedef enum
116  :uint8_t {
117  ICMP_TYPE_ECHO_REPLY = 0,
118  ICMP_TYPE_ECHO_REQUEST = 8
119  } ICMP_TYPE;
120 
121  typedef struct {
122  ICMP_TYPE type;
123  uint8_t code;
124  uint16_t checkSum;
125  uint16_t identifier;
126  uint16_t sequence;
127  }__attribute__((packed)) ICMP_HEADER;
128 
129  typedef uint16_t UDP_PORT;
130 
131  typedef struct {
132  UDP_PORT srcPort;
133  UDP_PORT dstPort;
134  uint16_t len;
135  uint16_t checkSum;
136  }__attribute__((packed)) UDP_HEADER;
137 
138  static const int UDP_MAX_DATA_LEN = MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(UDP_HEADER);
139 
140  typedef uint16_t TCP_PORT;
141 
142  const static uint8_t TCP_FLAG_FIN = 0x01;
143  const static uint8_t TCP_FLAG_SYN = 0x02;
144  const static uint8_t TCP_FLAG_RST = 0x04;
145  const static uint8_t TCP_FLAG_PSH = 0x08;
146  const static uint8_t TCP_FLAG_ACK = 0x10;
147  const static uint8_t TCP_FLAG_URG = 0x20;
148 
149  typedef union tagTCP_FLAGS {
150  struct {
151  uint8_t fin :1;
152  uint8_t syn :1;
153  uint8_t rst :1;
154  uint8_t psh :1;
155  uint8_t ack :1;
156  uint8_t urg :1;
157  uint8_t zero :2;
158  } bits;
159  uint8_t value;
160  } TCP_FLAGS;
161 
162  typedef struct {
163  TCP_PORT srcPort;
164  TCP_PORT dstPort;
165  uint32_t seq;
166  uint32_t ack;
167  struct {
168  uint8_t zero :4;
169  uint8_t val :4;
170  } offset;
171  TCP_FLAGS flags;
172  uint16_t window;
173  uint16_t checkSum;
174  uint16_t urgentPointer;
175  }__attribute__((packed)) TCP_HEADER;
176 
177  typedef struct {
178  uint8_t type;
179  uint8_t len;
180  uint16_t maxSegLen;
181  }__attribute__((packed)) TCP_HEADER_OPTIONS;
182 
183  static const int TCP_MAX_DATA_LEN = MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(TCP_HEADER);
184 
185  typedef enum
186  :uint8_t {
187  DHCP_OPCODE_BOOT_REQUEST = 1,
188  DHCP_OPCODE_BOOT_REPLY = 2
189  } DHCP_OPCODE;
190 
191  static const uint8_t DHCP_MAGIC_COOKIE[4];
192 
193  typedef struct {
194  DHCP_OPCODE opCode;
195  uint8_t hardwareType;
196  uint8_t macAddrLen;
197  uint8_t hopCount;
198  uint32_t transactionID;
199  uint16_t numberOfSeconds;
200  uint16_t flags;
201  IP_ADDR clientIpAddr;
202  IP_ADDR yourIPAddr;
203  IP_ADDR serverIpAddr;
204  IP_ADDR gatewayIpAddr;
205  uint8_t clientHwAddr[16];
206  uint8_t serverHostName[64];
207  uint8_t bootFileName[128];
208  }__attribute__((packed)) DHCP_HEADER;
209 
210  static const uint16_t NBNS_TYPE_NB = 0x0020;
211  static const uint16_t NBNS_TYPE_NBSTAT = 0x0021;
212  static const uint16_t NBNS_CLASS_IN = 0x0001;
213 
214  typedef struct {
215  uint16_t id;
216  uint16_t flags;
217  uint16_t questions;
218  uint16_t answers;
219  uint16_t authorities;
220  uint16_t additionals;
221  }__attribute__((packed)) NBNS_HEADER;
222 
223  typedef struct {
224  uint16_t id;
225  union {
226  struct {
227  uint16_t qr :1; //Query/Response Flag
228  uint16_t opcode :4; //Operation code
229  uint16_t aa :1; //Authoritative Answer Flag
230  uint16_t tc :1; //Truncation Flag
231  uint16_t rd :1; //Recursion Desired
232  uint16_t ra :1; //Recursion Available
233  uint16_t z :1; //Zero
234  uint16_t ad :1; //Authenticated data
235  uint16_t cd :1; //Checking Disabled
236  uint16_t rcode :4; //Response code
237  } bits;
238  uint16_t value;
239  } flags;
240  uint16_t questionCount;
241  uint16_t answerRecordCount;
242  uint16_t authorityRecordCount;
243  uint16_t additionalRecordCount;
244  }__attribute__((packed)) DNS_HEADER;
245 
246  typedef struct {
247  DNS_HEADER hdr;
248  uint8_t data[512];
249  }__attribute__((packed)) DNS_PKT;
250 
251  typedef struct tagFRAME {
252  union {
253 
254  uint8_t raw[MAX_FRAME_LEN];
255 
256  struct {
257  MAC_HEADER macHeader;
258  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER)]; //
259  } mac;
260 
261  struct {
262  MAC_HEADER macHeader;
263  ARP_HEADER arpHeader;
264  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(ARP_HEADER)]; //
265  } arp;
266 
267  struct {
268  MAC_HEADER macHeader;
269  IP_HEADER ipHeader;
270  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER)]; //
271  } ip;
272 
273  struct {
274  MAC_HEADER macHeader;
275  IP_HEADER ipHeader;
276  ICMP_HEADER icmpHeader;
277  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(ICMP_HEADER)]; //
278  } icmp;
279 
280  struct {
281  MAC_HEADER macHeader;
282  IP_HEADER ipHeader;
283  UDP_HEADER udpHeader;
284  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(UDP_HEADER)]; //
285  } udp;
286 
287  struct {
288  MAC_HEADER macHeader;
289  IP_HEADER ipHeader;
290  UDP_HEADER udpHeader;
291  DHCP_HEADER dhcpHeader;
292  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(UDP_HEADER) - sizeof(DHCP_HEADER)]; //
293  } dhcp;
294 
295  struct {
296  MAC_HEADER macHeader;
297  IP_HEADER ipHeader;
298  UDP_HEADER udpHeader;
299  NBNS_HEADER nbnsHeader;
300  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(UDP_HEADER) - sizeof(NBNS_HEADER)]; //
301  } nbns;
302 
303  struct {
304  MAC_HEADER macHeader;
305  IP_HEADER ipHeader;
306  TCP_HEADER tcpHeader;
307  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(TCP_HEADER)]; //
308  } tcp;
309 
310  struct {
311  MAC_HEADER macHeader;
312  IP_HEADER ipHeader;
313  TCP_HEADER tcpHeader;
314  TCP_HEADER_OPTIONS tcpOptions;
315  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(TCP_HEADER) - sizeof(TCP_HEADER_OPTIONS)]; //
316  } tcp_with_options;
317 
318  struct {
319  MAC_HEADER macHeader;
320  IP_HEADER ipHeader;
321  UDP_HEADER udpHeader;
322  DNS_HEADER dnsHeader;
323  uint8_t data[MAX_FRAME_LEN - sizeof(MAC_HEADER) - sizeof(IP_HEADER) - sizeof(UDP_HEADER) - sizeof(DNS_HEADER)]; //
324  } dns;
325 
326  } types;
327  }__attribute__((packed)) FRAME;
328 
329  typedef struct {
330  IP_ADDR ipAddr;
331  IP_ADDR mask;
332  IP_ADDR gatewayIpAddr;
333  IP_ADDR dnsIpAddr;
334  char deviceName[31];
335  uint8_t dhcpEnabled;
336  }__attribute__((packed)) NET_CONFIG;
337 };
338 
339 #endif /* NET_DEFS_HPP_ */