ip6.h revision 2632
19814Sandreas.hansson@arm.com/*
22292SN/A * ip6.h
310333Smitch.hayenga@arm.com *
410239Sbinhpham@cs.rutgers.edu * Internet Protocol, Version 6 (RFC 2460).
57597Sminkyu.jeong@arm.com *
67597Sminkyu.jeong@arm.com * Copyright (c) 2002 Dug Song <dugsong@monkey.org>
77597Sminkyu.jeong@arm.com *
87597Sminkyu.jeong@arm.com * $Id: ip6.h,v 1.6 2004/02/23 10:01:15 dugsong Exp $
97597Sminkyu.jeong@arm.com */
107597Sminkyu.jeong@arm.com
117597Sminkyu.jeong@arm.com#ifndef DNET_IP6_H
127597Sminkyu.jeong@arm.com#define DNET_IP6_H
137597Sminkyu.jeong@arm.com
147597Sminkyu.jeong@arm.com#define IP6_ADDR_LEN	16
157597Sminkyu.jeong@arm.com#define IP6_ADDR_BITS	128
162292SN/A
172292SN/A#define IP6_HDR_LEN	40		/* IPv6 header length */
182292SN/A#define IP6_LEN_MIN	IP6_HDR_LEN
192292SN/A#define IP6_LEN_MAX	65535		/* non-jumbo payload */
202292SN/A
212292SN/A#define IP6_MTU_MIN	1280		/* minimum MTU (1024 + 256) */
222292SN/A
232292SN/Atypedef struct ip6_addr {
242292SN/A        uint8_t         data[IP6_ADDR_LEN];
252292SN/A} ip6_addr_t;
262292SN/A
272292SN/A#ifndef __GNUC__
282292SN/A# define __attribute__(x)
292292SN/A# pragma pack(1)
302292SN/A#endif
312292SN/A
322292SN/A/*
332292SN/A * IPv6 header
342292SN/A */
352292SN/Astruct ip6_hdr {
362292SN/A        union {
372292SN/A                struct ip6_hdr_ctl {
382292SN/A                        uint32_t	ip6_un1_flow; /* 20 bits of flow ID */
392292SN/A                        uint16_t	ip6_un1_plen; /* payload length */
402292SN/A                        uint8_t		ip6_un1_nxt;  /* next header */
412689Sktlim@umich.edu                        uint8_t		ip6_un1_hlim; /* hop limit */
422689Sktlim@umich.edu                } ip6_un1;
432689Sktlim@umich.edu                uint8_t	ip6_un2_vfc;	/* 4 bits version, top 4 bits class */
442292SN/A        } ip6_ctlun;
452292SN/A        ip6_addr_t	ip6_src;
469944Smatt.horsnell@ARM.com        ip6_addr_t	ip6_dst;
479944Smatt.horsnell@ARM.com} __attribute__((__packed__));
489944Smatt.horsnell@ARM.com
498591Sgblack@eecs.umich.edu#define ip6_vfc		ip6_ctlun.ip6_un2_vfc
503326Sktlim@umich.edu#define ip6_flow	ip6_ctlun.ip6_un1.ip6_un1_flow
518229Snate@binkert.org#define ip6_plen	ip6_ctlun.ip6_un1.ip6_un1_plen
526658Snate@binkert.org#define ip6_nxt		ip6_ctlun.ip6_un1.ip6_un1_nxt	/* IP_PROTO_* */
538887Sgeoffrey.blake@arm.com#define ip6_hlim	ip6_ctlun.ip6_un1.ip6_un1_hlim
542907Sktlim@umich.edu
552292SN/A#define IP6_VERSION		0x60
568232Snate@binkert.org#define IP6_VERSION_MASK	0xf0		/* ip6_vfc version */
578232Snate@binkert.org
588232Snate@binkert.org#if DNET_BYTESEX == DNET_BIG_ENDIAN
599527SMatt.Horsnell@arm.com#define IP6_FLOWINFO_MASK	0x0fffffff	/* ip6_flow info (28 bits) */
602722Sktlim@umich.edu#define IP6_FLOWLABEL_MASK	0x000fffff	/* ip6_flow label (20 bits) */
612669Sktlim@umich.edu#elif DNET_BYTESEX == DNET_LIL_ENDIAN
622292SN/A#define IP6_FLOWINFO_MASK	0xffffff0f	/* ip6_flow info (28 bits) */
632669Sktlim@umich.edu#define IP6_FLOWLABEL_MASK	0xffff0f00	/* ip6_flow label (20 bits) */
642678Sktlim@umich.edu#endif
652678Sktlim@umich.edu
668581Ssteve.reinhardt@amd.com/*
678581Ssteve.reinhardt@amd.com * Hop limit (ip6_hlim)
682292SN/A */
692292SN/A#define IP6_HLIM_DEFAULT	64
702292SN/A#define IP6_HLIM_MAX		255
712669Sktlim@umich.edu
722292SN/A/*
732678Sktlim@umich.edu * Preferred extension header order from RFC 2460, 4.1:
742292SN/A *
759444SAndreas.Sandberg@ARM.com * IP_PROTO_IPV6, IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS, IP_PROTO_ROUTING,
769444SAndreas.Sandberg@ARM.com * IP_PROTO_FRAGMENT, IP_PROTO_AH, IP_PROTO_ESP, IP_PROTO_DSTOPTS, IP_PROTO_*
779444SAndreas.Sandberg@ARM.com */
784319Sktlim@umich.edu
794319Sktlim@umich.edu/*
804319Sktlim@umich.edu * Routing header data (IP_PROTO_ROUTING)
814319Sktlim@umich.edu */
824319Sktlim@umich.edustruct ip6_ext_data_routing {
832678Sktlim@umich.edu        uint8_t  type;			/* routing type */
842678Sktlim@umich.edu        uint8_t  segleft;		/* segments left */
852292SN/A        /* followed by routing type specific data */
862678Sktlim@umich.edu} __attribute__((__packed__));
872678Sktlim@umich.edu
885336Shines@cs.fsu.edustruct ip6_ext_data_routing0 {
892678Sktlim@umich.edu        uint8_t  type;			/* always zero */
904873Sstever@eecs.umich.edu        uint8_t  segleft;		/* segments left */
912678Sktlim@umich.edu        uint8_t  reserved;		/* reserved field */
922292SN/A        uint8_t  slmap[3];		/* strict/loose bit map */
932678Sktlim@umich.edu        ip6_addr_t  addr[1];		/* up to 23 addresses */
942678Sktlim@umich.edu} __attribute__((__packed__));
952678Sktlim@umich.edu
962678Sktlim@umich.edu/*
972678Sktlim@umich.edu * Fragment header data (IP_PROTO_FRAGMENT)
982678Sktlim@umich.edu */
997852SMatt.Horsnell@arm.comstruct ip6_ext_data_fragment {
1007852SMatt.Horsnell@arm.com        uint16_t  offlg;		/* offset, reserved, and flag */
1012344SN/A        uint32_t  ident;		/* identification */
10210333Smitch.hayenga@arm.com} __attribute__((__packed__));
10310333Smitch.hayenga@arm.com
10410333Smitch.hayenga@arm.com/*
10510333Smitch.hayenga@arm.com * Fragmentation offset, reserved, and flags (offlg)
10610333Smitch.hayenga@arm.com */
10710333Smitch.hayenga@arm.com#if DNET_BYTESEX == DNET_BIG_ENDIAN
10810333Smitch.hayenga@arm.com#define IP6_OFF_MASK		0xfff8	/* mask out offset from offlg */
10910333Smitch.hayenga@arm.com#define IP6_RESERVED_MASK	0x0006	/* reserved bits in offlg */
1102678Sktlim@umich.edu#define IP6_MORE_FRAG		0x0001	/* more-fragments flag */
1116974Stjones1@inf.ed.ac.uk#elif DNET_BYTESEX == DNET_LIL_ENDIAN
1126974Stjones1@inf.ed.ac.uk#define IP6_OFF_MASK		0xf8ff	/* mask out offset from offlg */
1136974Stjones1@inf.ed.ac.uk#define IP6_RESERVED_MASK	0x0600	/* reserved bits in offlg */
1146974Stjones1@inf.ed.ac.uk#define IP6_MORE_FRAG		0x0100	/* more-fragments flag */
1156974Stjones1@inf.ed.ac.uk#endif
1169444SAndreas.Sandberg@ARM.com
11710327Smitch.hayenga@arm.com/*
1182678Sktlim@umich.edu * Option types, for IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS headers
1196974Stjones1@inf.ed.ac.uk */
1206974Stjones1@inf.ed.ac.uk#define IP6_OPT_PAD1		0x00	/* 00 0 00000 */
1216974Stjones1@inf.ed.ac.uk#define IP6_OPT_PADN		0x01	/* 00 0 00001 */
1226974Stjones1@inf.ed.ac.uk#define IP6_OPT_JUMBO		0xC2	/* 11 0 00010 = 194 */
1236974Stjones1@inf.ed.ac.uk#define IP6_OPT_JUMBO_LEN	6
1246974Stjones1@inf.ed.ac.uk#define IP6_OPT_RTALERT		0x05	/* 00 0 00101 */
1252678Sktlim@umich.edu#define IP6_OPT_RTALERT_LEN	4
1262678Sktlim@umich.edu#define IP6_OPT_RTALERT_MLD	0	/* Datagram contains an MLD message */
1272678Sktlim@umich.edu#define IP6_OPT_RTALERT_RSVP	1	/* Datagram contains an RSVP message */
1282678Sktlim@umich.edu#define IP6_OPT_RTALERT_ACTNET	2 	/* contains an Active Networks msg */
1292678Sktlim@umich.edu#define IP6_OPT_LEN_MIN		2
1302344SN/A
1312307SN/A#define IP6_OPT_TYPE(o)		((o) & 0xC0)	/* high 2 bits of opt_type */
1326974Stjones1@inf.ed.ac.uk#define IP6_OPT_TYPE_SKIP	0x00	/* continue processing on failure */
1336974Stjones1@inf.ed.ac.uk#define IP6_OPT_TYPE_DISCARD	0x40	/* discard packet on failure */
1346974Stjones1@inf.ed.ac.uk#define IP6_OPT_TYPE_FORCEICMP	0x80	/* discard and send ICMP on failure */
1356974Stjones1@inf.ed.ac.uk#define IP6_OPT_TYPE_ICMP	0xC0	/* ...only if non-multicast dst */
13610020Smatt.horsnell@ARM.com
13710020Smatt.horsnell@ARM.com#define IP6_OPT_MUTABLE		0x20	/* option data may change en route */
13810023Smatt.horsnell@ARM.com
13910023Smatt.horsnell@ARM.com/*
1402678Sktlim@umich.edu * Extension header (chained via {ip6,ext}_nxt, following IPv6 header)
1412292SN/A */
1422292SN/Astruct ip6_ext_hdr {
1432292SN/A        uint8_t  ext_nxt;	/* next header */
1442292SN/A        uint8_t  ext_len;	/* following length in units of 8 octets */
1458545Ssaidi@eecs.umich.edu        union {
14610333Smitch.hayenga@arm.com                struct ip6_ext_data_routing	routing;
1472292SN/A                struct ip6_ext_data_fragment	fragment;
1482292SN/A        } ext_data;
1492292SN/A} __attribute__((__packed__));
1502292SN/A
1512292SN/A#ifndef __GNUC__
1525529Snate@binkert.org# pragma pack()
1535529Snate@binkert.org#endif
1545529Snate@binkert.org
1552292SN/A/*
1564329Sktlim@umich.edu * Reserved addresses
1574329Sktlim@umich.edu */
1584329Sktlim@umich.edu#define IP6_ADDR_UNSPEC	\
1592907Sktlim@umich.edu        "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1602907Sktlim@umich.edu#define IP6_ADDR_LOOPBACK \
1612292SN/A        "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
1622292SN/A
16310175SMitch.Hayenga@ARM.com#define ip6_pack_hdr(hdr, fc, fl, plen, nxt, hlim, src, dst) do {	\
16410175SMitch.Hayenga@ARM.com        struct ip6_hdr *ip6 = (struct ip6_hdr *)(hdr);			\
1652329SN/A        ip6->ip6_flow = htonl(((uint32_t)(fc) << 28) &			\
1662329SN/A            (IP6_FLOWLABEL_MASK | (fl)));				\
1672329SN/A        ip6->ip6_vfc = (IP6_VERSION | ((fc) >> 4));			\
1682292SN/A        ip6->ip6_plen = htons((plen));					\
1699936SFaissal.Sleiman@arm.com        ip6->ip6_nxt = (nxt); ip6->ip6_hlim = (hlim);			\
1709936SFaissal.Sleiman@arm.com        memmove(&ip6->ip6_src, &(src), IP6_ADDR_LEN);			\
1719936SFaissal.Sleiman@arm.com        memmove(&ip6->ip6_dst, &(dst), IP6_ADDR_LEN);			\
1729936SFaissal.Sleiman@arm.com} while (0);
1732292SN/A
1742292SN/A__BEGIN_DECLS
1752292SN/Achar	*ip6_ntop(const ip6_addr_t *ip6, char *dst, size_t size);
1768199SAli.Saidi@ARM.comint	 ip6_pton(const char *src, ip6_addr_t *dst);
1778199SAli.Saidi@ARM.comchar	*ip6_ntoa(const ip6_addr_t *ip6);
1789444SAndreas.Sandberg@ARM.com#define	 ip6_aton ip6_pton
1799444SAndreas.Sandberg@ARM.com
1809444SAndreas.Sandberg@ARM.comvoid	 ip6_checksum(void *buf, size_t len);
1819444SAndreas.Sandberg@ARM.com__END_DECLS
1829444SAndreas.Sandberg@ARM.com
1839444SAndreas.Sandberg@ARM.com#endif /* DNET_IP6_H */
1849444SAndreas.Sandberg@ARM.com