1*d56f51eaSDavid van Moolenbroek /* 2*d56f51eaSDavid van Moolenbroek * Copyright (c) 1993, 1994, 1997 3*d56f51eaSDavid van Moolenbroek * The Regents of the University of California. All rights reserved. 4*d56f51eaSDavid van Moolenbroek * 5*d56f51eaSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 6*d56f51eaSDavid van Moolenbroek * modification, are permitted provided that: (1) source code distributions 7*d56f51eaSDavid van Moolenbroek * retain the above copyright notice and this paragraph in its entirety, (2) 8*d56f51eaSDavid van Moolenbroek * distributions including binary code include the above copyright notice and 9*d56f51eaSDavid van Moolenbroek * this paragraph in its entirety in the documentation or other materials 10*d56f51eaSDavid van Moolenbroek * provided with the distribution, and (3) all advertising materials mentioning 11*d56f51eaSDavid van Moolenbroek * features or use of this software display the following acknowledgement: 12*d56f51eaSDavid van Moolenbroek * ``This product includes software developed by the University of California, 13*d56f51eaSDavid van Moolenbroek * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14*d56f51eaSDavid van Moolenbroek * the University nor the names of its contributors may be used to endorse 15*d56f51eaSDavid van Moolenbroek * or promote products derived from this software without specific prior 16*d56f51eaSDavid van Moolenbroek * written permission. 17*d56f51eaSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18*d56f51eaSDavid van Moolenbroek * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19*d56f51eaSDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20*d56f51eaSDavid van Moolenbroek */ 21*d56f51eaSDavid van Moolenbroek 22*d56f51eaSDavid van Moolenbroek /* 23*d56f51eaSDavid van Moolenbroek * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows 24*d56f51eaSDavid van Moolenbroek */ 25*d56f51eaSDavid van Moolenbroek 26*d56f51eaSDavid van Moolenbroek #include <winsock2.h> 27*d56f51eaSDavid van Moolenbroek 28*d56f51eaSDavid van Moolenbroek #include <ws2tcpip.h> 29*d56f51eaSDavid van Moolenbroek 30*d56f51eaSDavid van Moolenbroek #ifndef __MINGW32__ 31*d56f51eaSDavid van Moolenbroek #define IN_MULTICAST(a) IN_CLASSD(a) 32*d56f51eaSDavid van Moolenbroek #endif 33*d56f51eaSDavid van Moolenbroek 34*d56f51eaSDavid van Moolenbroek #define IN_EXPERIMENTAL(a) ((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000) 35*d56f51eaSDavid van Moolenbroek 36*d56f51eaSDavid van Moolenbroek #define IN_LOOPBACKNET 127 37*d56f51eaSDavid van Moolenbroek 38*d56f51eaSDavid van Moolenbroek #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) 39*d56f51eaSDavid van Moolenbroek /* IPv6 address */ 40*d56f51eaSDavid van Moolenbroek struct in6_addr 41*d56f51eaSDavid van Moolenbroek { 42*d56f51eaSDavid van Moolenbroek union 43*d56f51eaSDavid van Moolenbroek { 44*d56f51eaSDavid van Moolenbroek u_int8_t u6_addr8[16]; 45*d56f51eaSDavid van Moolenbroek u_int16_t u6_addr16[8]; 46*d56f51eaSDavid van Moolenbroek u_int32_t u6_addr32[4]; 47*d56f51eaSDavid van Moolenbroek } in6_u; 48*d56f51eaSDavid van Moolenbroek #define s6_addr in6_u.u6_addr8 49*d56f51eaSDavid van Moolenbroek #define s6_addr16 in6_u.u6_addr16 50*d56f51eaSDavid van Moolenbroek #define s6_addr32 in6_u.u6_addr32 51*d56f51eaSDavid van Moolenbroek #define s6_addr64 in6_u.u6_addr64 52*d56f51eaSDavid van Moolenbroek }; 53*d56f51eaSDavid van Moolenbroek 54*d56f51eaSDavid van Moolenbroek #define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } 55*d56f51eaSDavid van Moolenbroek #define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } 56*d56f51eaSDavid van Moolenbroek #endif /* __MINGW32__ */ 57*d56f51eaSDavid van Moolenbroek 58*d56f51eaSDavid van Moolenbroek 59*d56f51eaSDavid van Moolenbroek #if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)) 60*d56f51eaSDavid van Moolenbroek typedef unsigned short sa_family_t; 61*d56f51eaSDavid van Moolenbroek #endif 62*d56f51eaSDavid van Moolenbroek 63*d56f51eaSDavid van Moolenbroek 64*d56f51eaSDavid van Moolenbroek #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) 65*d56f51eaSDavid van Moolenbroek 66*d56f51eaSDavid van Moolenbroek #define __SOCKADDR_COMMON(sa_prefix) \ 67*d56f51eaSDavid van Moolenbroek sa_family_t sa_prefix##family 68*d56f51eaSDavid van Moolenbroek 69*d56f51eaSDavid van Moolenbroek /* Ditto, for IPv6. */ 70*d56f51eaSDavid van Moolenbroek struct sockaddr_in6 71*d56f51eaSDavid van Moolenbroek { 72*d56f51eaSDavid van Moolenbroek __SOCKADDR_COMMON (sin6_); 73*d56f51eaSDavid van Moolenbroek u_int16_t sin6_port; /* Transport layer port # */ 74*d56f51eaSDavid van Moolenbroek u_int32_t sin6_flowinfo; /* IPv6 flow information */ 75*d56f51eaSDavid van Moolenbroek struct in6_addr sin6_addr; /* IPv6 address */ 76*d56f51eaSDavid van Moolenbroek }; 77*d56f51eaSDavid van Moolenbroek 78*d56f51eaSDavid van Moolenbroek #define IN6_IS_ADDR_V4MAPPED(a) \ 79*d56f51eaSDavid van Moolenbroek ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \ 80*d56f51eaSDavid van Moolenbroek (((u_int32_t *) (a))[2] == htonl (0xffff))) 81*d56f51eaSDavid van Moolenbroek 82*d56f51eaSDavid van Moolenbroek #define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) 83*d56f51eaSDavid van Moolenbroek 84*d56f51eaSDavid van Moolenbroek #define IN6_IS_ADDR_LINKLOCAL(a) \ 85*d56f51eaSDavid van Moolenbroek ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) 86*d56f51eaSDavid van Moolenbroek 87*d56f51eaSDavid van Moolenbroek #define IN6_IS_ADDR_LOOPBACK(a) \ 88*d56f51eaSDavid van Moolenbroek (((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \ 89*d56f51eaSDavid van Moolenbroek ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1)) 90*d56f51eaSDavid van Moolenbroek #endif /* __MINGW32__ */ 91*d56f51eaSDavid van Moolenbroek 92*d56f51eaSDavid van Moolenbroek #define ip6_vfc ip6_ctlun.ip6_un2_vfc 93*d56f51eaSDavid van Moolenbroek #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow 94*d56f51eaSDavid van Moolenbroek #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen 95*d56f51eaSDavid van Moolenbroek #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt 96*d56f51eaSDavid van Moolenbroek #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim 97*d56f51eaSDavid van Moolenbroek #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim 98*d56f51eaSDavid van Moolenbroek 99*d56f51eaSDavid van Moolenbroek #define nd_rd_type nd_rd_hdr.icmp6_type 100*d56f51eaSDavid van Moolenbroek #define nd_rd_code nd_rd_hdr.icmp6_code 101*d56f51eaSDavid van Moolenbroek #define nd_rd_cksum nd_rd_hdr.icmp6_cksum 102*d56f51eaSDavid van Moolenbroek #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] 103*d56f51eaSDavid van Moolenbroek 104*d56f51eaSDavid van Moolenbroek /* 105*d56f51eaSDavid van Moolenbroek * IPV6 extension headers 106*d56f51eaSDavid van Moolenbroek */ 107*d56f51eaSDavid van Moolenbroek #define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ 108*d56f51eaSDavid van Moolenbroek #define IPPROTO_IPV6 41 /* IPv6 header. */ 109*d56f51eaSDavid van Moolenbroek #define IPPROTO_ROUTING 43 /* IPv6 routing header */ 110*d56f51eaSDavid van Moolenbroek #define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ 111*d56f51eaSDavid van Moolenbroek #define IPPROTO_ESP 50 /* encapsulating security payload */ 112*d56f51eaSDavid van Moolenbroek #define IPPROTO_AH 51 /* authentication header */ 113*d56f51eaSDavid van Moolenbroek #define IPPROTO_ICMPV6 58 /* ICMPv6 */ 114*d56f51eaSDavid van Moolenbroek #define IPPROTO_NONE 59 /* IPv6 no next header */ 115*d56f51eaSDavid van Moolenbroek #define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ 116*d56f51eaSDavid van Moolenbroek #define IPPROTO_PIM 103 /* Protocol Independent Multicast. */ 117*d56f51eaSDavid van Moolenbroek 118*d56f51eaSDavid van Moolenbroek #define IPV6_RTHDR_TYPE_0 0 119*d56f51eaSDavid van Moolenbroek 120*d56f51eaSDavid van Moolenbroek /* Option types and related macros */ 121*d56f51eaSDavid van Moolenbroek #define IP6OPT_PAD1 0x00 /* 00 0 00000 */ 122*d56f51eaSDavid van Moolenbroek #define IP6OPT_PADN 0x01 /* 00 0 00001 */ 123*d56f51eaSDavid van Moolenbroek #define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ 124*d56f51eaSDavid van Moolenbroek #define IP6OPT_JUMBO_LEN 6 125*d56f51eaSDavid van Moolenbroek #define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */ 126*d56f51eaSDavid van Moolenbroek 127*d56f51eaSDavid van Moolenbroek #define IP6OPT_RTALERT_LEN 4 128*d56f51eaSDavid van Moolenbroek #define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ 129*d56f51eaSDavid van Moolenbroek #define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ 130*d56f51eaSDavid van Moolenbroek #define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ 131*d56f51eaSDavid van Moolenbroek #define IP6OPT_MINLEN 2 132*d56f51eaSDavid van Moolenbroek 133*d56f51eaSDavid van Moolenbroek #define IP6OPT_BINDING_UPDATE 0xc6 /* 11 0 00110 */ 134*d56f51eaSDavid van Moolenbroek #define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */ 135*d56f51eaSDavid van Moolenbroek #define IP6OPT_BINDING_REQ 0x08 /* 00 0 01000 */ 136*d56f51eaSDavid van Moolenbroek #define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */ 137*d56f51eaSDavid van Moolenbroek #define IP6OPT_EID 0x8a /* 10 0 01010 */ 138*d56f51eaSDavid van Moolenbroek 139*d56f51eaSDavid van Moolenbroek #define IP6OPT_TYPE(o) ((o) & 0xC0) 140*d56f51eaSDavid van Moolenbroek #define IP6OPT_TYPE_SKIP 0x00 141*d56f51eaSDavid van Moolenbroek #define IP6OPT_TYPE_DISCARD 0x40 142*d56f51eaSDavid van Moolenbroek #define IP6OPT_TYPE_FORCEICMP 0x80 143*d56f51eaSDavid van Moolenbroek #define IP6OPT_TYPE_ICMP 0xC0 144*d56f51eaSDavid van Moolenbroek 145*d56f51eaSDavid van Moolenbroek #define IP6OPT_MUTABLE 0x20 146*d56f51eaSDavid van Moolenbroek 147*d56f51eaSDavid van Moolenbroek 148*d56f51eaSDavid van Moolenbroek #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) 149*d56f51eaSDavid van Moolenbroek #ifndef EAI_ADDRFAMILY 150*d56f51eaSDavid van Moolenbroek struct addrinfo { 151*d56f51eaSDavid van Moolenbroek int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ 152*d56f51eaSDavid van Moolenbroek int ai_family; /* PF_xxx */ 153*d56f51eaSDavid van Moolenbroek int ai_socktype; /* SOCK_xxx */ 154*d56f51eaSDavid van Moolenbroek int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ 155*d56f51eaSDavid van Moolenbroek size_t ai_addrlen; /* length of ai_addr */ 156*d56f51eaSDavid van Moolenbroek char *ai_canonname; /* canonical name for hostname */ 157*d56f51eaSDavid van Moolenbroek struct sockaddr *ai_addr; /* binary address */ 158*d56f51eaSDavid van Moolenbroek struct addrinfo *ai_next; /* next structure in linked list */ 159*d56f51eaSDavid van Moolenbroek }; 160*d56f51eaSDavid van Moolenbroek #endif 161*d56f51eaSDavid van Moolenbroek #endif /* __MINGW32__ */ 162