Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / asio / ip / icmp.hpp
1 //
2 // ip/icmp.hpp
3 // ~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10
11 #ifndef BOOST_ASIO_IP_ICMP_HPP
12 #define BOOST_ASIO_IP_ICMP_HPP
13
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/detail/socket_types.hpp>
20 #include <boost/asio/basic_raw_socket.hpp>
21 #include <boost/asio/ip/basic_endpoint.hpp>
22 #include <boost/asio/ip/basic_resolver.hpp>
23 #include <boost/asio/ip/basic_resolver_iterator.hpp>
24 #include <boost/asio/ip/basic_resolver_query.hpp>
25
26 #include <boost/asio/detail/push_options.hpp>
27
28 namespace boost {
29 namespace asio {
30 namespace ip {
31
32 /// Encapsulates the flags needed for ICMP.
33 /**
34  * The boost::asio::ip::icmp class contains flags necessary for ICMP sockets.
35  *
36  * @par Thread Safety
37  * @e Distinct @e objects: Safe.@n
38  * @e Shared @e objects: Safe.
39  *
40  * @par Concepts:
41  * Protocol, InternetProtocol.
42  */
43 class icmp
44 {
45 public:
46   /// The type of a ICMP endpoint.
47   typedef basic_endpoint<icmp> endpoint;
48
49   /// Construct to represent the IPv4 ICMP protocol.
50   static icmp v4() BOOST_ASIO_NOEXCEPT
51   {
52     return icmp(BOOST_ASIO_OS_DEF(IPPROTO_ICMP),
53         BOOST_ASIO_OS_DEF(AF_INET));
54   }
55
56   /// Construct to represent the IPv6 ICMP protocol.
57   static icmp v6() BOOST_ASIO_NOEXCEPT
58   {
59     return icmp(BOOST_ASIO_OS_DEF(IPPROTO_ICMPV6),
60         BOOST_ASIO_OS_DEF(AF_INET6));
61   }
62
63   /// Obtain an identifier for the type of the protocol.
64   int type() const BOOST_ASIO_NOEXCEPT
65   {
66     return BOOST_ASIO_OS_DEF(SOCK_RAW);
67   }
68
69   /// Obtain an identifier for the protocol.
70   int protocol() const BOOST_ASIO_NOEXCEPT
71   {
72     return protocol_;
73   }
74
75   /// Obtain an identifier for the protocol family.
76   int family() const BOOST_ASIO_NOEXCEPT
77   {
78     return family_;
79   }
80
81   /// The ICMP socket type.
82   typedef basic_raw_socket<icmp> socket;
83
84   /// The ICMP resolver type.
85   typedef basic_resolver<icmp> resolver;
86
87   /// Compare two protocols for equality.
88   friend bool operator==(const icmp& p1, const icmp& p2)
89   {
90     return p1.protocol_ == p2.protocol_ && p1.family_ == p2.family_;
91   }
92
93   /// Compare two protocols for inequality.
94   friend bool operator!=(const icmp& p1, const icmp& p2)
95   {
96     return p1.protocol_ != p2.protocol_ || p1.family_ != p2.family_;
97   }
98
99 private:
100   // Construct with a specific family.
101   explicit icmp(int protocol_id, int protocol_family) BOOST_ASIO_NOEXCEPT
102     : protocol_(protocol_id),
103       family_(protocol_family)
104   {
105   }
106
107   int protocol_;
108   int family_;
109 };
110
111 } // namespace ip
112 } // namespace asio
113 } // namespace boost
114
115 #include <boost/asio/detail/pop_options.hpp>
116
117 #endif // BOOST_ASIO_IP_ICMP_HPP