-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathnetinet.h
194 lines (181 loc) · 5.13 KB
/
netinet.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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#ifndef HV_NETINET_H_
#define HV_NETINET_H_
#include "hplatform.h"
/*
#ifdef OS_UNIX
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <netinet/tcp.h>
#include <netinet/ip_icmp.h>
typedef struct iphdr iphdr_t;
typedef struct udphdr udphdr_t;
typedef struct tcphdr tcphdr_t;
typedef struct icmphdr icmphdr_t;
typedef struct icmp icmp_t;
#else
*/
// sizeof(iphdr_t) = 20
typedef struct iphdr_s {
#if BYTE_ORDER == LITTLE_ENDIAN
uint8_t ihl:4; // ip header length
uint8_t version:4;
#elif BYTE_ORDER == BIG_ENDIAN
uint8_t version:4;
uint8_t ihl:4;
#else
#error "BYTE_ORDER undefined!"
#endif
uint8_t tos; // type of service
uint16_t tot_len; // total length
uint16_t id;
uint16_t frag_off; // fragment offset
uint8_t ttl; // Time To Live
uint8_t protocol;
uint16_t check; // checksum
uint32_t saddr; // srcaddr
uint32_t daddr; // dstaddr
/*The options start here.*/
} iphdr_t;
// sizeof(udphdr_t) = 8
typedef struct udphdr_s {
uint16_t source; // source port
uint16_t dest; // dest port
uint16_t len; // udp length
uint16_t check; // checksum
} udphdr_t;
// sizeof(tcphdr_t) = 20
typedef struct tcphdr_s {
uint16_t source; // source port
uint16_t dest; // dest port
uint32_t seq; // sequence
uint32_t ack_seq;
#if BYTE_ORDER == LITTLE_ENDIAN
uint16_t res1:4;
uint16_t doff:4;
uint16_t fin:1;
uint16_t syn:1;
uint16_t rst:1;
uint16_t psh:1;
uint16_t ack:1;
uint16_t urg:1;
uint16_t res2:2;
#elif BYTE_ORDER == BIG_ENDIAN
uint16_t doff:4;
uint16_t res1:4;
uint16_t res2:2;
uint16_t urg:1;
uint16_t ack:1;
uint16_t psh:1;
uint16_t rst:1;
uint16_t syn:1;
uint16_t fin:1;
#else
#error "BYTE_ORDER undefined!"
#endif
uint16_t window;
uint16_t check; // checksum
uint16_t urg_ptr; // urgent pointer
} tcphdr_t;
//----------------------icmp----------------------------------
#define ICMP_ECHOREPLY 0 /* Echo Reply */
#define ICMP_DEST_UNREACH 3 /* Destination Unreachable */
#define ICMP_SOURCE_QUENCH 4 /* Source Quench */
#define ICMP_REDIRECT 5 /* Redirect (change route) */
#define ICMP_ECHO 8 /* Echo Request */
#define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */
#define ICMP_PARAMETERPROB 12 /* Parameter Problem */
#define ICMP_TIMESTAMP 13 /* Timestamp Request */
#define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */
#define ICMP_INFO_REQUEST 15 /* Information Request */
#define ICMP_INFO_REPLY 16 /* Information Reply */
#define ICMP_ADDRESS 17 /* Address Mask Request */
#define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */
// sizeof(icmphdr_t) = 8
typedef struct icmphdr_s {
uint8_t type; // message type
uint8_t code; // type sub-code
uint16_t checksum;
union {
struct {
uint16_t id;
uint16_t sequence;
} echo;
uint32_t gateway;
struct {
uint16_t reserved;
uint16_t mtu;
} frag;
} un;
} icmphdr_t;
typedef struct icmp_s {
uint8_t icmp_type;
uint8_t icmp_code;
uint16_t icmp_cksum;
union {
uint8_t ih_pptr;
struct in_addr ih_gwaddr;
struct ih_idseq {
uint16_t icd_id;
uint16_t icd_seq;
} ih_idseq;
uint32_t ih_void;
struct ih_pmtu {
uint16_t ipm_void;
uint16_t ipm_nextmtu;
} ih_pmtu;
struct ih_rtradv {
uint8_t irt_num_addrs;
uint8_t irt_wpa;
uint16_t irt_lifetime;
} ih_rtradv;
} icmp_hun;
#define icmp_pptr icmp_hun.ih_pptr
#define icmp_gwaddr icmp_hun.ih_gwaddr
#define icmp_id icmp_hun.ih_idseq.icd_id
#define icmp_seq icmp_hun.ih_idseq.icd_seq
#define icmp_void icmp_hun.ih_void
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
union {
struct {
uint32_t its_otime;
uint32_t its_rtime;
uint32_t its_ttime;
} id_ts;
/*
struct {
struct ip idi_ip;
} id_ip;
struct icmp_ra_addr id_radv;
*/
uint32_t id_mask;
uint8_t id_data[1];
} icmp_dun;
#define icmp_otime icmp_dun.id_ts.its_otime
#define icmp_rtime icmp_dun.id_ts.its_rtime
#define icmp_ttime icmp_dun.id_ts.its_ttime
#define icmp_ip icmp_dun.id_ip.idi_ip
#define icmp_radv icmp_dun.id_radv
#define icmp_mask icmp_dun.id_mask
#define icmp_data icmp_dun.id_data
} icmp_t;
//#endif
static inline uint16_t checksum(uint8_t* buf, int len) {
unsigned int sum = 0;
uint16_t* ptr = (uint16_t*)buf;
while(len > 1) {
sum += *ptr++;
len -= 2;
}
if(len) {
sum += *(uint8_t*)ptr;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return (uint16_t)(~sum);
};
#endif // HV_NETINET_H_