2 * Copyright (C) 2012 Giuliano Grassi
3 * Copyright (C) 2012 Ralf Sager
4 * Copyright (C) 2012 Tobias Brunner
5 * Hochschule fuer Technik Rapperswil
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 #include <android/log.h>
22 #include "charonservice.h"
23 #include "android_jni.h"
24 #include "kernel/android_ipsec.h"
25 #include "kernel/android_net.h"
31 #include <threading/thread.h>
33 #define ANDROID_DEBUG_LEVEL 1
35 typedef struct private_charonservice_t private_charonservice_t
;
38 * private data of charonservice
40 struct private_charonservice_t
{
45 charonservice_t
public;
48 * CharonVpnService reference
54 * Single instance of charonservice_t.
56 charonservice_t
*charonservice
;
59 * hook in library for debugging messages
61 extern void (*dbg
)(debug_t group
, level_t level
, char *fmt
, ...);
64 * Logging hook for library logs, using android specific logging
66 static void dbg_android(debug_t group
, level_t level
, char *fmt
, ...)
70 if (level
<= ANDROID_DEBUG_LEVEL
)
72 char sgroup
[16], buffer
[8192];
73 char *current
= buffer
, *next
;
75 snprintf(sgroup
, sizeof(sgroup
), "%N", debug_names
, group
);
77 vsnprintf(buffer
, sizeof(buffer
), fmt
, args
);
80 { /* log each line separately */
81 next
= strchr(current
, '\n');
86 __android_log_print(ANDROID_LOG_INFO
, "charon", "00[%s] %s\n",
94 * Initialize the charonservice object
96 static void charonservice_init(JNIEnv
*env
, jobject service
)
98 private_charonservice_t
*this;
99 static plugin_feature_t features
[] = {
100 PLUGIN_CALLBACK(kernel_net_register
, kernel_android_net_create
),
101 PLUGIN_PROVIDE(CUSTOM
, "kernel-net"),
102 PLUGIN_CALLBACK(kernel_ipsec_register
, kernel_android_ipsec_create
),
103 PLUGIN_PROVIDE(CUSTOM
, "kernel-ipsec"),
109 .vpn_service
= (*env
)->NewGlobalRef(env
, service
),
111 charonservice
= &this->public;
113 lib
->plugins
->add_static_features(lib
->plugins
, "androidbridge", features
,
114 countof(features
), TRUE
);
116 lib
->settings
->set_int(lib
->settings
,
117 "charon.plugins.android_log.loglevel", ANDROID_DEBUG_LEVEL
);
121 * Deinitialize the charonservice object
123 static void charonservice_deinit(JNIEnv
*env
)
125 private_charonservice_t
*this = (private_charonservice_t
*)charonservice
;
127 (*env
)->DeleteGlobalRef(env
, this->vpn_service
);
129 charonservice
= NULL
;
133 * Handle SIGSEGV/SIGILL signals raised by threads
135 static void segv_handler(int signal
)
137 dbg_android(DBG_DMN
, 1, "thread %u received %d", thread_current_id(),
143 * Initialize charon and the libraries via JNI
145 JNI_METHOD(CharonVpnService
, initializeCharon
, void)
147 struct sigaction action
;
149 /* logging for library during initialization, as we have no bus yet */
152 /* initialize library */
153 if (!library_init(NULL
))
159 if (!libhydra_init("charon"))
166 if (!libipsec_init())
174 charonservice_init(env
, this);
176 if (!libcharon_init("charon") ||
177 !charon
->initialize(charon
, PLUGINS
))
180 charonservice_deinit(env
);
187 /* add handler for SEGV and ILL etc. */
188 action
.sa_handler
= segv_handler
;
190 sigemptyset(&action
.sa_mask
);
191 sigaction(SIGSEGV
, &action
, NULL
);
192 sigaction(SIGILL
, &action
, NULL
);
193 sigaction(SIGBUS
, &action
, NULL
);
194 action
.sa_handler
= SIG_IGN
;
195 sigaction(SIGPIPE
, &action
, NULL
);
197 /* start daemon (i.e. the threads in the thread-pool) */
198 charon
->start(charon
);
202 * Deinitialize charon and all libraries
204 JNI_METHOD(CharonVpnService
, deinitializeCharon
, void)
207 charonservice_deinit(env
);