#ifndef COPPINO_IPV6_H #define COPPINO_IPV6_H namespace ipv6 { const uint8_t LEN = 128; const uint8_t ICMP_ECHO_REQUEST_TYPE = 128; const uint8_t ICMP_ECHO_REPLY_TYPE = 129; 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; struct ipv6_packet_header { char field[4]; char len[2]; char next_header; char hop_limit; IPv6Addr src_addr; IPv6Addr dst_addr; }__attribute__((packed)); class IPv6Packet { private: char packet[LEN]; public: IPv6Packet(); IPv6Packet(const char* buffer, int len); void setSrcAddress(IPv6Addr& address); void setDstAddress(IPv6Addr& address); void setNextHeader(uint8_t next_header); void setFlow(const char* flow); void setPayload(char* payload, int len); void doAction(); }; /* Note: content of message may be changed */ void handleICMP(const char* src, const char* dst, const char* flow, char* message, int len); /* Compute internet checksum. Actually it is not so straightforward: */ uint16_t compute_checksum( const char* src_addr, /* source IPv6 address */ const char* 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 */ ); } #endif