0
0
mirror of https://github.com/OpenVPN/openvpn.git synced 2024-09-19 19:42:30 +02:00

client-connect: Implement deferred connect support for plugin API v2

The V2 API is simpler than the V1 API since there is no passing of
data via files. This also means that with the current API the V2 API
cannot support async notify via files. Adding a file just for async
notify seems very hacky and when needed we should implement a better
option when async is needed for the plugin V2 API.

Signed-off-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <20200719173436.16431-5-arne@rfc2549.org>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg20480.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
Arne Schwabe 2020-07-19 19:34:36 +02:00 committed by Gert Doering
parent 3658e57797
commit aad16b6c48
3 changed files with 30 additions and 14 deletions

View File

@ -130,7 +130,8 @@ extern "C" {
#define OPENVPN_PLUGIN_ENABLE_PF 11
#define OPENVPN_PLUGIN_ROUTE_PREDOWN 12
#define OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER 13
#define OPENVPN_PLUGIN_N 14
#define OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2 14
#define OPENVPN_PLUGIN_N 15
/*
* Build a mask out of a set of plug-in types.

View File

@ -2111,35 +2111,47 @@ multi_client_connect_call_plugin_v2(struct multi_context *m,
bool deferred,
unsigned int *option_types_found)
{
if (deferred)
{
return CC_RET_FAILED;
}
enum client_connect_return ret = CC_RET_SKIPPED;
#ifdef ENABLE_PLUGIN
ASSERT(m);
ASSERT(mi);
ASSERT(option_types_found);
int call = deferred ? OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2 :
OPENVPN_PLUGIN_CLIENT_CONNECT_V2;
/* V2 callback, use a plugin_return struct for passing back return info */
if (plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_CONNECT_V2))
if (plugin_defined(mi->context.plugins, call))
{
struct plugin_return pr;
plugin_return_init(&pr);
if (plugin_call(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_CONNECT_V2,
NULL, &pr, mi->context.c2.es)
!= OPENVPN_PLUGIN_FUNC_SUCCESS)
{
msg(M_WARN, "WARNING: client-connect-v2 plugin call failed");
ret = CC_RET_FAILED;
}
else
int plug_ret = plugin_call(mi->context.plugins, call,
NULL, &pr, mi->context.c2.es);
if (plug_ret == OPENVPN_PLUGIN_FUNC_SUCCESS)
{
multi_client_connect_post_plugin(m, mi, &pr, option_types_found);
ret = CC_RET_SUCCEEDED;
}
else if (plug_ret == OPENVPN_PLUGIN_FUNC_DEFERRED)
{
ret = CC_RET_DEFERRED;
if (!(plugin_defined(mi->context.plugins,
OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2)))
{
msg(M_WARN, "A plugin that defers from the "
"OPENVPN_PLUGIN_CLIENT_CONNECT_V2 call must also "
"declare support for "
"OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2");
ret = CC_RET_FAILED;
}
}
else
{
msg(M_WARN, "WARNING: client-connect-v2 plugin call failed");
ret = CC_RET_FAILED;
}
plugin_return_free(&pr);
}

View File

@ -107,6 +107,9 @@ plugin_type_name(const int type)
case OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER:
return "PLUGIN_CLIENT_CONNECT_DEFER";
case OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2:
return "PLUGIN_CLIENT_CONNECT_DEFER_V2";
case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
return "PLUGIN_CLIENT_DISCONNECT";