0
0
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:
James Yonan 2014-02-15 23:34:33 -07:00
parent 3089e6551a
commit 7539c4e0d1
4 changed files with 34 additions and 4 deletions

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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)

View File

@ -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");