| /****************************************************************************** |
| * 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 |