aboutsummaryrefslogtreecommitdiffstats
path: root/src/frontends/android/jni/libandroidbridge/charonservice.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2012-08-13 10:39:34 +0200
committerTobias Brunner <tobias@strongswan.org>2012-08-13 10:45:39 +0200
commite4ef4c9877d5ccb773ace0edf655351428c39572 (patch)
tree9b3349ad0cafc1acebafb2ff2dc78a031f28c555 /src/frontends/android/jni/libandroidbridge/charonservice.c
parent000668d3081422a3ac06fe16f038a4b1d6700f96 (diff)
parent6fbf4472ea785f3c75d278b1a7400534989bf26a (diff)
downloadstrongswan-e4ef4c9877d5ccb773ace0edf655351428c39572.tar.bz2
strongswan-e4ef4c9877d5ccb773ace0edf655351428c39572.tar.xz
Merge branch 'android-ndk'
This branch comes with some preliminary changes for the user-land IPsec implementation and the Android App. One important change is that the UDP ports used by the socket-default plugin were made configurable (either via ./configure or strongswan.conf). Also, the plugin does randomly allocate a port if it is configured to 0, which is useful for client implementations. A consequence of these changes is that the local UDP port used when creating ike_cfg_t objects has to be fetched from the socket.
Diffstat (limited to 'src/frontends/android/jni/libandroidbridge/charonservice.c')
-rw-r--r--src/frontends/android/jni/libandroidbridge/charonservice.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c
new file mode 100644
index 000000000..424d50d24
--- /dev/null
+++ b/src/frontends/android/jni/libandroidbridge/charonservice.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2012 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <string.h>
+#include <android/log.h>
+#include <jni.h>
+
+#include <hydra.h>
+#include <ipsec.h>
+#include <daemon.h>
+#include <library.h>
+
+#define JNI_PACKAGE org_strongswan_android
+
+#define JNI_METHOD_PP(pack, klass, name, ret, ...) \
+ ret Java_##pack##_##klass##_##name(JNIEnv *env, jobject this, ##__VA_ARGS__)
+
+#define JNI_METHOD_P(pack, klass, name, ret, ...) \
+ JNI_METHOD_PP(pack, klass, name, ret, ##__VA_ARGS__)
+
+#define JNI_METHOD(klass, name, ret, ...) \
+ JNI_METHOD_P(JNI_PACKAGE, klass, name, ret, ##__VA_ARGS__)
+
+/**
+ * hook in library for debugging messages
+ */
+extern void (*dbg) (debug_t group, level_t level, char *fmt, ...);
+
+/**
+ * Logging hook for library logs, using android specific logging
+ */
+static void dbg_android(debug_t group, level_t level, char *fmt, ...)
+{
+ va_list args;
+
+ if (level <= 4)
+ {
+ char sgroup[16], buffer[8192];
+ char *current = buffer, *next;
+ snprintf(sgroup, sizeof(sgroup), "%N", debug_names, group);
+ va_start(args, fmt);
+ vsnprintf(buffer, sizeof(buffer), fmt, args);
+ va_end(args);
+ while (current)
+ { /* log each line separately */
+ next = strchr(current, '\n');
+ if (next)
+ {
+ *(next++) = '\0';
+ }
+ __android_log_print(ANDROID_LOG_INFO, "charon", "00[%s] %s\n",
+ sgroup, current);
+ current = next;
+ }
+ }
+}
+
+/**
+ * Initialize charon and the libraries via JNI
+ */
+JNI_METHOD(CharonVpnService, initializeCharon, void)
+{
+ /* logging for library during initialization, as we have no bus yet */
+ dbg = dbg_android;
+
+ /* initialize library */
+ if (!library_init(NULL))
+ {
+ library_deinit();
+ return;
+ }
+
+ if (!libhydra_init("charon"))
+ {
+ libhydra_deinit();
+ library_deinit();
+ return;
+ }
+
+ if (!libipsec_init())
+ {
+ libipsec_deinit();
+ libhydra_deinit();
+ library_deinit();
+ return;
+ }
+
+ if (!libcharon_init("charon") ||
+ !charon->initialize(charon, PLUGINS))
+ {
+ libcharon_deinit();
+ libipsec_deinit();
+ libhydra_deinit();
+ library_deinit();
+ return;
+ }
+
+ /* start daemon (i.e. the threads in the thread-pool) */
+ charon->start(charon);
+}
+
+/**
+ * Initialize charon and the libraries via JNI
+ */
+JNI_METHOD(CharonVpnService, deinitializeCharon, void)
+{
+ libcharon_deinit();
+ libipsec_deinit();
+ libhydra_deinit();
+ library_deinit();
+}
+