1*5d5fbe79SDavid van Moolenbroek /** 2*5d5fbe79SDavid van Moolenbroek * @file 3*5d5fbe79SDavid van Moolenbroek * ICMP6 protocol definitions 4*5d5fbe79SDavid van Moolenbroek */ 5*5d5fbe79SDavid van Moolenbroek 6*5d5fbe79SDavid van Moolenbroek /* 7*5d5fbe79SDavid van Moolenbroek * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 8*5d5fbe79SDavid van Moolenbroek * All rights reserved. 9*5d5fbe79SDavid van Moolenbroek * 10*5d5fbe79SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without modification, 11*5d5fbe79SDavid van Moolenbroek * are permitted provided that the following conditions are met: 12*5d5fbe79SDavid van Moolenbroek * 13*5d5fbe79SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright notice, 14*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer. 15*5d5fbe79SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright notice, 16*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer in the documentation 17*5d5fbe79SDavid van Moolenbroek * and/or other materials provided with the distribution. 18*5d5fbe79SDavid van Moolenbroek * 3. The name of the author may not be used to endorse or promote products 19*5d5fbe79SDavid van Moolenbroek * derived from this software without specific prior written permission. 20*5d5fbe79SDavid van Moolenbroek * 21*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 22*5d5fbe79SDavid van Moolenbroek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23*5d5fbe79SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 24*5d5fbe79SDavid van Moolenbroek * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25*5d5fbe79SDavid van Moolenbroek * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 26*5d5fbe79SDavid van Moolenbroek * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*5d5fbe79SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*5d5fbe79SDavid van Moolenbroek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29*5d5fbe79SDavid van Moolenbroek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 30*5d5fbe79SDavid van Moolenbroek * OF SUCH DAMAGE. 31*5d5fbe79SDavid van Moolenbroek * 32*5d5fbe79SDavid van Moolenbroek * This file is part of the lwIP TCP/IP stack. 33*5d5fbe79SDavid van Moolenbroek * 34*5d5fbe79SDavid van Moolenbroek * Author: Adam Dunkels <adam@sics.se> 35*5d5fbe79SDavid van Moolenbroek * 36*5d5fbe79SDavid van Moolenbroek */ 37*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_HDR_PROT_ICMP6_H 38*5d5fbe79SDavid van Moolenbroek #define LWIP_HDR_PROT_ICMP6_H 39*5d5fbe79SDavid van Moolenbroek 40*5d5fbe79SDavid van Moolenbroek #include "lwip/arch.h" 41*5d5fbe79SDavid van Moolenbroek 42*5d5fbe79SDavid van Moolenbroek #ifdef __cplusplus 43*5d5fbe79SDavid van Moolenbroek extern "C" { 44*5d5fbe79SDavid van Moolenbroek #endif 45*5d5fbe79SDavid van Moolenbroek 46*5d5fbe79SDavid van Moolenbroek /** ICMP type */ 47*5d5fbe79SDavid van Moolenbroek enum icmp6_type { 48*5d5fbe79SDavid van Moolenbroek /** Destination unreachable */ 49*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_DUR = 1, 50*5d5fbe79SDavid van Moolenbroek /** Packet too big */ 51*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_PTB = 2, 52*5d5fbe79SDavid van Moolenbroek /** Time exceeded */ 53*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_TE = 3, 54*5d5fbe79SDavid van Moolenbroek /** Parameter problem */ 55*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_PP = 4, 56*5d5fbe79SDavid van Moolenbroek /** Private experimentation */ 57*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_PE1 = 100, 58*5d5fbe79SDavid van Moolenbroek /** Private experimentation */ 59*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_PE2 = 101, 60*5d5fbe79SDavid van Moolenbroek /** Reserved for expansion of error messages */ 61*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_RSV_ERR = 127, 62*5d5fbe79SDavid van Moolenbroek 63*5d5fbe79SDavid van Moolenbroek /** Echo request */ 64*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_EREQ = 128, 65*5d5fbe79SDavid van Moolenbroek /** Echo reply */ 66*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_EREP = 129, 67*5d5fbe79SDavid van Moolenbroek /** Multicast listener query */ 68*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_MLQ = 130, 69*5d5fbe79SDavid van Moolenbroek /** Multicast listener report */ 70*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_MLR = 131, 71*5d5fbe79SDavid van Moolenbroek /** Multicast listener done */ 72*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_MLD = 132, 73*5d5fbe79SDavid van Moolenbroek /** Router solicitation */ 74*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_RS = 133, 75*5d5fbe79SDavid van Moolenbroek /** Router advertisement */ 76*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_RA = 134, 77*5d5fbe79SDavid van Moolenbroek /** Neighbor solicitation */ 78*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_NS = 135, 79*5d5fbe79SDavid van Moolenbroek /** Neighbor advertisement */ 80*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_NA = 136, 81*5d5fbe79SDavid van Moolenbroek /** Redirect */ 82*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_RD = 137, 83*5d5fbe79SDavid van Moolenbroek /** Multicast router advertisement */ 84*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_MRA = 151, 85*5d5fbe79SDavid van Moolenbroek /** Multicast router solicitation */ 86*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_MRS = 152, 87*5d5fbe79SDavid van Moolenbroek /** Multicast router termination */ 88*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_MRT = 153, 89*5d5fbe79SDavid van Moolenbroek /** Private experimentation */ 90*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_PE3 = 200, 91*5d5fbe79SDavid van Moolenbroek /** Private experimentation */ 92*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_PE4 = 201, 93*5d5fbe79SDavid van Moolenbroek /** Reserved for expansion of informational messages */ 94*5d5fbe79SDavid van Moolenbroek ICMP6_TYPE_RSV_INF = 255 95*5d5fbe79SDavid van Moolenbroek }; 96*5d5fbe79SDavid van Moolenbroek 97*5d5fbe79SDavid van Moolenbroek /** ICMP destination unreachable codes */ 98*5d5fbe79SDavid van Moolenbroek enum icmp6_dur_code { 99*5d5fbe79SDavid van Moolenbroek /** No route to destination */ 100*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_NO_ROUTE = 0, 101*5d5fbe79SDavid van Moolenbroek /** Communication with destination administratively prohibited */ 102*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_PROHIBITED = 1, 103*5d5fbe79SDavid van Moolenbroek /** Beyond scope of source address */ 104*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_SCOPE = 2, 105*5d5fbe79SDavid van Moolenbroek /** Address unreachable */ 106*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_ADDRESS = 3, 107*5d5fbe79SDavid van Moolenbroek /** Port unreachable */ 108*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_PORT = 4, 109*5d5fbe79SDavid van Moolenbroek /** Source address failed ingress/egress policy */ 110*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_POLICY = 5, 111*5d5fbe79SDavid van Moolenbroek /** Reject route to destination */ 112*5d5fbe79SDavid van Moolenbroek ICMP6_DUR_REJECT_ROUTE = 6 113*5d5fbe79SDavid van Moolenbroek }; 114*5d5fbe79SDavid van Moolenbroek 115*5d5fbe79SDavid van Moolenbroek /** ICMP time exceeded codes */ 116*5d5fbe79SDavid van Moolenbroek enum icmp6_te_code { 117*5d5fbe79SDavid van Moolenbroek /** Hop limit exceeded in transit */ 118*5d5fbe79SDavid van Moolenbroek ICMP6_TE_HL = 0, 119*5d5fbe79SDavid van Moolenbroek /** Fragment reassembly time exceeded */ 120*5d5fbe79SDavid van Moolenbroek ICMP6_TE_FRAG = 1 121*5d5fbe79SDavid van Moolenbroek }; 122*5d5fbe79SDavid van Moolenbroek 123*5d5fbe79SDavid van Moolenbroek /** ICMP parameter code */ 124*5d5fbe79SDavid van Moolenbroek enum icmp6_pp_code { 125*5d5fbe79SDavid van Moolenbroek /** Erroneous header field encountered */ 126*5d5fbe79SDavid van Moolenbroek ICMP6_PP_FIELD = 0, 127*5d5fbe79SDavid van Moolenbroek /** Unrecognized next header type encountered */ 128*5d5fbe79SDavid van Moolenbroek ICMP6_PP_HEADER = 1, 129*5d5fbe79SDavid van Moolenbroek /** Unrecognized IPv6 option encountered */ 130*5d5fbe79SDavid van Moolenbroek ICMP6_PP_OPTION = 2 131*5d5fbe79SDavid van Moolenbroek }; 132*5d5fbe79SDavid van Moolenbroek 133*5d5fbe79SDavid van Moolenbroek /** This is the standard ICMP6 header. */ 134*5d5fbe79SDavid van Moolenbroek #ifdef PACK_STRUCT_USE_INCLUDES 135*5d5fbe79SDavid van Moolenbroek # include "arch/bpstruct.h" 136*5d5fbe79SDavid van Moolenbroek #endif 137*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_BEGIN 138*5d5fbe79SDavid van Moolenbroek struct icmp6_hdr { 139*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FLD_8(u8_t type); 140*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FLD_8(u8_t code); 141*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FIELD(u16_t chksum); 142*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FIELD(u32_t data); 143*5d5fbe79SDavid van Moolenbroek } PACK_STRUCT_STRUCT; 144*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_END 145*5d5fbe79SDavid van Moolenbroek #ifdef PACK_STRUCT_USE_INCLUDES 146*5d5fbe79SDavid van Moolenbroek # include "arch/epstruct.h" 147*5d5fbe79SDavid van Moolenbroek #endif 148*5d5fbe79SDavid van Moolenbroek 149*5d5fbe79SDavid van Moolenbroek /** This is the ICMP6 header adapted for echo req/resp. */ 150*5d5fbe79SDavid van Moolenbroek #ifdef PACK_STRUCT_USE_INCLUDES 151*5d5fbe79SDavid van Moolenbroek # include "arch/bpstruct.h" 152*5d5fbe79SDavid van Moolenbroek #endif 153*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_BEGIN 154*5d5fbe79SDavid van Moolenbroek struct icmp6_echo_hdr { 155*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FLD_8(u8_t type); 156*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FLD_8(u8_t code); 157*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FIELD(u16_t chksum); 158*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FIELD(u16_t id); 159*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_FIELD(u16_t seqno); 160*5d5fbe79SDavid van Moolenbroek } PACK_STRUCT_STRUCT; 161*5d5fbe79SDavid van Moolenbroek PACK_STRUCT_END 162*5d5fbe79SDavid van Moolenbroek #ifdef PACK_STRUCT_USE_INCLUDES 163*5d5fbe79SDavid van Moolenbroek # include "arch/epstruct.h" 164*5d5fbe79SDavid van Moolenbroek #endif 165*5d5fbe79SDavid van Moolenbroek 166*5d5fbe79SDavid van Moolenbroek #ifdef __cplusplus 167*5d5fbe79SDavid van Moolenbroek } 168*5d5fbe79SDavid van Moolenbroek #endif 169*5d5fbe79SDavid van Moolenbroek 170*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_HDR_PROT_ICMP6_H */ 171