mirror of
https://github.com/OpenVPN/openvpn3.git
synced 2024-09-20 04:02:15 +02:00
Added gateway parameter to tun_builder_add_address for Windows and other
platforms that lack a VPN API.
This commit is contained in:
parent
3089e6551a
commit
7539c4e0d1
@ -57,7 +57,7 @@ public class OpenVPNClientThread extends ClientAPI_OpenVPNClient implements Runn
|
||||
// Methods documented in openvpn/tun/builder/base.hpp
|
||||
|
||||
boolean tun_builder_set_remote_address(String address, boolean ipv6);
|
||||
boolean tun_builder_add_address(String address, int prefix_length, boolean ipv6, boolean net30);
|
||||
boolean tun_builder_add_address(String address, int prefix_length, String gateway, boolean ipv6, boolean net30);
|
||||
boolean tun_builder_reroute_gw(String server_address, boolean server_address_ipv6, boolean ipv4, boolean ipv6, long flags);
|
||||
boolean tun_builder_add_route(String address, int prefix_length, boolean ipv6);
|
||||
boolean tun_builder_exclude_route(String address, int prefix_length, boolean ipv6);
|
||||
@ -254,10 +254,10 @@ public class OpenVPNClientThread extends ClientAPI_OpenVPNClient implements Runn
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tun_builder_add_address(String address, int prefix_length, boolean ipv6, boolean net30) {
|
||||
public boolean tun_builder_add_address(String address, int prefix_length, String gateway, boolean ipv6, boolean net30) {
|
||||
TunBuilder tb = tun_builder;
|
||||
if (tb != null)
|
||||
return tb.tun_builder_add_address(address, prefix_length, ipv6, net30);
|
||||
return tb.tun_builder_add_address(address, prefix_length, gateway, ipv6, net30);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
@ -45,6 +45,7 @@ namespace openvpn {
|
||||
// May be called more than once per tun_builder session
|
||||
virtual bool tun_builder_add_address(const std::string& address,
|
||||
int prefix_length,
|
||||
const std::string& gateway, // optional
|
||||
bool ipv6,
|
||||
bool net30)
|
||||
{
|
||||
|
@ -60,6 +60,7 @@ namespace openvpn {
|
||||
Route() : prefix_length(0), ipv6(false), net30(false) {}
|
||||
std::string address;
|
||||
int prefix_length;
|
||||
std::string gateway; // optional
|
||||
bool ipv6;
|
||||
bool net30;
|
||||
|
||||
@ -67,6 +68,8 @@ namespace openvpn {
|
||||
{
|
||||
std::ostringstream os;
|
||||
os << address << '/' << prefix_length;
|
||||
if (!gateway.empty())
|
||||
os << " -> " << gateway;
|
||||
if (ipv6)
|
||||
os << " [IPv6]";
|
||||
if (net30)
|
||||
@ -147,11 +150,12 @@ namespace openvpn {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool tun_builder_add_address(const std::string& address, int prefix_length, bool ipv6, bool net30)
|
||||
virtual bool tun_builder_add_address(const std::string& address, int prefix_length, const std::string& gateway, bool ipv6, bool net30)
|
||||
{
|
||||
Route r;
|
||||
r.address = address;
|
||||
r.prefix_length = prefix_length;
|
||||
r.gateway = gateway;
|
||||
r.ipv6 = ipv6;
|
||||
r.net30 = net30;
|
||||
if (ipv6)
|
||||
|
@ -114,6 +114,20 @@ namespace openvpn {
|
||||
|
||||
private:
|
||||
|
||||
static std::string route_gateway(const OptionList& opt)
|
||||
{
|
||||
std::string ret;
|
||||
const Option* o = opt.get_ptr("route-gateway"); // DIRECTIVE
|
||||
if (o)
|
||||
{
|
||||
const IP::Addr gateway = IP::Addr::from_string(o->get(1, 256), "route-gateway");
|
||||
if (gateway.version() != IP::Addr::V4)
|
||||
throw tun_prop_error("route-gateway is not IPv4 (IPv6 route-gateway is passed with ifconfig-ipv6 directive)");
|
||||
ret = gateway.to_string();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int tun_ifconfig(TunBuilderBase* tb, State* state, const OptionList& opt)
|
||||
{
|
||||
enum Topology {
|
||||
@ -152,6 +166,7 @@ namespace openvpn {
|
||||
throw tun_prop_error("ifconfig address is not IPv4 (topology subnet)");
|
||||
if (!tb->tun_builder_add_address(pair.addr.to_string(),
|
||||
pair.netmask.prefix_len(),
|
||||
route_gateway(opt),
|
||||
false, // IPv6
|
||||
false)) // net30
|
||||
throw tun_prop_error("tun_builder_add_address IPv4 failed (topology subnet)");
|
||||
@ -170,6 +185,7 @@ namespace openvpn {
|
||||
throw tun_prop_error("ifconfig addresses are not in the same /30 subnet (topology net30)");
|
||||
if (!tb->tun_builder_add_address(local.to_string(),
|
||||
netmask.prefix_len(),
|
||||
route_gateway(opt),
|
||||
false, // IPv6
|
||||
true)) // net30
|
||||
throw tun_prop_error("tun_builder_add_address IPv4 failed (topology net30)");
|
||||
@ -189,8 +205,17 @@ namespace openvpn {
|
||||
const IP::AddrMaskPair pair = IP::AddrMaskPair::from_string(o->get(1, 256), "ifconfig-ipv6");
|
||||
if (pair.version() != IP::Addr::V6)
|
||||
throw tun_prop_error("ifconfig-ipv6 address is not IPv6");
|
||||
std::string gateway_str;
|
||||
if (o->size() >= 3)
|
||||
{
|
||||
const IP::Addr gateway = IP::Addr::from_string(o->get(2, 256), "ifconfig-ipv6");
|
||||
if (gateway.version() != IP::Addr::V6)
|
||||
throw tun_prop_error("ifconfig-ipv6 gateway is not IPv6");
|
||||
gateway_str = gateway.to_string();
|
||||
}
|
||||
if (!tb->tun_builder_add_address(pair.addr.to_string(),
|
||||
pair.netmask.prefix_len(),
|
||||
gateway_str,
|
||||
true, // IPv6
|
||||
false)) // net30
|
||||
throw tun_prop_error("tun_builder_add_address IPv6 failed");
|
||||
|
Loading…
Reference in New Issue
Block a user