qemu/slirp/ip6_icmp.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2013
   3 * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne.
   4 */
   5
   6#ifndef SLIRP_NETINET_ICMP6_H_
   7#define SLIRP_NETINET_ICMP6_H_
   8
   9/*
  10 * Interface Control Message Protocol version 6 Definitions.
  11 * Per RFC 4443, March 2006.
  12 *
  13 * Network Discover Protocol Definitions.
  14 * Per RFC 4861, September 2007.
  15 */
  16
  17struct icmp6_echo { /* Echo Messages */
  18    uint16_t id;
  19    uint16_t seq_num;
  20};
  21
  22union icmp6_error_body {
  23    uint32_t unused;
  24    uint32_t pointer;
  25    uint32_t mtu;
  26};
  27
  28/*
  29 * NDP Messages
  30 */
  31struct ndp_rs {     /* Router Solicitation Message */
  32    uint32_t reserved;
  33};
  34
  35struct ndp_ra {     /* Router Advertisement Message */
  36    uint8_t chl;    /* Cur Hop Limit */
  37#ifdef HOST_WORDS_BIGENDIAN
  38    uint8_t
  39        M:1,
  40        O:1,
  41        reserved:6;
  42#else
  43    uint8_t
  44        reserved:6,
  45        O:1,
  46        M:1;
  47#endif
  48    uint16_t lifetime;      /* Router Lifetime */
  49    uint32_t reach_time;    /* Reachable Time */
  50    uint32_t retrans_time;  /* Retrans Timer */
  51} QEMU_PACKED;
  52
  53struct ndp_ns {     /* Neighbor Solicitation Message */
  54    uint32_t reserved;
  55    struct in6_addr target; /* Target Address */
  56} QEMU_PACKED;
  57
  58struct ndp_na {     /* Neighbor Advertisement Message */
  59#ifdef HOST_WORDS_BIGENDIAN
  60    uint32_t
  61        R:1,                /* Router Flag */
  62        S:1,                /* Solicited Flag */
  63        O:1,                /* Override Flag */
  64        reserved_hi:5,
  65        reserved_lo:24;
  66#else
  67    uint32_t
  68        reserved_hi:5,
  69        O:1,
  70        S:1,
  71        R:1,
  72        reserved_lo:24;
  73#endif
  74    struct in6_addr target; /* Target Address */
  75} QEMU_PACKED;
  76
  77struct ndp_redirect {
  78    uint32_t reserved;
  79    struct in6_addr target; /* Target Address */
  80    struct in6_addr dest;   /* Destination Address */
  81} QEMU_PACKED;
  82
  83/*
  84 * Structure of an icmpv6 header.
  85 */
  86struct icmp6 {
  87    uint8_t     icmp6_type;         /* type of message, see below */
  88    uint8_t     icmp6_code;         /* type sub code */
  89    uint16_t    icmp6_cksum;        /* ones complement cksum of struct */
  90    union {
  91        union icmp6_error_body error_body;
  92        struct icmp6_echo echo;
  93        struct ndp_rs ndp_rs;
  94        struct ndp_ra ndp_ra;
  95        struct ndp_ns ndp_ns;
  96        struct ndp_na ndp_na;
  97        struct ndp_redirect ndp_redirect;
  98    } icmp6_body;
  99#define icmp6_err icmp6_body.error_body
 100#define icmp6_echo icmp6_body.echo
 101#define icmp6_nrs icmp6_body.ndp_rs
 102#define icmp6_nra icmp6_body.ndp_ra
 103#define icmp6_nns icmp6_body.ndp_ns
 104#define icmp6_nna icmp6_body.ndp_na
 105#define icmp6_redirect icmp6_body.ndp_redirect
 106} QEMU_PACKED;
 107
 108#define ICMP6_MINLEN    4
 109#define ICMP6_ERROR_MINLEN  8
 110#define ICMP6_ECHO_MINLEN   8
 111#define ICMP6_NDP_RS_MINLEN 8
 112#define ICMP6_NDP_RA_MINLEN 16
 113#define ICMP6_NDP_NS_MINLEN 24
 114#define ICMP6_NDP_NA_MINLEN 24
 115#define ICMP6_NDP_REDIRECT_MINLEN 40
 116
 117/*
 118 * NDP Options
 119 */
 120struct ndpopt {
 121    uint8_t     ndpopt_type;                    /* Option type */
 122    uint8_t     ndpopt_len;                     /* /!\ In units of 8 octets */
 123    union {
 124        unsigned char   linklayer_addr[6];      /* Source/Target Link-layer */
 125        struct prefixinfo {                     /* Prefix Information */
 126            uint8_t     prefix_length;
 127#ifdef HOST_WORDS_BIGENDIAN
 128            uint8_t     L:1, A:1, reserved1:6;
 129#else
 130            uint8_t     reserved1:6, A:1, L:1;
 131#endif
 132            uint32_t    valid_lt;               /* Valid Lifetime */
 133            uint32_t    pref_lt;                /* Preferred Lifetime */
 134            uint32_t    reserved2;
 135            struct in6_addr prefix;
 136        } QEMU_PACKED prefixinfo;
 137    } ndpopt_body;
 138#define ndpopt_linklayer ndpopt_body.linklayer_addr
 139#define ndpopt_prefixinfo ndpopt_body.prefixinfo
 140} QEMU_PACKED;
 141
 142/* NDP options type */
 143#define NDPOPT_LINKLAYER_SOURCE     1   /* Source Link-Layer Address */
 144#define NDPOPT_LINKLAYER_TARGET     2   /* Target Link-Layer Address */
 145#define NDPOPT_PREFIX_INFO          3   /* Prefix Information */
 146
 147/* NDP options size, in octets. */
 148#define NDPOPT_LINKLAYER_LEN    8
 149#define NDPOPT_PREFIXINFO_LEN   32
 150
 151/*
 152 * Definition of type and code field values.
 153 * Per https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml
 154 * Last Updated 2012-11-12
 155 */
 156
 157/* Errors */
 158#define ICMP6_UNREACH   1   /* Destination Unreachable */
 159#define     ICMP6_UNREACH_NO_ROUTE      0   /* no route to dest */
 160#define     ICMP6_UNREACH_DEST_PROHIB   1   /* com with dest prohibited */
 161#define     ICMP6_UNREACH_SCOPE         2   /* beyond scope of src addr */
 162#define     ICMP6_UNREACH_ADDRESS       3   /* address unreachable */
 163#define     ICMP6_UNREACH_PORT          4   /* port unreachable */
 164#define     ICMP6_UNREACH_SRC_FAIL      5   /* src addr failed */
 165#define     ICMP6_UNREACH_REJECT_ROUTE  6   /* reject route to dest */
 166#define     ICMP6_UNREACH_SRC_HDR_ERROR 7   /* error in src routing header */
 167#define ICMP6_TOOBIG    2   /* Packet Too Big */
 168#define ICMP6_TIMXCEED  3   /* Time Exceeded */
 169#define     ICMP6_TIMXCEED_INTRANS      0   /* hop limit exceeded in transit */
 170#define     ICMP6_TIMXCEED_REASS        1   /* ttl=0 in reass */
 171#define ICMP6_PARAMPROB 4   /* Parameter Problem */
 172#define     ICMP6_PARAMPROB_HDR_FIELD   0   /* err header field */
 173#define     ICMP6_PARAMPROB_NXTHDR_TYPE 1   /* unrecognized Next Header type */
 174#define     ICMP6_PARAMPROB_IPV6_OPT    2   /* unrecognized IPv6 option */
 175
 176/* Informational Messages */
 177#define ICMP6_ECHO_REQUEST      128 /* Echo Request */
 178#define ICMP6_ECHO_REPLY        129 /* Echo Reply */
 179#define ICMP6_NDP_RS            133 /* Router Solicitation (NDP) */
 180#define ICMP6_NDP_RA            134 /* Router Advertisement (NDP) */
 181#define ICMP6_NDP_NS            135 /* Neighbor Solicitation (NDP) */
 182#define ICMP6_NDP_NA            136 /* Neighbor Advertisement (NDP) */
 183#define ICMP6_NDP_REDIRECT      137 /* Redirect Message (NDP) */
 184
 185/*
 186 * Router Configuration Variables (rfc4861#section-6)
 187 */
 188#define NDP_IsRouter                1
 189#define NDP_AdvSendAdvertisements   1
 190#define NDP_MaxRtrAdvInterval       600000
 191#define NDP_MinRtrAdvInterval       ((NDP_MaxRtrAdvInterval >= 9) ? \
 192                                        NDP_MaxRtrAdvInterval / 3 : \
 193                                        NDP_MaxRtrAdvInterval)
 194#define NDP_AdvManagedFlag          0
 195#define NDP_AdvOtherConfigFlag      0
 196#define NDP_AdvLinkMTU              0
 197#define NDP_AdvReachableTime        0
 198#define NDP_AdvRetransTime          0
 199#define NDP_AdvCurHopLimit          64
 200#define NDP_AdvDefaultLifetime      ((3 * NDP_MaxRtrAdvInterval) / 1000)
 201#define NDP_AdvValidLifetime        86400
 202#define NDP_AdvOnLinkFlag           1
 203#define NDP_AdvPrefLifetime         14400
 204#define NDP_AdvAutonomousFlag       1
 205
 206void icmp6_init(Slirp *slirp);
 207void icmp6_cleanup(Slirp *slirp);
 208void icmp6_input(struct mbuf *);
 209void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code);
 210void ndp_send_ra(Slirp *slirp);
 211void ndp_send_ns(Slirp *slirp, struct in6_addr addr);
 212
 213#endif
 214