blob: 41b0c7071cdb93ff1ca2f9bfcf824a1c8c677bee [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2013 IBM Corporation
* All rights reserved.
* This program and the accompanying materials
* are made available under the terms of the BSD License
* which accompanies this distribution, and is available at
* http://www.opensource.org/licenses/bsd-license.php
*
* Contributors:
* IBM Corporation - initial implementation
*****************************************************************************/
#ifndef _ICMPV6_H_
#define _ICMPV6_H_
#include <stdint.h>
#include "ethernet.h"
#include "ipv6.h"
#define __ICMPV6_DEBUG__
#ifdef __ICMPV6_DEBUG__
#define ICMPV6_DEBUG_PRINT(format, ...) printf(format, ## __VA_ARGS__)
#else
#define ICMPV6_DEBUG_PRINT(format, ...)
#endif
#define ICMPv6_HEADER_SIZE 4 /* Size of common fields */
#define IPTYPE_ICMPV6 0x3a
/* Error message types */
#define ICMPV6_DEST_UNREACHABLE 1 /* Destination unreachable */
#define ICMPV6_PACKET_TOO_BIG 2 /* Packet too big */
#define ICMPV6_TIME_EXCEEDED 3 /* Time exceeded */
#define ICMPV6_PARAM_PROBLEM 4 /* Parameter problem */
/* Informational message types */
#define ICMPV6_ECHO_REQUEST 128 /* Echo request */
#define ICMPV6_ECHO_REPLY 129 /* Echo reply */
#define ICMPV6_MCAST_LISTENER_QUERY 130 /* Multicast listener query */
#define ICMPV6_MCAST_LISTENER_REPORT 131 /* Multicast listener report */
#define ICMPv6 MCAST_LISTENER_DONE 132 /* Multicast listener done */
#define ICMPV6_ROUTER_SOLICITATION 133 /* Router solicitation */
#define ICMPV6_ROUTER_ADVERTISEMENT 134 /* Router advertisement */
#define ICMPV6_NEIGHBOUR_SOLICITATION 135 /* Neighbor solicitation */
#define ICMPV6_NEIGHBOUR_ADVERTISEMENT 136 /* Neighbor advertisement */
#define ICMPV6_REDIRECT_MSG 137 /* Redirect message */
/******** Functions *******************/
int8_t handle_icmpv6 (int fd, struct ethhdr *etherhdr, uint8_t *ip6_packet);
void send_neighbour_solicitation(int fd, ip6_addr_t *target_ip6);
void send_router_solicitation(int fd);
int is_ra_received(void);
/* Prefix information */
struct option_prefix {
uint8_t type;
uint8_t length;
uint8_t prefix_length;
uint8_t onlink:1,
autom:1,
not_router:1,
not_site_prefix:1,
reserved:4;
uint32_t valid_lifetime;
uint32_t preferred_lifetime;
uint32_t reserved2;
ip6_addr_t prefix;
} __attribute((packed));
/* Neighbour advertisement/solicitation flags */
struct na_flags {
uint8_t is_router:1, /* sender (we) is a router */
na_is_solicited:1, /* this NA was solicited (asked for) */
override:1, /* receiver shall override its cache entries */
unused:5;
}__attribute((packed));
/* Source/Target Link-layer address */
struct option_ll_address{
uint8_t type;
uint8_t length;
uint8_t mac[ETH_ALEN];
} __attribute((packed));
struct neighbour_solicitation {
uint32_t router:1,
solicited:1,
override:1,
reserved:29;
ip6_addr_t target;
struct option_ll_address lladdr;
} __attribute((packed));
struct neighbour_advertisement {
uint32_t router:1,
solicited:1,
override:1,
reserved:29;
ip6_addr_t target;
struct option_ll_address lladdr;
} __attribute((packed));
struct router_solicitation {
uint32_t reserved;
struct option_ll_address lladdr;
} __attribute((packed));
struct router_advertisement {
uint8_t curr_hop_limit;
struct raflags {
uint8_t managed:1,
other:1,
reserved:6;
} flags;
uint16_t router_lifetime;
uint32_t reachable_time;
uint32_t retrans_timer;
struct option_prefix prefix;
struct option_ll_address ll_addr;
} __attribute((packed));
struct icmp6hdr {
uint8_t type;
uint8_t code;
uint16_t checksum;
union {
struct neighbour_solicitation nghb_solicit;
struct neighbour_advertisement nghb_adv;
struct router_solicitation router_solicit;
struct router_advertisement ra;
} icmp6body;
} __attribute((packed));
#endif