headers.h 6.08 KB
Newer Older
Antoine Kaufmann's avatar
Antoine Kaufmann committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * Copyright 2021 Max Planck Institute for Software Systems, and
 * National University of Singapore
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

Antoine Kaufmann's avatar
Antoine Kaufmann committed
25
26
27
28
29
30
31
32
33
34
35
#pragma once

#include <stdint.h>

namespace headers {

/******************************************************************************/
/* Ethernet */

#define ETH_ADDR_LEN 6

36
37
#define ETH_TYPE_IP 0x0800
#define ETH_TYPE_ARP 0x0806
38
#define ETH_TYPE_PTP 0x88F7
Antoine Kaufmann's avatar
Antoine Kaufmann committed
39
40
41

struct eth_addr {
  uint8_t addr[ETH_ADDR_LEN];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
42
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
43
44
45
46
47

struct eth_hdr {
  struct eth_addr dest;
  struct eth_addr src;
  uint16_t type;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
48
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
49
50
51
52

/******************************************************************************/
/* IPv4 */

53
#define IPH_V(hdr) ((hdr)->_v_hl >> 4)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
54
55
56
57
58
59
60
61
62
63
#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f)
#define IPH_TOS(hdr) ((hdr)->_tos)
#define IPH_ECN(hdr) ((hdr)->_tos & 0x3)

#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (((v) << 4) | (hl))
#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos)
#define IPH_ECN_SET(hdr, e) (hdr)->_tos = ((hdr)->_tos & 0xffc) | (e)

#define IP_HLEN 20

64
65
66
#define IP_PROTO_IP 0
#define IP_PROTO_ICMP 1
#define IP_PROTO_IGMP 2
Antoine Kaufmann's avatar
Antoine Kaufmann committed
67
#define IP_PROTO_IPENCAP 4
68
#define IP_PROTO_UDP 17
Antoine Kaufmann's avatar
Antoine Kaufmann committed
69
#define IP_PROTO_UDPLITE 136
70
71
#define IP_PROTO_TCP 6
#define IP_PROTO_DCCP 33
Antoine Kaufmann's avatar
Antoine Kaufmann committed
72

73
74
75
76
#define IP_ECN_NONE 0x0
#define IP_ECN_ECT0 0x2
#define IP_ECN_ECT1 0x1
#define IP_ECN_CE 0x3
Antoine Kaufmann's avatar
Antoine Kaufmann committed
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

struct ip_hdr {
  /* version / header length */
  uint8_t _v_hl;
  /* type of service */
  uint8_t _tos;
  /* total length */
  uint16_t len;
  /* identification */
  uint16_t id;
  /* fragment offset field */
  uint16_t offset;
  /* time to live */
  uint8_t ttl;
  /* protocol*/
  uint8_t proto;
  /* checksum */
  uint16_t chksum;
  /* source and destination IP addresses */
  uint32_t src;
  uint32_t dest;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
98
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
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

/******************************************************************************/
/* ARP */

#define ARP_OPER_REQUEST 1
#define ARP_OPER_REPLY 2
#define ARP_HTYPE_ETHERNET 1
#define ARP_PTYPE_IPV4 0x0800

struct arp_hdr {
  uint16_t htype;
  uint16_t ptype;
  uint8_t hlen;
  uint8_t plen;
  uint16_t oper;
  struct eth_addr sha;
  uint32_t spa;
  struct eth_addr tha;
  uint32_t tpa;
} __attribute__((packed));

/******************************************************************************/
/* TCP */

#define TCP_FIN 0x01U
#define TCP_SYN 0x02U
#define TCP_RST 0x04U
#define TCP_PSH 0x08U
#define TCP_ACK 0x10U
#define TCP_URG 0x20U
#define TCP_ECE 0x40U
#define TCP_CWR 0x80U
131
#define TCP_NS 0x100U
Antoine Kaufmann's avatar
Antoine Kaufmann committed
132
133
134
135
136
137
138

#define TCP_FLAGS 0x1ffU

/* Length of the TCP header, excluding options. */
#define TCP_HLEN 20

#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)
139
140
141
142
143
144
145
146
147
#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)

#define TCPH_HDRLEN_SET(phdr, len) \
  (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr))
#define TCPH_FLAGS_SET(phdr, flags)                     \
  (phdr)->_hdrlen_rsvd_flags =                          \
      (((phdr)->_hdrlen_rsvd_flags &                    \
        PP_HTONS((uint16_t)(~(uint16_t)(TCP_FLAGS)))) | \
       htons(flags))
Antoine Kaufmann's avatar
Antoine Kaufmann committed
148
#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) \
149
  (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags))
Antoine Kaufmann's avatar
Antoine Kaufmann committed
150

151
152
153
154
155
#define TCPH_SET_FLAG(phdr, flags) \
  (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags))
#define TCPH_UNSET_FLAG(phdr, flags) \
  (phdr)->_hdrlen_rsvd_flags =       \
      htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)))
Antoine Kaufmann's avatar
Antoine Kaufmann committed
156

157
158
#define TCP_TCPLEN(seg) \
  ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0))
Antoine Kaufmann's avatar
Antoine Kaufmann committed
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180

struct tcp_hdr {
  uint16_t src;
  uint16_t dest;
  uint32_t seqno;
  uint32_t ackno;
  uint16_t _hdrlen_rsvd_flags;
  uint16_t wnd;
  uint16_t chksum;
  uint16_t urgp;
} __attribute__((packed));

/******************************************************************************/
/* UDP */

struct udp_hdr {
  uint16_t src;
  uint16_t dest;
  uint16_t len;
  uint16_t chksum;
} __attribute__((packed));

181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/******************************************************************************/
/* PTP */

struct ptp_v1_hdr {
  uint16_t version_ptp;
  uint16_t version_network;
  uint8_t subdomain;
  uint8_t _rsvd0[15];
  uint8_t msg_type;
  uint8_t src_comm_tech;
  uint8_t src_uuid[6];
  uint16_t src_portid;
  uint16_t seq_id;
  uint8_t ctrl;
  uint8_t _rsvd1;
  uint16_t flags;
} __attribute__((packed));

struct ptp_v2_hdr {
  uint8_t msg_type;
  uint8_t version_ptp;
  uint16_t msg_len;
  uint8_t subdomain;
  uint8_t _rsvd0;
  uint16_t flags;
  uint64_t correction;
  uint32_t _rsvd1;
  uint8_t src_port_id[10];
  uint16_t seq_id;
  uint8_t ctrl;
  uint8_t log_msg_period;
} __attribute__((packed));

Antoine Kaufmann's avatar
Antoine Kaufmann committed
214
215
216
217
218
219
/******************************************************************************/
/* whole packets */

struct pkt_arp {
  struct eth_hdr eth;
  struct arp_hdr arp;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
220
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
221
222
223

struct pkt_ip {
  struct eth_hdr eth;
224
  struct ip_hdr ip;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
225
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
226
227
228

struct pkt_tcp {
  struct eth_hdr eth;
229
  struct ip_hdr ip;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
230
  struct tcp_hdr tcp;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
231
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
232
233
234

struct pkt_udp {
  struct eth_hdr eth;
235
  struct ip_hdr ip;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
236
  struct udp_hdr udp;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
237
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
238

Antoine Kaufmann's avatar
Antoine Kaufmann committed
239
}  // namespace headers