headers.h 5.38 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
Antoine Kaufmann's avatar
Antoine Kaufmann committed
38
39
40

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

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

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

52
#define IPH_V(hdr) ((hdr)->_v_hl >> 4)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
53
54
55
56
57
58
59
60
61
62
#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

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

72
73
74
75
#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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

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
97
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
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

/******************************************************************************/
/* 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
130
#define TCP_NS 0x100U
Antoine Kaufmann's avatar
Antoine Kaufmann committed
131
132
133
134
135
136
137

#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)
138
139
140
141
142
143
144
145
146
#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
147
#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) \
148
  (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags))
Antoine Kaufmann's avatar
Antoine Kaufmann committed
149

150
151
152
153
154
#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
155

156
157
#define TCP_TCPLEN(seg) \
  ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0))
Antoine Kaufmann's avatar
Antoine Kaufmann committed
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

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));

/******************************************************************************/
/* whole packets */

struct pkt_arp {
  struct eth_hdr eth;
  struct arp_hdr arp;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
186
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
187
188
189

struct pkt_ip {
  struct eth_hdr eth;
190
  struct ip_hdr ip;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
191
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
192
193
194

struct pkt_tcp {
  struct eth_hdr eth;
195
  struct ip_hdr ip;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
196
  struct tcp_hdr tcp;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
197
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
198
199
200

struct pkt_udp {
  struct eth_hdr eth;
201
  struct ip_hdr ip;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
202
  struct udp_hdr udp;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
203
} __attribute__((packed));
Antoine Kaufmann's avatar
Antoine Kaufmann committed
204

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