android: Set strongswan.conf options before initializing other libraries

This commit is contained in:
Tobias Brunner
2013-05-03 15:11:19 +02:00
parent 0b9ce21b5e
commit 67332b4e22
@@ -376,11 +376,46 @@ static bool charonservice_register(void *plugin, plugin_feature_t *feature,
return TRUE;
}
/**
* Set strongswan.conf options
*/
static void set_options(char *logfile)
{
lib->settings->set_int(lib->settings,
"charon.plugins.android_log.loglevel", ANDROID_DEBUG_LEVEL);
/* setup file logger */
lib->settings->set_str(lib->settings,
"charon.filelog.%s.time_format", "%b %e %T", logfile);
lib->settings->set_bool(lib->settings,
"charon.filelog.%s.append", FALSE, logfile);
lib->settings->set_bool(lib->settings,
"charon.filelog.%s.flush_line", TRUE, logfile);
lib->settings->set_int(lib->settings,
"charon.filelog.%s.default", ANDROID_DEBUG_LEVEL, logfile);
lib->settings->set_int(lib->settings,
"charon.retransmit_tries", ANDROID_RETRASNMIT_TRIES);
lib->settings->set_double(lib->settings,
"charon.retransmit_timeout", ANDROID_RETRANSMIT_TIMEOUT);
lib->settings->set_double(lib->settings,
"charon.retransmit_base", ANDROID_RETRANSMIT_BASE);
lib->settings->set_bool(lib->settings,
"charon.close_ike_on_child_failure", TRUE);
/* setting the source address breaks the VpnService.protect() function which
* uses SO_BINDTODEVICE internally. the addresses provided to the kernel as
* auxiliary data have precedence over this option causing a routing loop if
* the gateway is contained in the VPN routes. alternatively, providing an
* explicit device (in addition or instead of the source address) in the
* auxiliary data would also work, but we currently don't have that
* information */
lib->settings->set_bool(lib->settings,
"charon.plugins.socket-default.set_source", FALSE);
}
/**
* Initialize the charonservice object
*/
static void charonservice_init(JNIEnv *env, jobject service, jobject builder,
char *logfile)
static void charonservice_init(JNIEnv *env, jobject service, jobject builder)
{
private_charonservice_t *this;
static plugin_feature_t features[] = {
@@ -414,36 +449,6 @@ static void charonservice_init(JNIEnv *env, jobject service, jobject builder,
lib->plugins->add_static_features(lib->plugins, "androidbridge", features,
countof(features), TRUE);
lib->settings->set_int(lib->settings,
"charon.plugins.android_log.loglevel", ANDROID_DEBUG_LEVEL);
/* setup file logger */
lib->settings->set_str(lib->settings,
"charon.filelog.%s.time_format", "%b %e %T", logfile);
lib->settings->set_bool(lib->settings,
"charon.filelog.%s.append", FALSE, logfile);
lib->settings->set_bool(lib->settings,
"charon.filelog.%s.flush_line", TRUE, logfile);
lib->settings->set_int(lib->settings,
"charon.filelog.%s.default", ANDROID_DEBUG_LEVEL, logfile);
lib->settings->set_int(lib->settings,
"charon.retransmit_tries", ANDROID_RETRASNMIT_TRIES);
lib->settings->set_double(lib->settings,
"charon.retransmit_timeout", ANDROID_RETRANSMIT_TIMEOUT);
lib->settings->set_double(lib->settings,
"charon.retransmit_base", ANDROID_RETRANSMIT_BASE);
lib->settings->set_bool(lib->settings,
"charon.close_ike_on_child_failure", TRUE);
/* setting the source address breaks the VpnService.protect() function which
* uses SO_BINDTODEVICE internally. the addresses provided to the kernel as
* auxiliary data have precedence over this option causing a routing loop if
* the gateway is contained in the VPN routes. alternatively, providing an
* explicit device (in addition or instead of the source address) in the
* auxiliary data would also work, but we currently don't have that
* information */
lib->settings->set_bool(lib->settings,
"charon.plugins.socket-default.set_source", FALSE);
}
/**
@@ -493,6 +498,11 @@ JNI_METHOD(CharonVpnService, initializeCharon, void,
return;
}
/* set options before initializing other libraries that might read them */
logfile = androidjni_convert_jstring(env, jlogfile);
set_options(logfile);
free(logfile);
if (!libhydra_init("charon"))
{
libhydra_deinit();
@@ -517,12 +527,10 @@ JNI_METHOD(CharonVpnService, initializeCharon, void,
return;
}
logfile = androidjni_convert_jstring(env, jlogfile);
charonservice_init(env, this, builder, logfile);
free(logfile);
charon->load_loggers(charon, NULL, FALSE);
charonservice_init(env, this, builder);
if (uname(&utsname) != 0)
{
memset(&utsname, 0, sizeof(utsname));