pico_icmp6.h 6.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*********************************************************************
   PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
   See LICENSE and COPYING for usage.

   .

 *********************************************************************/
#ifndef _INCLUDE_PICO_ICMP6
#define _INCLUDE_PICO_ICMP6
#include "pico_addressing.h"
#include "pico_protocol.h"

/* ICMP header sizes */
#define PICO_ICMP6HDR_DRY_SIZE          4
#define PICO_ICMP6HDR_ECHO_REQUEST_SIZE 8
#define PICO_ICMP6HDR_DEST_UNREACH_SIZE 8
#define PICO_ICMP6HDR_TIME_XCEEDED_SIZE 8
18
#define PICO_ICMP6HDR_PARAM_PROBLEM_SIZE 8
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#define PICO_ICMP6HDR_NEIGH_SOL_SIZE    24
#define PICO_ICMP6HDR_NEIGH_ADV_SIZE    24
#define PICO_ICMP6HDR_ROUTER_SOL_SIZE   8
#define PICO_ICMP6HDR_ROUTER_ADV_SIZE   16
#define PICO_ICMP6HDR_REDIRECT_SIZE     40

/* ICMP types */
#define PICO_ICMP6_DEST_UNREACH        1
#define PICO_ICMP6_PKT_TOO_BIG         2
#define PICO_ICMP6_TIME_EXCEEDED       3
#define PICO_ICMP6_PARAM_PROBLEM       4
#define PICO_ICMP6_ECHO_REQUEST        128
#define PICO_ICMP6_ECHO_REPLY          129
#define PICO_ICMP6_ROUTER_SOL          133
#define PICO_ICMP6_ROUTER_ADV          134
#define PICO_ICMP6_NEIGH_SOL           135
#define PICO_ICMP6_NEIGH_ADV           136
#define PICO_ICMP6_REDIRECT            137

/* destination unreachable codes */
#define PICO_ICMP6_UNREACH_NOROUTE     0
#define PICO_ICMP6_UNREACH_ADMIN       1
#define PICO_ICMP6_UNREACH_SRCSCOPE    2
#define PICO_ICMP6_UNREACH_ADDR        3
#define PICO_ICMP6_UNREACH_PORT        4
#define PICO_ICMP6_UNREACH_SRCFILTER   5
#define PICO_ICMP6_UNREACH_REJROUTE    6

/* time exceeded codes */
#define PICO_ICMP6_TIMXCEED_INTRANS    0
#define PICO_ICMP6_TIMXCEED_REASS      1

/* parameter problem codes */
#define PICO_ICMP6_PARAMPROB_HDRFIELD  0
#define PICO_ICMP6_PARAMPROB_NXTHDR    1
#define PICO_ICMP6_PARAMPROB_IPV6OPT   2

/* ping error codes */
#define PICO_PING6_ERR_REPLIED         0
#define PICO_PING6_ERR_TIMEOUT         1
#define PICO_PING6_ERR_UNREACH         2
60
#define PICO_PING6_ERR_ABORTED         3
61 62 63 64 65 66 67 68 69 70 71 72 73 74
#define PICO_PING6_ERR_PENDING         0xFFFF

/* custom defines */
#define PICO_ICMP6_ND_UNICAST          0
#define PICO_ICMP6_ND_ANYCAST          1
#define PICO_ICMP6_ND_SOLICITED        2
#define PICO_ICMP6_ND_DAD              3

#define PICO_ICMP6_MAX_RTR_SOL_DELAY   1000

#define PICO_SIZE_ICMP6HDR ((sizeof(struct pico_icmp6_hdr)))

extern struct pico_protocol pico_proto_icmp6;

