1/* netinet/ip.h
2 * definitions for ipv4 protocol
3 */
4
5#ifndef _NETINET_IP_H
6#define _NETINET_IP_H
7
8#include <netinet/in.h>
9#include <stdint.h>
10
11/* Based on RFC 791 */
12
13#define IPVERSION 4
14
15struct ip {
16#if 	BYTE_ORDER == BIG_ENDIAN
17	uint8_t			ip_v:4;
18	uint8_t			ip_hl:4;
19#elif	BYTE_ORDER == LITTLE_ENDIAN
20	uint8_t			ip_hl:4;
21	uint8_t			ip_v:4;
22#endif
23	uint8_t			ip_tos;
24	uint16_t		ip_len;
25	uint16_t		ip_id;
26	int16_t			ip_off;
27	uint8_t			ip_ttl;
28	uint8_t			ip_p;
29	uint16_t		ip_sum;
30	struct in_addr	ip_src;
31	struct in_addr 	ip_dst;
32} _PACKED;
33
34#define IP_MAXPACKET   65535/* Maximum packet size */
35
36/* IP Type of Service */
37#define IPTOS_RELIABILITY   0x04
38#define IPTOS_THROUGHPUT    0x08
39#define IPTOS_LOWDELAY      0x10
40
41/*
42 * Definitions for options.
43 */
44#define IPOPT_COPIED(o)((o)&0x80)
45#define IPOPT_CLASS(o)((o)&0x60)
46#define IPOPT_NUMBER(o)((o)&0x1f)
47
48#define IPOPT_CONTROL            0x00
49#define IPOPT_RESERVED1          0x20
50#define IPOPT_DEBMEAS            0x40
51#define IPOPT_RESERVED2          0x60
52
53#define IPOPT_EOL                   0/* end of option list */
54#define IPOPT_NOP                   1/* no operation */
55
56#define IPOPT_RR                    7/* record packet route */
57#define IPOPT_TS                   68/* timestamp */
58#define IPOPT_SECURITY            130/* provide s,c,h,tcc */
59#define IPOPT_LSRR                131/* loose source route */
60#define IPOPT_SATID               136/* satnet id */
61#define IPOPT_SSRR                137/* strict source route */
62
63/*
64 * Offsets to fields in options other than EOL and NOP.
65 */
66#define IPOPT_OPTVAL                0/* option ID */
67#define IPOPT_OLEN                  1/* option length */
68#define IPOPT_OFFSET                2/* offset within option */
69#define IPOPT_MINOFF                4/* min value of above */
70
71struct  ip_timestamp {
72	uint8_t	ipt_code;/* IPOPT_TS */
73	uint8_t	ipt_len;/* size of structure (variable) */
74	uint8_t	ipt_ptr;/* index of current entry */
75#if 	BYTE_ORDER == BIG_ENDIAN
76	uint8_t	ipt_oflw:4,
77			ipt_flg:4;
78#elif	BYTE_ORDER == LITTLE_ENDIAN
79	uint8_t	ipt_flg:4,
80			ipt_oflw:4;
81#endif
82	union ipt_timestamp {
83		uint32_t ipt_time[1];
84		struct ipt_ta {
85			struct in_addr ipt_addr;
86			uint32_t ipt_time;
87		} ipt_ta;
88	} ipt_timestamp;
89};
90
91/* flag bits for ipt_flg */
92#define IPOPT_TS_TSONLY      0/* timestamps only */
93#define IPOPT_TS_TSANDADDR   1/* timestamps and addresses */
94#define IPOPT_TS_PRESPEC     3/* specified modules only */
95
96/* bits for security (not byte swapped) */
97#define IPOPT_SECUR_UNCLASS     0x0000
98#define IPOPT_SECUR_CONFID      0xf135
99#define IPOPT_SECUR_EFTO        0x789a
100#define IPOPT_SECUR_MMMM        0xbc4d
101#define IPOPT_SECUR_RESTR       0xaf13
102#define IPOPT_SECUR_SECRET      0xd788
103#define IPOPT_SECUR_TOPSECRET   0x6bc5
104
105#define MAXTTL                  255/* maximum time to live (seconds) */
106#define IPDEFTTL                64/* default ttl, from RFC 1340 */
107#define IPFRAGTTL               60/* time to live for frags, slowhz */
108#define IPTTLDEC                1/* subtracted when forwarding */
109
110#define IP_MSS                  576/* default maximum segment size */
111
112struct ippseudo {
113	struct    in_addr ippseudo_src; /* source internet address */
114	struct    in_addr ippseudo_dst; /* destination internet address */
115	uint8_t   ippseudo_pad;/* pad, must be zero */
116	uint8_t   ippseudo_p;/* protocol */
117	uint16_t  ippseudo_len;/* protocol length */
118};
119
120/* Fragment flags */
121#define IP_DF 0x4000        /* don't fragment */
122#define IP_MF 0x2000        /* more fragments */
123#define IP_OFFMASK 0x1fff
124
125#endif /* NETINET_IP_H */
126