OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 "pkt/proto_handler.h"
9 
10 #define IPV6_ADDR_SIZE_BYTES 16
11 #define IPV6_ICMP_NEXT_HEADER 58
12 
13 struct NdpKey;
14 class NdpEntry;
15 
16 // ICMPv6 protocol handler
17 class Icmpv6Handler : public ProtoHandler {
18 public:
19  static const Ip6Address::bytes_type kPrefix;
20  static const Ip6Address::bytes_type kSuffix;
24  Icmpv6Handler(Agent *agent, boost::shared_ptr<PktInfo> info,
25  boost::asio::io_context &io);
26  virtual ~Icmpv6Handler();
27 
28  bool Run();
29  bool RouterAdvertisement(Icmpv6Proto *proto);
30  void SendNeighborAdvert(const Ip6Address &sip, const Ip6Address &dip,
31  const MacAddress &smac, const MacAddress &dmac,
32  uint32_t itf, uint32_t vrf, bool solicited);
33  void SendNeighborSolicit(const Ip6Address &sip, const Ip6Address &dip,
34  const VmInterface *vmi, uint32_t vrf,
35  bool send_unicast=false);
36  friend void intrusive_ptr_add_ref(const Icmpv6Handler *p);
37  friend void intrusive_ptr_release(const Icmpv6Handler *p);
38 
39 private:
40  bool CheckPacket();
41  bool HandlePacket();
42  bool HandleMessage();
43  void EntryDelete(NdpKey &key);
44  uint16_t FillRouterAdvertisement(uint8_t *buf, uint32_t ifindex,
45  uint8_t *src, uint8_t *dest,
46  const Ip6Address &prefix, uint8_t plen);
47  uint16_t FillNeighborAdvertisement(uint8_t *buf, uint8_t *dip,
48  uint8_t *sip, const Ip6Address &target,
49  const MacAddress &dmac, bool solicited);
50  void SendRAResponse(uint32_t ifindex, uint32_t vrfindex,
51  uint8_t *src_ip, uint8_t *dest_ip,
52  const MacAddress &dest_mac,
53  const Ip6Address &prefix, uint8_t plen);
54  void SendPingResponse();
55  void SendIcmpv6Response(uint32_t ifindex, uint32_t vrfindex,
56  uint8_t *src_ip, uint8_t *dest_ip,
57  const MacAddress &dest_mac, uint16_t len);
58  void SolicitedMulticastIpAndMac(const Ip6Address &dip, uint8_t *ip,
59  MacAddress &mac);
60  uint16_t FillNeighborSolicit(uint8_t *buf, const Ip6Address &target,
61  uint8_t *sip, uint8_t *dip);
62  void Ipv6Lower24BitsExtract(uint8_t *dst, uint8_t *src);
63  void Ipv6AddressBitwiseOr(uint8_t *dst, uint8_t *src);
64  bool IsDefaultGatewayConfigured(uint32_t ifindex, const Ip6Address &addr);
65  bool IsIPv6AddrUnspecifiedBytes(const uint8_t *ip);
66 
67  icmp6_hdr *icmp_;
68  uint16_t icmp_len_;
69  mutable tbb::atomic<uint32_t> refcount_;
71 };
72 
73 #endif // vnsw_agent_icmpv6_handler_h_
icmp6_hdr * icmp_
static const Ip6Address::bytes_type kSuffix
static const uint8_t kIPv6AddrUnspecifiedBytes[IPV6_ADDR_SIZE_BYTES]
uint16_t icmp_len_
static const Ip6Address::bytes_type kPrefix
uint16_t FillNeighborSolicit(uint8_t *buf, const Ip6Address &target, uint8_t *sip, uint8_t *dip)
static const Ip6Address kSolicitedNodeIpPrefix
void Ipv6Lower24BitsExtract(uint8_t *dst, uint8_t *src)
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)
#define IPV6_ADDR_SIZE_BYTES
bool RouterAdvertisement(Icmpv6Proto *proto)
Agent * agent() const
Definition: proto_handler.h:80
void SendPingResponse()
void SendNeighborAdvert(const Ip6Address &sip, const Ip6Address &dip, const MacAddress &smac, const MacAddress &dmac, uint32_t itf, uint32_t vrf, bool solicited)
Definition: agent.h:358
tbb::atomic< uint32_t > refcount_
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
uint16_t FillNeighborAdvertisement(uint8_t *buf, uint8_t *dip, uint8_t *sip, const Ip6Address &target, const MacAddress &dmac, bool solicited)
void SolicitedMulticastIpAndMac(const Ip6Address &dip, uint8_t *ip, MacAddress &mac)
bool IsDefaultGatewayConfigured(uint32_t ifindex, const Ip6Address &addr)
friend void intrusive_ptr_release(const Icmpv6Handler *p)
uint16_t FillRouterAdvertisement(uint8_t *buf, uint32_t ifindex, uint8_t *src, uint8_t *dest, const Ip6Address &prefix, uint8_t plen)
void SendNeighborSolicit(const Ip6Address &sip, const Ip6Address &dip, const VmInterface *vmi, uint32_t vrf, bool send_unicast=false)
void Ipv6AddressBitwiseOr(uint8_t *dst, uint8_t *src)
void EntryDelete(NdpKey &key)
DISALLOW_COPY_AND_ASSIGN(Icmpv6Handler)
virtual ~Icmpv6Handler()
bool IsIPv6AddrUnspecifiedBytes(const uint8_t *ip)
friend void intrusive_ptr_add_ref(const Icmpv6Handler *p)
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 kSolicitedNodeIpSuffixMask
Icmpv6Handler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)