135 lines
3.8 KiB
C
135 lines
3.8 KiB
C
/******************************************************************************
|
|
* 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
|