14#ifndef OPENVPN_TUN_MAC_CLIENT_TUNSETUP_H
15#define OPENVPN_TUN_MAC_CLIENT_TUNSETUP_H
61 Json::Value root(Json::objectValue);
63 root[
"layer"] = Json::Value(
layer.
str());
68 void from_json(
const Json::Value &root,
const std::string &title)
override
89 std::ostream &
os)
override
94 throw tun_mac_setup(
"missing config");
107#if defined(MAC_TUNTAP_FALLBACK)
108#if !defined(ASIO_DISABLE_KQUEUE)
109#error Mac OS X TunTap adapter is incompatible with kqueue; rebuild with ASIO_DISABLE_KQUEUE
118 catch (
const std::exception &e)
120 os << e.what() << std::endl;
130 catch (
const std::exception &e)
143 auto failed_actions = add_cmds->
execute(
os);
152 os <<
"open " << conf->
iface_name <<
" SUCCEEDED" << std::endl;
167 std::ostringstream
os;
184 const std::string &gateway_str,
185 const std::string &iface,
186 const unsigned int flags,
197 add->argv.push_back(
"/sbin/route");
198 add->argv.push_back(
"add");
199 add->argv.push_back(
"-net");
200 add->argv.push_back(
"-inet6");
202 add->argv.push_back(
"-prefixlen");
205 add->argv.push_back(
"-reject");
207 add->argv.push_back(
"-blackhole");
212 add->argv.push_back(
"-iface");
213 add->argv.push_back(iface);
218 std::string
g = gateway_str;
221 add->argv.push_back(
g);
228 del->argv[1] =
"delete";
238 add->argv.push_back(
"/sbin/route");
239 add->argv.push_back(
"add");
242 add->argv.push_back(
"-cloning");
243 add->argv.push_back(
"-net");
245 add->argv.push_back(
"-netmask");
247 add->argv.push_back(
"-interface");
248 add->argv.push_back(iface);
252 add->argv.push_back(
"-net");
254 add->argv.push_back(
"-netmask");
257 add->argv.push_back(
"-reject");
259 add->argv.push_back(
"-blackhole");
264 add->argv.push_back(
"-iface");
265 add->argv.push_back(iface);
268 add->argv.push_back(gateway_str);
275 del->argv[1] =
"delete";
282 const std::string &gateway_str,
283 const std::string &iface,
284 const unsigned int flags,
310 iface_down->argv.push_back(
"/sbin/ifconfig");
311 iface_down->argv.push_back(iface_name);
312 iface_down->argv.push_back(
"down");
313 create.
add(iface_down);
322 cmd->argv.push_back(
"/sbin/ifconfig");
323 cmd->argv.push_back(iface_name);
324 cmd->argv.push_back(local4->
address);
325 cmd->argv.push_back(local4->
gateway);
326 cmd->argv.push_back(
"netmask");
327 cmd->argv.push_back(netmask.
to_string());
328 cmd->argv.push_back(
"mtu");
329 cmd->argv.push_back(to_string(pull.
mtu));
330 cmd->argv.push_back(
"up");
341 cmd->argv.push_back(
"/sbin/ifconfig");
342 cmd->argv.push_back(iface_name);
343 cmd->argv.push_back(
"inet6");
345 cmd->argv.push_back(
"up");
353 for (std::vector<TunBuilderCapture::Route>::const_iterator i = pull.
add_routes.begin(); i != pull.
add_routes.end(); ++i)
363 if (local4 && !local4->
gateway.empty())
366 os <<
"ERROR: IPv4 route pushed without IPv4 ifconfig and/or route-gateway" << std::endl;
391 os <<
"NOTE: cannot determine gateway for exclude IPv6 routes" << std::endl;
399 os <<
"NOTE: cannot determine gateway for exclude IPv4 routes" << std::endl;
423 os <<
"ERROR: cannot detect IPv4 default gateway" << std::endl;
428 os <<
"remote is IPv6, skip bypass route for reroute-ipv4" << std::endl;
458 os <<
"ERROR: cannot detect IPv6 default gateway" << std::endl;
463 os <<
"remote is IPv4, skip bypass route for reroute-ipv6" << std::endl;
489#ifdef ENABLE_DNS_WATCHDOG
499 ProxySettings::add_actions<MacProxySettings>(pull, create,
destroy);
515 add_del_route(route, 32, gw.gateway_addr_str(), gw.iface(), 0, add_cmds, remove_cmds_bypass_gw);
520 add_del_route(route, 128, gw.gateway_addr_str(), gw.iface(),
R_IPv6, add_cmds, remove_cmds_bypass_gw);
void destroy(std::ostream &os) override
virtual std::unordered_set< std::string > execute(std::ostream &os)
Executes a sequence of actions and returns marks of failed actions.
void remove_marked(const std::unordered_set< std::string > &marks, std::ostream &os)
Removes actions with specified marks and logs the removals.
void enable_destroy(const bool state)
static Addr from_ipv6(IPv6::Addr addr)
static Addr from_ipv4(IPv4::Addr addr)
static Addr netmask_from_prefix_len(const unsigned int prefix_len)
std::string to_string() const
static Addr from_string(const std::string &ipstr, const TITLE &title)
static Addr netmask_from_prefix_len(const unsigned int prefix_len)
std::string to_string() const
static Addr from_string(const std::string &ipstr, const TITLE &title)
static Layer from_str(const std::string &str)
static void add_actions(const MacDNS::Config::Ptr &dns, const unsigned int flags, ActionList &create, ActionList &destroy)
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
bool defined() const
Checks if the URL is defined.
Route address class that may use non-canonical form.
unsigned char prefix_length
Route class that must use canonical form.
RemoteAddress remote_address
std::vector< RouteAddress > tunnel_addresses
std::vector< Route > add_routes
ProxyAutoConfigURL proxy_auto_config_url
int tunnel_address_index_ipv4
std::vector< Route > exclude_routes
int tunnel_address_index_ipv6
int establish(const TunBuilderCapture &pull, TunBuilderSetup::Config *config, Stop *stop, std::ostream &os) override
static void add_bypass_route(const std::string &route, bool ipv6, ActionList &add_cmds, ActionList &remove_cmds_bypass_gw)
ActionList::Ptr remove_cmds
static void add_del_route(const std::string &addr_str, const int prefix_len, const std::string &gateway_str, const std::string &iface, const unsigned int flags, ActionList &create, ActionList &destroy)
static void add_del_route(const std::string &addr_str, const int prefix_len, const std::string &gateway_str, const std::string &iface, const unsigned int flags, Action::Ptr &create, Action::Ptr &destroy)
bool add_bypass_route(const std::string &address, bool ipv6, std::ostream &os)
OPENVPN_EXCEPTION(tun_mac_setup)
static void tun_config(const std::string &iface_name, const TunBuilderCapture &pull, ActionList &create, ActionList &destroy, std::ostream &os)
void destroy(std::ostream &os) override
int utun_open(std::string &name, const int unit)
int tuntap_open(const Layer &layer, std::string &name)
void assert_dict(const Json::Value &obj, const TITLE &title)
void to_string(const Json::Value &root, std::string &dest, const NAME &name, const TITLE &title)
void to_bool(const Json::Value &root, bool &dest, const NAME &name, const TITLE &title)
std::string get_string(const Json::Value &root, const NAME &name, const TITLE &title)
bool add_bypass_routes_on_establish
void from_json(const Json::Value &root, const std::string &title) override
Json::Value to_json() override
static const char config[]
int prefix_len(const IPv4::Addr::base_type mask)
static void add(const Time &t1, const Time::Duration &d1)