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