110 lines
2.5 KiB
C++
110 lines
2.5 KiB
C++
#ifndef COPPINO_IPV6_H
|
|
#define COPPINO_IPV6_H
|
|
|
|
#include "settings.h"
|
|
#include "Arduino.h"
|
|
#include "slip.h"
|
|
|
|
namespace ipv6
|
|
{
|
|
/* maximum length for an IPv6 packet */
|
|
const uint8_t LEN = 128;
|
|
|
|
/* ICMP Types */
|
|
const uint8_t ICMP_ECHO_REQUEST_TYPE = 128;
|
|
const uint8_t ICMP_ECHO_REPLY_TYPE = 129;
|
|
const uint8_t ICMP_RADV_TYPE = 134;
|
|
|
|
/* Next-Header Types */
|
|
const uint8_t NH_ICMP = 58;
|
|
const uint8_t NH_UDP = 17;
|
|
|
|
class IPv6Addr
|
|
{
|
|
private:
|
|
char address[16];
|
|
|
|
public:
|
|
IPv6Addr();
|
|
IPv6Addr(const char *address);
|
|
};
|
|
|
|
extern const IPv6Addr ALL_NODES_ADDRESS;
|
|
|
|
class IPv6Packet
|
|
{
|
|
private:
|
|
char packet[LEN];
|
|
|
|
public:
|
|
IPv6Packet();
|
|
IPv6Packet(const char *buffer, int len);
|
|
void setLen(int len);
|
|
int getLen();
|
|
void setSrcAddress(const IPv6Addr *address);
|
|
const IPv6Addr *getSrcAddress();
|
|
void setDstAddress(const IPv6Addr *address);
|
|
const IPv6Addr *getDstAddress();
|
|
void setNextHeader(uint8_t next_header);
|
|
void setFlow(const char *flow);
|
|
void setPayload(char *payload, int len);
|
|
void send();
|
|
|
|
void doAction();
|
|
};
|
|
|
|
/* incoming and outgoing packets buffer */
|
|
extern IPv6Packet packetin;
|
|
extern IPv6Packet packetout;
|
|
|
|
/* Note: content of message may be changed */
|
|
int handleICMP(char *output_buffer, const char *input_buffer, int len);
|
|
|
|
/* Compute internet checksum. Actually it is not so straightforward: */
|
|
uint16_t compute_checksum(
|
|
const IPv6Addr *src_addr, /* source IPv6 address */
|
|
const IPv6Addr *dst_addr, /* destination IPv6 address */
|
|
uint8_t next_header, /* IPv6 next header number */
|
|
int upper_len, /* length as found in the upper layer protocol */
|
|
const char *payload, /* IPv6 payload */
|
|
int len /* IPv6 payload length */
|
|
);
|
|
|
|
/* RFC 4861 -- begin */
|
|
struct ICMPv6_RADV
|
|
{
|
|
uint8_t type;
|
|
uint8_t code;
|
|
char checksum[2];
|
|
uint8_t cur_hop_limit;
|
|
uint8_t mo_flags;
|
|
uint16_t router_lifetime;
|
|
uint32_t reachable_time;
|
|
uint32_t retrans_time;
|
|
};
|
|
|
|
struct ICMPv6_RADV_Option
|
|
{
|
|
uint8_t type;
|
|
uint8_t len;
|
|
};
|
|
|
|
struct ICMPv6_RADV_PrefixInformation
|
|
{
|
|
uint8_t type;
|
|
uint8_t len;
|
|
uint8_t prefix_length;
|
|
uint8_t la_flags;
|
|
uint32_t valid_lifetime;
|
|
uint32_t preferred_lifetime;
|
|
uint32_t reserved2;
|
|
char prefix[16];
|
|
};
|
|
/* RFC 4861 -- end */
|
|
|
|
void setEUI(const char *eui); /* 64bit Extended Unique Identifier */
|
|
void setGlobalAddress(const char *address); /* global IPv6 address, manually configured */
|
|
}
|
|
|
|
#endif
|