75
PACKED_STRUCT_DEF pico_icmp6_hdr {
76 77 78 79
    uint8_t type;
    uint8_t code;
    uint16_t crc;

80
    PACKED_UNION_DEF icmp6_msg_u {
81
        /* error messages */
82
        PACKED_UNION_DEF icmp6_err_u {
83
            PEDANTIC_STRUCT_DEF dest_unreach_s {
84 85 86
                uint32_t unused;
                uint8_t data[0];
            } dest_unreach;
87
            PEDANTIC_STRUCT_DEF pkt_too_big_s {
88 89 90
                uint32_t mtu;
                uint8_t data[0];
            } pkt_too_big;
91
            PEDANTIC_STRUCT_DEF time_exceeded_s {
92 93 94
                uint32_t unused;
                uint8_t data[0];
            } time_exceeded;
95
            PEDANTIC_STRUCT_DEF param_problem_s {
96 97 98 99 100 101
                uint32_t ptr;
                uint8_t data[0];
            } param_problem;
        } err;

        /* informational messages */
102
        PACKED_UNION_DEF icmp6_info_u {
103
            PEDANTIC_STRUCT_DEF echo_request_s {
104 105 106 107
                uint16_t id;
                uint16_t seq;
                uint8_t data[0];
            } echo_request;
108
            PEDANTIC_STRUCT_DEF echo_reply_s {
109 110 111 112
                uint16_t id;
                uint16_t seq;
                uint8_t data[0];
            } echo_reply;
113
            PEDANTIC_STRUCT_DEF router_sol_s {
114 115 116
                uint32_t unused;
                uint8_t options[0];
            } router_sol;
117
            PEDANTIC_STRUCT_DEF router_adv_s {
118 119 120 121 122 123 124
                uint8_t hop;
                uint8_t mor;
                uint16_t life_time;
                uint32_t reachable_time;
                uint32_t retrans_time;
                uint8_t options[0];
            } router_adv;
125
            PEDANTIC_STRUCT_DEF neigh_sol_s {
126 127 128 129
                uint32_t unused;
                struct pico_ip6 target;
                uint8_t options[0];
            } neigh_sol;
130
            PEDANTIC_STRUCT_DEF neigh_adv_s {
131 132 133 134
                uint32_t rsor;
                struct pico_ip6 target;
                uint8_t options[0];
            } neigh_adv;
135
            PEDANTIC_STRUCT_DEF redirect_s {
136 137 138 139 140 141 142 143 144
                uint32_t reserved;
                struct pico_ip6 target;
                struct pico_ip6 dest;
                uint8_t options[0];
            } redirect;
        } info;
    } msg;
};

145
PACKED_STRUCT_DEF pico_icmp6_opt_lladdr
146 147 148
{
    uint8_t type;
    uint8_t len;
149
    PACKED_UNION_DEF icmp6_opt_hw_addr_u {
150 151 152 153
        struct pico_eth mac;
    } addr;
};

154
PACKED_STRUCT_DEF pico_icmp6_opt_prefix
155 156 157 158 159 160 161 162 163 164 165 166 167
{
    uint8_t type;
    uint8_t len;
    uint8_t prefix_len;
    uint8_t res : 6;
    uint8_t aac : 1;
    uint8_t onlink : 1;
    uint32_t val_lifetime;
    uint32_t pref_lifetime;
    uint32_t reserved;
    struct pico_ip6 prefix;
};

168
PACKED_STRUCT_DEF pico_icmp6_opt_mtu
169 170 171 172 173 174 175
{
    uint8_t type;
    uint8_t len;
    uint16_t res;
    uint32_t mtu;
};

176
PACKED_STRUCT_DEF pico_icmp6_opt_redirect
177 178 179 180 181 182 183 184
{
    uint8_t type;
    uint8_t len;
    uint16_t res0;
    uint32_t res1;
    uint8_t data[0];
};

185
PACKED_STRUCT_DEF pico_icmp6_opt_na
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
{
    uint8_t type;
    uint8_t len;
    uint8_t options[0];
};

struct pico_icmp6_stats
{
    unsigned long size;
    unsigned long seq;
    pico_time time;
    unsigned long ttl;
    int err;
    struct pico_ip6 dst;
};

int pico_icmp6_ping(char *dst, int count, int interval, int timeout, int size, void (*cb)(struct pico_icmp6_stats *));
203
int pico_icmp6_ping_abort(int id);
204 205 206 207 208 209 210 211 212 213

int pico_icmp6_neighbor_solicitation(struct pico_device *dev, struct pico_ip6 *dst, uint8_t type);
int pico_icmp6_neighbor_advertisement(struct pico_frame *f, struct pico_ip6 *target);
int pico_icmp6_router_solicitation(struct pico_device *dev, struct pico_ip6 *src);

int pico_icmp6_port_unreachable(struct pico_frame *f);
int pico_icmp6_proto_unreachable(struct pico_frame *f);
int pico_icmp6_dest_unreachable(struct pico_frame *f);
int pico_icmp6_ttl_expired(struct pico_frame *f);
int pico_icmp6_packet_filtered(struct pico_frame *f);
214
int pico_icmp6_parameter_problem(struct pico_frame *f, uint8_t problem, uint32_t ptr);
215 216 217 218

uint16_t pico_icmp6_checksum(struct pico_frame *f);

#endif