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:
parent
3658e57797
commit
aad16b6c48
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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";
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user