6 #define ficmpv6frame_H 1
11 #include "../endian_conversion.h"
14 #include "../fframe.h"
15 #include "../caddress.h"
35 #define IPV6_ADDR_LEN 16
36 #define ETHER_ADDR_LEN 6
44 enum icmpv6_option_type_t {
45 ICMPV6_OPT_LLADDR_SOURCE = 1,
46 ICMPV6_OPT_LLADDR_TARGET = 2,
47 ICMPV6_OPT_PREFIX_INFO = 3,
48 ICMPV6_OPT_REDIRECT = 4,
57 } __attribute__((packed));
63 uint8_t addr[ETHER_ADDR_LEN];
64 } __attribute__((packed));
71 uint32_t valid_lifetime;
72 uint32_t preferred_lifetime;
74 uint8_t prefix[IPV6_ADDR_LEN];
75 } __attribute__((packed));
82 } __attribute__((packed));
89 } __attribute__((packed));
101 #define icmpv6_opt icmpv6optu.optu
102 #define icmpv6_opt_lla icmpv6optu.optu_lla
103 #define icmpv6_opt_pfx icmpv6optu.optu_pfx
104 #define icmpv6_opt_rdr icmpv6optu.optu_rdr
105 #define icmpv6_opt_mtu icmpv6optu.optu_mtu
110 ficmpv6opt(uint8_t *data = (uint8_t*)0,
size_t datalen = 0);
113 ficmpv6opt(
struct icmpv6_option_hdr_t *data,
size_t datalen);
126 uint8_t get_opt_type()
const;
129 void set_opt_type(uint8_t type);
135 void set_ll_taddr(
cmacaddr const& addr);
141 void set_ll_saddr(
cmacaddr const& addr);
144 uint8_t get_pfx_on_link_flag()
const;
147 void set_pfx_on_link_flag(uint8_t flag);
150 uint8_t get_pfx_aac_flag()
const;
153 void set_pfx_aac_flag(uint8_t flag);
158 operator<< (std::ostream& os,
ficmpv6opt const& opt) {
159 os <<
"<ficmvp6opt ";
161 switch (opt.get_opt_type()) {
162 case ICMPV6_OPT_LLADDR_SOURCE: os <<
"LLADDR-SOURCE ";
break;
163 case ICMPV6_OPT_LLADDR_TARGET: os <<
"LLADDR-TARGET ";
break;
164 case ICMPV6_OPT_PREFIX_INFO: os <<
"PREFIX-INFO ";
break;
165 case ICMPV6_OPT_REDIRECT: os <<
"REDIRECT ";
break;
166 case ICMPV6_OPT_MTU: os <<
"MTU ";
break;
167 default: os <<
"UNKNOWN ";
break;
169 os << std::endl << dynamic_cast<fframe const&>( opt ) << std::endl;
184 #define IPV6_ADDR_LEN 16
185 #define ETHER_ADDR_LEN 6
189 enum icmpv6_ip_proto_t {
190 ICMPV6_IP_PROTO = 58,
194 ICMPV6_TYPE_DESTINATION_UNREACHABLE = 1,
195 ICMPV6_TYPE_PACKET_TOO_BIG = 2,
196 ICMPV6_TYPE_TIME_EXCEEDED = 3,
197 ICMPV6_TYPE_PARAMETER_PROBLEM = 4,
198 ICMPV6_TYPE_ECHO_REQUEST = 128,
199 ICMPV6_TYPE_ECHO_REPLY = 129,
200 ICMPV6_TYPE_MULTICAST_LISTENER_QUERY = 130,
201 ICMPV6_TYPE_MULTICAST_LISTENER_REPORT = 131,
202 ICMPV6_TYPE_MULTICAST_LISTENER_DONE = 132,
203 ICMPV6_TYPE_ROUTER_SOLICATION = 133,
204 ICMPV6_TYPE_ROUTER_ADVERTISEMENT = 134,
205 ICMPV6_TYPE_NEIGHBOR_SOLICITATION = 135,
206 ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT = 136,
207 ICMPV6_TYPE_REDIRECT_MESSAGE = 137,
208 ICMPV6_TYPE_ROUTER_RENUMBERING = 138,
209 ICMPV6_TYPE_ICMP_NODE_INFORMATION_QUERY = 139,
210 ICMPV6_TYPE_ICMP_NODE_INFORMATION_RESPONSE = 140,
211 ICMPV6_TYPE_INVERSE_NEIGHBOR_DISCOVERY_SOLICITATION_MESSAGE = 141,
212 ICMPV6_TYPE_INVERSE_NEIGHBOR_DISCOVERY_ADVERTISEMENT_MESSAGE = 142,
213 ICMPV6_TYPE_MULTICAST_LISTENER_DISCOVERY_REPORT = 143,
214 ICMPV6_TYPE_HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_MESSAGE = 144,
215 ICMPV6_TYPE_HOME_AGENT_ADDRESS_DISCOVERY_REPLY_MESSAGE = 145,
216 ICMPV6_TYPE_MOBILE_PREFIX_SOLICITATION = 146,
217 ICMPV6_TYPE_MOBILE_PREFIX_ADVERTISEMENT = 147,
220 enum icmpv6_destination_unreachable_code_t {
221 ICMPV6_DEST_UNREACH_CODE_NO_ROUTE_TO_DESTINATION = 0,
222 ICMPV6_DEST_UNREACH_CODE_COMMUNICATION_WITH_DESTINATION_ADMINISTRATIVELY_PROHIBITED = 1,
223 ICMPV6_DEST_UNREACH_CODE_BEYOND_SCOPE_OF_SOURCE_ADDRESS = 2,
224 ICMPV6_DEST_UNREACH_CODE_ADDRESS_UNREACHABLE = 3,
225 ICMPV6_DEST_UNREACH_CODE_PORT_UNREACHABLE = 4,
226 ICMPV6_DEST_UNREACH_CODE_SOURCE_ADDRESS_FAILED_INGRESS_EGRESS_POLICY= 5,
227 ICMPV6_DEST_UNREACH_CODE_REJECT_ROUTE_TO_DESTINATION = 6,
228 ICMPV6_DEST_UNREACH_CODE_ERROR_IN_SOURCE_ROUTING_HEADER = 7,
245 } __attribute__((packed));
257 } __attribute__((packed));
264 } __attribute__((packed));
271 } __attribute__((packed));
278 } __attribute__((packed));
286 } __attribute__((packed));
294 } __attribute__((packed));
305 } __attribute__((packed));
310 uint8_t cur_hop_limit;
312 uint16_t rtr_lifetime;
313 uint32_t reachable_timer;
314 uint32_t retrans_timer;
316 } __attribute__((packed));
322 uint8_t taddr[IPV6_ADDR_LEN];
324 } __attribute__((packed));
330 uint8_t taddr[IPV6_ADDR_LEN];
332 } __attribute__((packed));
338 uint8_t taddr[IPV6_ADDR_LEN];
339 uint8_t daddr[IPV6_ADDR_LEN];
341 } __attribute__((packed));
350 uint8_t src[IPV6_ADDR_LEN];
351 uint8_t dst[IPV6_ADDR_LEN];
355 } __attribute__((packed));
359 #define DEFAULT_ICMPV6_FRAME_SIZE sizeof(struct icmpv6_hdr_t)
378 #define icmpv6_hdr icmpv6u.icmpv6u_hdr
379 #define icmpv6_dest_unreach icmpv6u.icmpv6u_dst_unreach_hdr
380 #define icmpv6_pkt_too_big icmpv6u.icmpv6u_pkt_too_big_hdr
381 #define icmpv6_time_exceeded icmpv6u.icmpv6u_time_exceeded_hdr
382 #define icmpv6_param_problem icmpv6u.icmpv6u_param_problem_hdr
383 #define icmpv6_echo_request icmpv6u.icmpv6u_echo_request_hdr
384 #define icmpv6_echo_reply icmpv6u.icmpv6u_echo_reply_hdr
385 #define icmpv6_rtr_solicitation icmpv6u.icmpv6u_rtr_solicitation_hdr
386 #define icmpv6_rtr_advertisement icmpv6u.icmpv6u_rtr_advertisement_hdr
387 #define icmpv6_neighbor_solicitation icmpv6u.icmpv6u_neighbor_solication_hdr
388 #define icmpv6_neighbor_advertisement icmpv6u.icmpv6u_neighbor_advertisement_hdr
389 #define icmpv6_redirect icmpv6u.icmpv6u_redirect_hdr
391 std::map<ficmpv6opt::icmpv6_option_type_t, ficmpv6opt> icmpv6opts;
415 size_t len = DEFAULT_ICMPV6_FRAME_SIZE);
455 validate(uint16_t total_len = 0)
const;
488 get_icmpv6_code() const;
494 set_icmpv6_code(uint8_t code);
500 get_icmpv6_type() const;
506 set_icmpv6_type(uint8_t type);
512 get_icmpv6_ndp_rtr_flag() const;
518 set_icmpv6_ndp_rtr_flag();
524 get_icmpv6_ndp_solicited_flag() const;
530 set_icmpv6_ndp_solicited_flag();
536 get_icmpv6_ndp_override_flag() const;
542 set_icmpv6_ndp_override_flag();
548 get_icmpv6_neighbor_taddr() const;
568 parse_icmpv6_dest_unreach() throw (eICMPv6FrameTooShort);
572 parse_icmpv6_pkt_too_big() throw (eICMPv6FrameTooShort);
576 parse_icmpv6_time_exceeded() throw (eICMPv6FrameTooShort);
580 parse_icmpv6_param_problem() throw (eICMPv6FrameTooShort);
584 parse_icmpv6_echo_request() throw (eICMPv6FrameTooShort);
588 parse_icmpv6_echo_reply() throw (eICMPv6FrameTooShort);
592 parse_icmpv6_rtr_solicitation() throw (eICMPv6FrameTooShort);
596 parse_icmpv6_rtr_advertisement() throw (eICMPv6FrameTooShort);
600 parse_icmpv6_neighbor_solicitation() throw (eICMPv6FrameTooShort);
604 parse_icmpv6_neighbor_advertisement() throw (eICMPv6FrameTooShort);
608 parse_icmpv6_redirect() throw (eICMPv6FrameTooShort);
613 operator<< (std::ostream& os,
ficmpv6frame const& frame) {
614 os << dynamic_cast<fframe const&>( frame );
615 os <<
indent(2) <<
"<ficmpv6frame ";
616 os <<
"code:" << (int)frame.get_icmpv6_code() <<
" ";
617 os <<
"type:" << (int)frame.get_icmpv6_type() <<
" ";
618 os <<
">" << std::endl;
Definition: ficmpv6frame.h:281
Definition: ficmpv6frame.h:308
Definition: ficmpv6frame.h:78
Definition: caddress.h:152
virtual uint8_t * payload() const
Definition: ficmpv6frame.cc:310
Definition: ficmpv6frame.h:319
Definition: ficmpv6frame.h:289
void icmpv6_calc_checksum()
Definition: ficmpv6frame.cc:345
Definition: caddress.h:589
virtual ~ficmpv6frame()
Definition: ficmpv6frame.cc:35
Definition: ficmpv6frame.h:67
Definition: ficmpv6frame.h:267
Definition: ficmpv6frame.h:349
Definition: ficmpv6frame.h:274
Definition: ficmpv6frame.h:21
virtual void initialize()
Definition: ficmpv6frame.cc:54
Definition: ficmpv6frame.h:33
Definition: ficmpv6frame.h:23
ficmpv6opt & operator=(ficmpv6opt const &opt)
Definition: ficmpv6frame.cc:518
Definition: ficmpv6frame.h:253
Definition: ficmpv6frame.h:24
ficmpv6opt & get_option(ficmpv6opt::icmpv6_option_type_t type)
Definition: ficmpv6frame.cc:43
virtual bool complete() const
Definition: ficmpv6frame.cc:271
Definition: ficmpv6frame.h:20
Definition: ficmpv6frame.h:240
Definition: ficmpv6frame.h:53
Definition: ficmpv6frame.h:327
Definition: ficmpv6frame.h:260
Definition: ficmpv6frame.h:301
virtual size_t payloadlen() const
Definition: ficmpv6frame.cc:320
Definition: ficmpv6frame.h:182
virtual void payload_insert(uint8_t *data, size_t datalen)
Definition: ficmpv6frame.cc:296
Definition: ficmpv6frame.h:22
Definition: ficmpv6frame.h:61
virtual size_t need_bytes() const
Definition: ficmpv6frame.cc:283
virtual void validate(uint16_t total_len=0) const
Definition: ficmpv6frame.cc:330
Definition: ficmpv6frame.h:85
ficmpv6frame(uint8_t *data, size_t datalen)
Definition: ficmpv6frame.cc:10
Definition: ficmpv6frame.h:25
Definition: ficmpv6frame.h:335