xref: /linux/include/linux/ip.h (revision b0061ce49c83657563b64ffcf1ec137110230d93)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * INET		An implementation of the TCP/IP protocol suite for the LINUX
31da177e4SLinus Torvalds  *		operating system.  INET is implemented using the  BSD Socket
41da177e4SLinus Torvalds  *		interface as the means of communication with the user level.
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  *		Definitions for the IP protocol.
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * Version:	@(#)ip.h	1.0.2	04/28/93
91da177e4SLinus Torvalds  *
101da177e4SLinus Torvalds  * Authors:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  *		This program is free software; you can redistribute it and/or
131da177e4SLinus Torvalds  *		modify it under the terms of the GNU General Public License
141da177e4SLinus Torvalds  *		as published by the Free Software Foundation; either version
151da177e4SLinus Torvalds  *		2 of the License, or (at your option) any later version.
161da177e4SLinus Torvalds  */
171da177e4SLinus Torvalds #ifndef _LINUX_IP_H
181da177e4SLinus Torvalds #define _LINUX_IP_H
1914c85021SArnaldo Carvalho de Melo #include <linux/types.h>
201da177e4SLinus Torvalds #include <asm/byteorder.h>
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds #define IPTOS_TOS_MASK		0x1E
231da177e4SLinus Torvalds #define IPTOS_TOS(tos)		((tos)&IPTOS_TOS_MASK)
241da177e4SLinus Torvalds #define	IPTOS_LOWDELAY		0x10
251da177e4SLinus Torvalds #define	IPTOS_THROUGHPUT	0x08
261da177e4SLinus Torvalds #define	IPTOS_RELIABILITY	0x04
271da177e4SLinus Torvalds #define	IPTOS_MINCOST		0x02
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds #define IPTOS_PREC_MASK		0xE0
301da177e4SLinus Torvalds #define IPTOS_PREC(tos)		((tos)&IPTOS_PREC_MASK)
311da177e4SLinus Torvalds #define IPTOS_PREC_NETCONTROL           0xe0
321da177e4SLinus Torvalds #define IPTOS_PREC_INTERNETCONTROL      0xc0
331da177e4SLinus Torvalds #define IPTOS_PREC_CRITIC_ECP           0xa0
341da177e4SLinus Torvalds #define IPTOS_PREC_FLASHOVERRIDE        0x80
351da177e4SLinus Torvalds #define IPTOS_PREC_FLASH                0x60
361da177e4SLinus Torvalds #define IPTOS_PREC_IMMEDIATE            0x40
371da177e4SLinus Torvalds #define IPTOS_PREC_PRIORITY             0x20
381da177e4SLinus Torvalds #define IPTOS_PREC_ROUTINE              0x00
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds /* IP options */
421da177e4SLinus Torvalds #define IPOPT_COPY		0x80
431da177e4SLinus Torvalds #define IPOPT_CLASS_MASK	0x60
441da177e4SLinus Torvalds #define IPOPT_NUMBER_MASK	0x1f
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds #define	IPOPT_COPIED(o)		((o)&IPOPT_COPY)
471da177e4SLinus Torvalds #define	IPOPT_CLASS(o)		((o)&IPOPT_CLASS_MASK)
481da177e4SLinus Torvalds #define	IPOPT_NUMBER(o)		((o)&IPOPT_NUMBER_MASK)
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds #define	IPOPT_CONTROL		0x00
511da177e4SLinus Torvalds #define	IPOPT_RESERVED1		0x20
521da177e4SLinus Torvalds #define	IPOPT_MEASUREMENT	0x40
531da177e4SLinus Torvalds #define	IPOPT_RESERVED2		0x60
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds #define IPOPT_END	(0 |IPOPT_CONTROL)
561da177e4SLinus Torvalds #define IPOPT_NOOP	(1 |IPOPT_CONTROL)
571da177e4SLinus Torvalds #define IPOPT_SEC	(2 |IPOPT_CONTROL|IPOPT_COPY)
581da177e4SLinus Torvalds #define IPOPT_LSRR	(3 |IPOPT_CONTROL|IPOPT_COPY)
591da177e4SLinus Torvalds #define IPOPT_TIMESTAMP	(4 |IPOPT_MEASUREMENT)
6011a03f78SPaul Moore #define IPOPT_CIPSO	(6 |IPOPT_CONTROL|IPOPT_COPY)
611da177e4SLinus Torvalds #define IPOPT_RR	(7 |IPOPT_CONTROL)
621da177e4SLinus Torvalds #define IPOPT_SID	(8 |IPOPT_CONTROL|IPOPT_COPY)
631da177e4SLinus Torvalds #define IPOPT_SSRR	(9 |IPOPT_CONTROL|IPOPT_COPY)
641da177e4SLinus Torvalds #define IPOPT_RA	(20|IPOPT_CONTROL|IPOPT_COPY)
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds #define IPVERSION	4
671da177e4SLinus Torvalds #define MAXTTL		255
681da177e4SLinus Torvalds #define IPDEFTTL	64
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds #define IPOPT_OPTVAL 0
711da177e4SLinus Torvalds #define IPOPT_OLEN   1
721da177e4SLinus Torvalds #define IPOPT_OFFSET 2
731da177e4SLinus Torvalds #define IPOPT_MINOFF 4
741da177e4SLinus Torvalds #define MAX_IPOPTLEN 40
751da177e4SLinus Torvalds #define IPOPT_NOP IPOPT_NOOP
761da177e4SLinus Torvalds #define IPOPT_EOL IPOPT_END
771da177e4SLinus Torvalds #define IPOPT_TS  IPOPT_TIMESTAMP
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds #define	IPOPT_TS_TSONLY		0		/* timestamps only */
801da177e4SLinus Torvalds #define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
811da177e4SLinus Torvalds #define	IPOPT_TS_PRESPEC	3		/* specified modules only */
821da177e4SLinus Torvalds 
830a69452cSDiego Beltrami #define IPV4_BEET_PHMAXLEN 8
840a69452cSDiego Beltrami 
851da177e4SLinus Torvalds struct iphdr {
861da177e4SLinus Torvalds #if defined(__LITTLE_ENDIAN_BITFIELD)
871da177e4SLinus Torvalds 	__u8	ihl:4,
881da177e4SLinus Torvalds 		version:4;
891da177e4SLinus Torvalds #elif defined (__BIG_ENDIAN_BITFIELD)
901da177e4SLinus Torvalds 	__u8	version:4,
911da177e4SLinus Torvalds   		ihl:4;
921da177e4SLinus Torvalds #else
931da177e4SLinus Torvalds #error	"Please fix <asm/byteorder.h>"
941da177e4SLinus Torvalds #endif
951da177e4SLinus Torvalds 	__u8	tos;
9676ab608dSAlexey Dobriyan 	__be16	tot_len;
9776ab608dSAlexey Dobriyan 	__be16	id;
9876ab608dSAlexey Dobriyan 	__be16	frag_off;
991da177e4SLinus Torvalds 	__u8	ttl;
1001da177e4SLinus Torvalds 	__u8	protocol;
1019981a0e3SAl Viro 	__sum16	check;
10276ab608dSAlexey Dobriyan 	__be32	saddr;
10376ab608dSAlexey Dobriyan 	__be32	daddr;
1041da177e4SLinus Torvalds 	/*The options start here. */
1051da177e4SLinus Torvalds };
1061da177e4SLinus Torvalds 
107eddc9ec5SArnaldo Carvalho de Melo #ifdef __KERNEL__
108eddc9ec5SArnaldo Carvalho de Melo #include <linux/skbuff.h>
109eddc9ec5SArnaldo Carvalho de Melo 
110eddc9ec5SArnaldo Carvalho de Melo static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
111eddc9ec5SArnaldo Carvalho de Melo {
112eddc9ec5SArnaldo Carvalho de Melo 	return (struct iphdr *)skb_network_header(skb);
113eddc9ec5SArnaldo Carvalho de Melo }
114*b0061ce4SArnaldo Carvalho de Melo 
115*b0061ce4SArnaldo Carvalho de Melo static inline struct iphdr *ipip_hdr(const struct sk_buff *skb)
116*b0061ce4SArnaldo Carvalho de Melo {
117*b0061ce4SArnaldo Carvalho de Melo 	return (struct iphdr *)skb->h.raw;
118*b0061ce4SArnaldo Carvalho de Melo }
119eddc9ec5SArnaldo Carvalho de Melo #endif
120eddc9ec5SArnaldo Carvalho de Melo 
1211da177e4SLinus Torvalds struct ip_auth_hdr {
1221da177e4SLinus Torvalds 	__u8  nexthdr;
1231da177e4SLinus Torvalds 	__u8  hdrlen;		/* This one is measured in 32 bit units! */
124046d0331SAl Viro 	__be16 reserved;
125046d0331SAl Viro 	__be32 spi;
126046d0331SAl Viro 	__be32 seq_no;		/* Sequence number */
1271da177e4SLinus Torvalds 	__u8  auth_data[0];	/* Variable len but >=4. Mind the 64 bit alignment! */
1281da177e4SLinus Torvalds };
1291da177e4SLinus Torvalds 
1301da177e4SLinus Torvalds struct ip_esp_hdr {
131046d0331SAl Viro 	__be32 spi;
132046d0331SAl Viro 	__be32 seq_no;		/* Sequence number */
1331da177e4SLinus Torvalds 	__u8  enc_data[0];	/* Variable len but >=8. Mind the 64 bit alignment! */
1341da177e4SLinus Torvalds };
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds struct ip_comp_hdr {
1371da177e4SLinus Torvalds 	__u8 nexthdr;
1381da177e4SLinus Torvalds 	__u8 flags;
139046d0331SAl Viro 	__be16 cpi;
1401da177e4SLinus Torvalds };
1411da177e4SLinus Torvalds 
1420a69452cSDiego Beltrami struct ip_beet_phdr {
1430a69452cSDiego Beltrami 	__u8 nexthdr;
1440a69452cSDiego Beltrami 	__u8 hdrlen;
1450a69452cSDiego Beltrami 	__u8 padlen;
1460a69452cSDiego Beltrami 	__u8 reserved;
1470a69452cSDiego Beltrami };
1480a69452cSDiego Beltrami 
1491da177e4SLinus Torvalds #endif	/* _LINUX_IP_H */
150