OpenSDN source code
icmpv6_handler.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_icmpv6_handler_h_
6 #define vnsw_agent_icmpv6_handler_h_
7 
8 #include <atomic>
9 
10 #include "pkt/proto_handler.h"
11 
12 #define IPV6_ADDR_SIZE_BYTES 16
13 #define IPV6_ICMP_NEXT_HEADER 58
14 
15 struct NdpKey;
16 class NdpEntry;
17 
18 // ICMPv6 protocol handler
19 class Icmpv6Handler : public ProtoHandler {
20 public:
21  static const Ip6Address::bytes_type kPrefix;
22  static const Ip6Address::bytes_type kSuffix;
26  Icmpv6Handler(Agent *agent, boost::shared_ptr<PktInfo> info,
27  boost::asio::io_context &io);
28  virtual ~Icmpv6Handler();
29 
30  bool Run();
31  bool RouterAdvertisement(Icmpv6Proto *proto);
32  void SendNeighborAdvert(const Ip6Address &sip, const Ip6Address &dip,
33  const MacAddress &smac, const MacAddress &dmac,
34  uint32_t itf, uint32_t vrf, bool solicited);
35  void SendNeighborSolicit(const Ip6Address &sip, const Ip6Address &dip,
36  const VmInterface *vmi, uint32_t vrf,
37  bool send_unicast=false);
38  friend void intrusive_ptr_add_ref(const Icmpv6Handler *p);
39  friend void intrusive_ptr_release(const Icmpv6Handler *p);
40 
41 private:
42  bool CheckPacket();
43  bool HandlePacket();
44  bool HandleMessage();
45  void EntryDelete(NdpKey &key);
46  uint16_t FillRouterAdvertisement(uint8_t *buf, uint32_t ifindex,
47  uint8_t *src, uint8_t *dest,
48  const Ip6Address &prefix, uint8_t plen);
49  uint16_t FillNeighborAdvertisement(uint8_t *buf, uint8_t *dip,
50  uint8_t *sip, const Ip6Address &target,
51  const MacAddress &dmac, bool solicited);
52  void SendRAResponse(uint32_t ifindex, uint32_t vrfindex,
53  uint8_t *src_ip, uint8_t *dest_ip,
54  const MacAddress &dest_mac,
55  const Ip6Address &prefix, uint8_t plen);
56  void SendPingResponse();
57  void SendIcmpv6Response(uint32_t ifindex, uint32_t vrfindex,
58  uint8_t *src_ip, uint8_t *dest_ip,
59  const MacAddress &dest_mac, uint16_t len);
60  void SolicitedMulticastIpAndMac(const Ip6Address &dip, uint8_t *ip,
61  MacAddress &mac);
62  uint16_t FillNeighborSolicit(uint8_t *buf, const Ip6Address &target,
63  uint8_t *sip, uint8_t *dip);
64  void Ipv6Lower24BitsExtract(uint8_t *dst, uint8_t *src);
65  void Ipv6AddressBitwiseOr(uint8_t *dst, uint8_t *src);
66  bool IsDefaultGatewayConfigured(uint32_t ifindex, const Ip6Address &addr);
67  bool IsIPv6AddrUnspecifiedBytes(const uint8_t *ip);
68 
69  icmp6_hdr *icmp_;
70  uint16_t icmp_len_;
71  mutable std::atomic<uint32_t> refcount_;
73 };
74 
75 #endif // vnsw_agent_icmpv6_handler_h_
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
Definition: agent.h:360
void SendIcmpv6Response(uint32_t ifindex, uint32_t vrfindex, uint8_t *src_ip, uint8_t *dest_ip, const MacAddress &dest_mac, uint16_t len)
static const Ip6Address kSolicitedNodeIpPrefix
void SendNeighborSolicit(const Ip6Address &sip, const Ip6Address &dip, const VmInterface *vmi, uint32_t vrf, bool send_unicast=false)
void SendRAResponse(uint32_t ifindex, uint32_t vrfindex, uint8_t *src_ip, uint8_t *dest_ip, const MacAddress &dest_mac, const Ip6Address &prefix, uint8_t plen)
void SendPingResponse()
virtual ~Icmpv6Handler()
bool IsDefaultGatewayConfigured(uint32_t ifindex, const Ip6Address &addr)
void SendNeighborAdvert(const Ip6Address &sip, const Ip6Address &dip, const MacAddress &smac, const MacAddress &dmac, uint32_t itf, uint32_t vrf, bool solicited)
static const Ip6Address::bytes_type kSuffix
friend void intrusive_ptr_add_ref(const Icmpv6Handler *p)
icmp6_hdr * icmp_
bool RouterAdvertisement(Icmpv6Proto *proto)
uint16_t FillRouterAdvertisement(uint8_t *buf, uint32_t ifindex, uint8_t *src, uint8_t *dest, const Ip6Address &prefix, uint8_t plen)
void EntryDelete(NdpKey &key)
static const Ip6Address kSolicitedNodeIpSuffixMask
void Ipv6Lower24BitsExtract(uint8_t *dst, uint8_t *src)
friend void intrusive_ptr_release(const Icmpv6Handler *p)
void SolicitedMulticastIpAndMac(const Ip6Address &dip, uint8_t *ip, MacAddress &mac)
static const uint8_t kIPv6AddrUnspecifiedBytes[IPV6_ADDR_SIZE_BYTES]
uint16_t icmp_len_
uint16_t FillNeighborAdvertisement(uint8_t *buf, uint8_t *dip, uint8_t *sip, const Ip6Address &target, const MacAddress &dmac, bool solicited)
DISALLOW_COPY_AND_ASSIGN(Icmpv6Handler)
std::atomic< uint32_t > refcount_
void Ipv6AddressBitwiseOr(uint8_t *dst, uint8_t *src)
Icmpv6Handler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
static const Ip6Address::bytes_type kPrefix
bool IsIPv6AddrUnspecifiedBytes(const uint8_t *ip)
uint16_t FillNeighborSolicit(uint8_t *buf, const Ip6Address &target, uint8_t *sip, uint8_t *dip)
Agent * agent() const
Definition: proto_handler.h:80
#define IPV6_ADDR_SIZE_BYTES
Definition: io_utils.cc:11