18#include <linux/if_tun.h>
55 throw tun_linux_error(
"bad hex address");
62 const std::string &gateway_str,
63 const std::string &dev,
64 const unsigned int flags,
65 std::vector<IP::Route> *rtvec,
79 add->argv.push_back(
"/sbin/ip");
80 add->argv.push_back(
"-6");
81 add->argv.push_back(
"route");
82 add->argv.push_back(
"prepend");
84 add->argv.push_back(
"via");
85 add->argv.push_back(gateway_str);
88 add->argv.push_back(
"dev");
89 add->argv.push_back(dev);
112 add->argv.push_back(
"/sbin/ip");
113 add->argv.push_back(
"-4");
114 add->argv.push_back(
"route");
115 add->argv.push_back(
"prepend");
117 add->argv.push_back(
"via");
118 add->argv.push_back(gateway_str);
121 add->argv.push_back(
"dev");
122 add->argv.push_back(dev);
128 del->argv[3] =
"del";
139 const std::string &gateway_str,
140 const std::string &dev,
141 const unsigned int flags,
142 std::vector<IP::Route> *rtvec,
159 add->argv.push_back(
"/sbin/ip");
160 add->argv.push_back(
"link");
161 add->argv.push_back(
"set");
162 add->argv.push_back(iface_name);
163 add->argv.push_back(
"up");
166 add->argv.push_back(
"mtu");
173 del->argv[4] =
"down";
181 std::vector<IP::Route> *rtvec,
193 add->argv.push_back(
"/sbin/ip");
194 add->argv.push_back(
"-4");
195 add->argv.push_back(
"addr");
196 add->argv.push_back(
"add");
198 add->argv.push_back(
"broadcast");
200 add->argv.push_back(
"dev");
201 add->argv.push_back(iface_name);
204 add->argv.push_back(
"label");
211 del->argv[3] =
"del";
222 add->argv.push_back(
"/sbin/ip");
223 add->argv.push_back(
"-6");
224 add->argv.push_back(
"addr");
225 add->argv.push_back(
"add");
227 add->argv.push_back(
"dev");
228 add->argv.push_back(iface_name);
233 del->argv[3] =
"del";
245 std::vector<IP::Route> *rtvec,
248 const unsigned int flags)
259 iface_config(iface_name, -1, pull, rtvec, create, destroy);
272 if (local4 && !local4->
gateway.empty())
275 OPENVPN_LOG(
"ERROR: IPv4 route pushed without IPv4 ifconfig and/or route-gateway");
286 OPENVPN_LOG(
"NOTE: exclude IPv6 routes not supported yet");
293 OPENVPN_LOG(
"NOTE: cannot determine gateway for exclude IPv4 routes");
331 std::vector<IP::Route> *rtvec,
size_t size() const
Returns the size of the buffer in T objects.
T * data()
Get a mutable pointer to the start of the array.
std::string to_string() const
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)
static Addr from_bytes(const unsigned char *bytes)
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)
const IP::Addr & addr() const
const std::string & dev() const
Route address class that may use non-canonical form.
unsigned char prefix_length
RemoteAddress remote_address
std::vector< Route > add_routes
const RouteAddress * vpn_ipv6() const
Gets the IPv6 tunnel address.
const RouteAddress * vpn_ipv4() const
Gets the IPv4 tunnel address.
std::vector< Route > exclude_routes
#define OPENVPN_LOG(args)
constexpr BufferFlags CONSTRUCT_ZERO(1u<< 0)
if enabled, constructors/init will zero allocated space
void iface_config(const std::string &iface_name, int unit, const TunBuilderCapture &pull, std::vector< IP::Route > *rtvec, ActionList &create, ActionList &destroy)
void add_del_route(const std::string &addr_str, const int prefix_len, const std::string &gateway_str, const std::string &dev, const unsigned int flags, std::vector< IP::Route > *rtvec, Action::Ptr &create, Action::Ptr &destroy)
void iface_up(const std::string &iface_name, const int mtu, ActionList &create, ActionList &destroy)
IP::Addr cvt_pnr_ip_v4(const std::string &hexaddr)
void parse_hex(V &dest, const std::string &str)
std::string to_string(const T &t)
Convert a value to a string.
static void add_bypass_route(const std::string &tun_iface_name, const std::string &address, bool ipv6, std::vector< IP::Route > *rtvec, ActionList &create, ActionList &destroy)
static void tun_config(const std::string &iface_name, const TunBuilderCapture &pull, std::vector< IP::Route > *rtvec, ActionList &create, ActionList &destroy, const unsigned int flags)
int prefix_len(const IPv4::Addr::base_type mask)
static void add(const Time &t1, const Time::Duration &d1)