OpenVPN 3 Core Library
Loading...
Searching...
No Matches
enumiface.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12// Enumerate iOS network interfaces
13
14#ifndef OPENVPN_NETCONF_ENUMIFACE_H
15#define OPENVPN_NETCONF_ENUMIFACE_H
16
17#include <sys/types.h>
18#include <sys/socket.h>
19#include <ifaddrs.h>
20
21#ifdef OPENVPN_PLATFORM_IPHONE
23#else
24#include <net/route.h>
25#endif
26
27#include <cstring>
28#include <string>
29#include <sstream>
30#include <memory>
31
34#include <openvpn/addr/ip.hpp>
35
36namespace openvpn {
38{
39 public:
40 OPENVPN_EXCEPTION(enum_iface_error);
41
46
47 std::string to_string() const
48 {
49 std::ostringstream os;
50 os << "INTERFACES:" << std::endl;
51 for (const ifaddrs *i = ifinfo.get(); i->ifa_next; i = i->ifa_next)
52 render(i, os);
53 return os.str();
54 }
55
56 bool iface_up(const char *iface) const
57 {
58 for (const ifaddrs *i = ifinfo.get(); i->ifa_next; i = i->ifa_next)
59 {
60 if (!std::strcmp(iface, i->ifa_name)
61 && (i->ifa_flags & RTF_UP)
62 && IP::Addr::sockaddr_defined(i->ifa_addr))
63 return true;
64 }
65 return false;
66 }
67
68 protected:
69 static void render(const ifaddrs *i, std::ostream &os)
70 {
71 try
72 {
73 os << i->ifa_name;
74 os << ' ' << render_flags(i->ifa_flags);
75 if (i->ifa_addr)
76 {
77 const IP::Addr a = IP::Addr::from_sockaddr(i->ifa_addr);
78 if (a.defined())
79 os << ' ' << a;
80 }
81 if (i->ifa_netmask)
82 {
83 const IP::Addr nm = IP::Addr::from_sockaddr(i->ifa_netmask);
84 if (nm.defined())
85 {
86 try
87 {
88 unsigned int pl = nm.prefix_len();
89 os << '/' << pl;
90 }
91 catch (const std::exception &)
92 {
93 }
94 }
95 }
96 if (i->ifa_dstaddr)
97 {
98 const IP::Addr dst = IP::Addr::from_sockaddr(i->ifa_dstaddr);
99 if (dst.defined())
100 os << " (" << dst << ')';
101 }
102 }
103 catch (const std::exception &)
104 {
105 os << " ERROR";
106 }
107 os << std::endl;
108 }
109
110 static std::string render_flags(const u_int flags)
111 {
112 struct flag_info
113 {
114 u_int flag;
115 char c;
116 };
117 static const struct flag_info flag_info[] = {
118#ifdef RTF_UP
119 {RTF_UP, 'U'}, // Route usable
120#endif
121#ifdef RTF_GATEWAY
122 {RTF_GATEWAY, 'G'}, // Destination requires forwarding by intermediary
123#endif
124#ifdef RTF_HOST
125 {RTF_HOST, 'H'}, // Host entry (net otherwise)
126#endif
127#ifdef RTF_REJECT
128 {RTF_REJECT, 'R'}, // Host or net unreachable
129#endif
130#ifdef RTF_DYNAMIC
131 {RTF_DYNAMIC, 'D'}, // Created dynamically (by redirect)
132#endif
133#ifdef RTF_MODIFIED
134 {RTF_MODIFIED, 'M'}, // Modified dynamically (by redirect)
135#endif
136#ifdef RTF_CLONING
137 {RTF_CLONING, 'C'}, // Generate new routes on use
138#endif
139#ifdef RTF_XRESOLVE
140 {RTF_XRESOLVE, 'X'}, // External daemon translates proto to link address
141#endif
142#ifdef RTF_LLINFO
143 {RTF_LLINFO, 'L'}, // Valid protocol to link address translation
144#endif
145#ifdef RTF_STATIC
146 {RTF_STATIC, 'S'}, // Manually added
147#endif
148#ifdef RTF_BLACKHOLE
149 {RTF_BLACKHOLE, 'B'}, // Just discard packets (during updates)
150#endif
151#ifdef RTF_PROTO2
152 {RTF_PROTO2, '2'}, // Protocol specific routing flag #2
153#endif
154#ifdef RTF_PROTO1
155 {RTF_PROTO1, '1'}, // Protocol specific routing flag #1
156#endif
157#ifdef RTF_PRCLONING
158 {RTF_PRCLONING, 'c'}, // Protocol-specified generate new routes on use
159#endif
160#ifdef RTF_WASCLONED
161 {RTF_WASCLONED, 'W'}, // Route was generated as a result of cloning
162#endif
163#ifdef RTF_PROTO3
164 {RTF_PROTO3, '3'}, // Protocol specific routing flag #3
165#endif
166#ifdef RTF_BROADCAST
167 {RTF_BROADCAST, 'b'}, // The route represents a broadcast address
168#endif
169#ifdef RTF_MULTICAST
170 {RTF_MULTICAST, 'm'}, // The route represents a multicast address
171#endif
172#ifdef RTF_IFSCOPE
173 {RTF_IFSCOPE, 'I'}, // Route is associated with an interface scope
174#endif
175#ifdef RTF_IFREF
176 {RTF_IFREF, 'i'}, // Route is holding a reference to the interface
177#endif
178#ifdef RTF_PROXY
179 {RTF_PROXY, 'Y'}, // Proxying; cloned routes will not be scoped
180#endif
181#ifdef RTF_ROUTER
182 {RTF_ROUTER, 'r'}, // Host is a default router
183#endif
184 {0, '\0'},
185 };
186
187 std::string ret;
188 for (const struct flag_info *fi = flag_info; fi->flag; ++fi)
189 if (flags & fi->flag)
190 ret += fi->c;
191 return ret;
192 }
193
194 static ifaddrs *alloc_if_addrs()
195 {
196 ifaddrs *ifa = nullptr;
197 ::getifaddrs(&ifa);
198 return ifa;
199 }
200
201 static void free_if_addrs(ifaddrs *p)
202 {
203 // delete method for pointer returned by getifaddrs
204 freeifaddrs(p);
205 }
206
207 std::unique_ptr<ifaddrs, decltype(&free_if_addrs)> ifinfo;
208};
209} // namespace openvpn
210
211#endif
std::unique_ptr< ifaddrs, decltype(&free_if_addrs)> ifinfo
static ifaddrs * alloc_if_addrs()
static std::string render_flags(const u_int flags)
std::string to_string() const
Definition enumiface.hpp:47
bool iface_up(const char *iface) const
Definition enumiface.hpp:56
static void render(const ifaddrs *i, std::ostream &os)
Definition enumiface.hpp:69
OPENVPN_EXCEPTION(enum_iface_error)
static void free_if_addrs(ifaddrs *p)
static Addr from_sockaddr(const struct sockaddr *sa)
Definition ip.hpp:326
bool defined() const
Definition ip.hpp:872
static bool sockaddr_defined(const struct sockaddr *sa)
Definition ip.hpp:335
unsigned int prefix_len() const
Definition ip.hpp:968
#define RTF_BLACKHOLE
Definition net-route.h:109
#define RTF_PROTO2
Definition net-route.h:111
#define RTF_DYNAMIC
Definition net-route.h:101
#define RTF_CLONING
Definition net-route.h:105
#define RTF_STATIC
Definition net-route.h:108
#define RTF_UP
Definition net-route.h:97
#define RTF_GATEWAY
Definition net-route.h:98
#define RTF_PROTO3
Definition net-route.h:116
#define RTF_PROTO1
Definition net-route.h:112
#define RTF_HOST
Definition net-route.h:99
#define RTF_WASCLONED
Definition net-route.h:115
#define RTF_MODIFIED
Definition net-route.h:102
#define RTF_LLINFO
Definition net-route.h:107
#define RTF_REJECT
Definition net-route.h:100
#define RTF_PRCLONING
Definition net-route.h:114
#define RTF_IFREF
Definition net-route.h:124
#define RTF_BROADCAST
Definition net-route.h:120
#define RTF_PROXY
Definition net-route.h:125
#define RTF_ROUTER
Definition net-route.h:126
#define RTF_IFSCOPE
Definition net-route.h:122
#define RTF_MULTICAST
Definition net-route.h:121
#define RTF_XRESOLVE
Definition net-route.h:106
reroute_gw flags
std::string ret
std::ostringstream os