Switch from Gradle experimental to cmake

This commit is contained in:
M66B 2017-10-23 21:51:27 +02:00
parent fd28060e9e
commit 38e8c5698e
19 changed files with 297 additions and 438 deletions

2
.gitignore vendored
View File

@ -1,3 +1,4 @@
*.iml
.gradle .gradle
/local.properties /local.properties
/.idea /.idea
@ -7,3 +8,4 @@
/build /build
/captures /captures
/tools/config.sh /tools/config.sh
app/.externalNativeBuild

23
app/CMakeLists.txt Normal file
View File

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.4.1)
add_library( netguard
SHARED
src/main/jni/netguard/netguard.c
src/main/jni/netguard/session.c
src/main/jni/netguard/ip.c
src/main/jni/netguard/tcp.c
src/main/jni/netguard/udp.c
src/main/jni/netguard/icmp.c
src/main/jni/netguard/dns.c
src/main/jni/netguard/dhcp.c
src/main/jni/netguard/pcap.c
src/main/jni/netguard/util.c )
include_directories( src/main/jni/netguard/ )
find_library( log-lib
log )
target_link_libraries( netguard
${log-lib} )

View File

@ -8,11 +8,11 @@
</facet> </facet>
<facet type="android" name="Android"> <facet type="android" name="Android">
<configuration> <configuration>
<option name="SELECTED_BUILD_VARIANT" value="allDebug" /> <option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleAllDebug" /> <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileAllDebugSources" /> <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<afterSyncTasks> <afterSyncTasks>
<task>generateAllDebugSources</task> <task>generateDebugSources</task>
</afterSyncTasks> </afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" /> <option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" /> <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
@ -23,78 +23,48 @@
</facet> </facet>
<facet type="native-android-gradle" name="Native-Android-Gradle"> <facet type="native-android-gradle" name="Native-Android-Gradle">
<configuration> <configuration>
<option name="SELECTED_BUILD_VARIANT" value="allDebug" /> <option name="SELECTED_BUILD_VARIANT" value="debug" />
</configuration> </configuration>
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7"> <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
<output url="file://$MODULE_DIR$/build/intermediates/classes/all/debug" /> <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/all/debug" /> <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/all/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni/netguard" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/all/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/all/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/all/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/google-services/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/all/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/all/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/all/debug" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/all/debug" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/res" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/renderscript" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/allDebug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/all/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/all/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/all/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/all/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/all/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/all/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/all/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAllDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/all/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/all/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/all/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/all/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/all/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/all/renderscript" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/all/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testAll/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/renderscript" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
@ -108,39 +78,43 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/renderscript" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/renderscript" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/renderscript" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/binaries" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes-jar" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/cmake" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/objectFiles" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/splits-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" /> <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/reports" /> <excludeFolder url="file://$MODULE_DIR$/build/reports" />
@ -148,42 +122,42 @@
</content> </content>
<orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" /> <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-iid-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-iid-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-tasks-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-tasks-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-media-compat-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-media-compat-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.android.support:recyclerview-v7-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:recyclerview-v7-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-ads-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-ads-11.4.2" level="project" />
<orderEntry type="library" exported="" name="android.arch.lifecycle:common:1.0.0@jar" level="project" /> <orderEntry type="library" name="android.arch.lifecycle:common:1.0.0@jar" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-base-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-base-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-fragment-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-fragment-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-vector-drawable-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-vector-drawable-26.1.0" level="project" />
<orderEntry type="library" exported="" name="android.arch.lifecycle:runtime-1.0.0" level="project" /> <orderEntry type="library" name="android.arch.lifecycle:runtime-1.0.0" level="project" />
<orderEntry type="library" exported="" name="com.android.support:appcompat-v7-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:appcompat-v7-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-basement-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-basement-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-annotations:26.1.0@jar" level="project" /> <orderEntry type="library" name="com.android.support:support-annotations:26.1.0@jar" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-basement-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-basement-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-analytics-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-analytics-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-core-utils-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-core-utils-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-core-ui-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-core-ui-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-iid-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-iid-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-ads-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-ads-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-compat-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-compat-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-common-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-common-11.4.2" level="project" />
<orderEntry type="library" exported="" name="android.arch.core:common:1.0.0@jar" level="project" /> <orderEntry type="library" name="android.arch.core:common:1.0.0@jar" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-ads-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-ads-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-ads-lite-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-ads-lite-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-tasks-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-tasks-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-core-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-core-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-gass-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-gass-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-common-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-common-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.android.support:support-v4-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:support-v4-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.android.support:animated-vector-drawable-26.1.0" level="project" /> <orderEntry type="library" name="com.android.support:animated-vector-drawable-26.1.0" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-ads-lite-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-ads-lite-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.squareup.picasso:picasso:2.5.2@jar" level="project" /> <orderEntry type="library" name="com.squareup.picasso:picasso:2.5.2@jar" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-base-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-base-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-analytics-impl-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-analytics-impl-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-analytics-impl-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-analytics-impl-license-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.android.gms:play-services-gass-11.4.2" level="project" /> <orderEntry type="library" name="com.google.android.gms:play-services-gass-11.4.2" level="project" />
<orderEntry type="library" exported="" name="com.google.firebase:firebase-analytics-license-11.4.2" level="project" /> <orderEntry type="library" name="com.google.firebase:firebase-analytics-license-11.4.2" level="project" />
</component> </component>
</module> </module>

View File

@ -1,101 +1,66 @@
apply plugin: 'com.android.model.application' apply plugin: 'com.android.application'
model { android {
android { compileSdkVersion = 26
compileSdkVersion = 26 buildToolsVersion = "26.0.2"
buildToolsVersion = "26.0.2"
defaultConfig { defaultConfig {
applicationId = "eu.faircode.netguard" applicationId = "eu.faircode.netguard"
} versionName = "2.142"
minSdkVersion 14
targetSdkVersion 26
versionCode = 2017102301
archivesBaseName = "NetGuard-v$versionName"
compileOptions.with { externalNativeBuild {
sourceCompatibility JavaVersion.VERSION_1_7 cmake {
targetCompatibility JavaVersion.VERSION_1_7 cppFlags ""
arguments "-DANDROID_PLATFORM=android-14"
// https://developer.android.com/ndk/guides/cmake.html
}
} }
ndk { ndk {
platformVersion = "14" abiFilters 'armeabi', 'x86'
moduleName = "netguard"
toolchain = "clang"
ldLibs.add("log")
} }
}
sources { externalNativeBuild {
main { cmake {
jni { path "CMakeLists.txt"
source {
srcDirs.removeAll()
srcDirs.add('src/main/jni/netguard')
}
exportedHeaders {
}
}
}
} }
}
buildTypes { buildTypes {
release { release {
minifyEnabled = true minifyEnabled = true
useProguard = true useProguard = true
proguardFiles.add(file('proguard-rules.pro')) proguardFiles.add(file('proguard-rules.pro'))
ndk.with {
debuggable = false
}
}
debug {
minifyEnabled = true
useProguard = true
proguardFiles.add(file('proguard-rules.pro'))
ndk.with {
debuggable = false
}
}
} }
debug {
productFlavors { minifyEnabled = true
create("all") { useProguard = true
versionName = "2.141" proguardFiles.add(file('proguard-rules.pro'))
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 26
versionCode = 2017102202
archivesBaseName = "NetGuard-v$versionName"
}
create("lollipop-and-later") {
versionName = "2.141"
minSdkVersion.apiLevel = 20
targetSdkVersion.apiLevel = 26
versionCode = 2017102212
archivesBaseName = "NetGuard-v$versionName"
}
create("kitkat-and-earlier") {
versionName = "2.141"
minSdkVersion.apiLevel = 14
maxSdkVersion = 19
targetSdkVersion.apiLevel = 26
versionCode = 2017102222
archivesBaseName = "NetGuard-v$versionName"
}
} }
} }
} }
dependencies { dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
// https://developer.android.com/topic/libraries/support-library/revisions.html // https://developer.android.com/topic/libraries/support-library/revisions.html
compile 'com.android.support:appcompat-v7:26.1.+' implementation 'com.android.support:appcompat-v7:26.1.+'
compile 'com.android.support:recyclerview-v7:26.1.+' implementation 'com.android.support:recyclerview-v7:26.1.+'
// https://developers.google.com/android/guides/setup // https://developers.google.com/android/guides/setup
compile 'com.google.android.gms:play-services-base:11.4.+' implementation 'com.google.android.gms:play-services-base:11.4.+'
// https://firebase.google.com/docs/android/setup // https://firebase.google.com/docs/android/setup
compile 'com.google.firebase:firebase-core:11.4.+' implementation 'com.google.firebase:firebase-core:11.4.+'
compile 'com.google.firebase:firebase-ads:11.4.+' implementation 'com.google.firebase:firebase-ads:11.4.+'
// https://mvnrepository.com/artifact/com.squareup.picasso/picasso // https://mvnrepository.com/artifact/com.squareup.picasso/picasso
compile 'com.squareup.picasso:picasso:2.5.+' implementation 'com.squareup.picasso:picasso:2.5.+'
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.faircode.netguard">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.faircode.netguard">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

View File

@ -11,6 +11,7 @@
<uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous --> <!-- http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous -->
<permission <permission

View File

@ -56,7 +56,7 @@ int check_dhcp(const struct arguments *args, const struct udp_session *u,
struct dhcp_packet *response = calloc(500, 1); struct dhcp_packet *response = calloc(500, 1);
// Hack // Hack
inet_pton(AF_INET, "10.1.10.1", &u->saddr); inet_pton(AF_INET, "10.1.10.1", (void *) &u->saddr);
/* /*
Discover: Discover:

View File

@ -35,16 +35,14 @@ int32_t get_qname(const uint8_t *data, const size_t datalen, uint16_t off, char
c = 1; c = 1;
off += 2; off += 2;
} }
} } else if (ptr + 1 + len <= datalen && noff + len <= DNS_QNAME_MAX) {
else if (ptr + 1 + len <= datalen && noff + len <= DNS_QNAME_MAX) {
memcpy(qname + noff, data + ptr + 1, len); memcpy(qname + noff, data + ptr + 1, len);
*(qname + noff + len) = '.'; *(qname + noff + len) = '.';
noff += (len + 1); noff += (len + 1);
ptr += (len + 1); ptr += (len + 1);
len = *(data + ptr); len = *(data + ptr);
} } else
else
break; break;
} }
ptr++; ptr++;
@ -98,8 +96,7 @@ void parse_dns_response(const struct arguments *args, const struct udp_session *
q, qtype, qclass, qname); q, qtype, qclass, qname);
} }
off += 4; off += 4;
} } else {
else {
log_android(ANDROID_LOG_WARN, log_android(ANDROID_LOG_WARN,
"DNS response Q invalid off %d datalen %d", off, *datalen); "DNS response Q invalid off %d datalen %d", off, *datalen);
return; return;
@ -131,22 +128,19 @@ void parse_dns_response(const struct arguments *args, const struct udp_session *
"DNS answer %d qname %s qtype %d ttl %d data %s", "DNS answer %d qname %s qtype %d ttl %d data %s",
a, name, qtype, ttl, rd); a, name, qtype, ttl, rd);
} } else
else
log_android(ANDROID_LOG_DEBUG, log_android(ANDROID_LOG_DEBUG,
"DNS answer %d qname %s qclass %d qtype %d ttl %d length %d", "DNS answer %d qname %s qclass %d qtype %d ttl %d length %d",
a, name, qclass, qtype, ttl, rdlength); a, name, qclass, qtype, ttl, rdlength);
off += rdlength; off += rdlength;
} } else {
else {
log_android(ANDROID_LOG_WARN, log_android(ANDROID_LOG_WARN,
"DNS response A invalid off %d rdlength %d datalen %d", "DNS response A invalid off %d rdlength %d datalen %d",
off, rdlength, *datalen); off, rdlength, *datalen);
return; return;
} }
} } else {
else {
log_android(ANDROID_LOG_WARN, log_android(ANDROID_LOG_WARN,
"DNS response A invalid off %d datalen %d", off, *datalen); "DNS response A invalid off %d datalen %d", off, *datalen);
return; return;
@ -173,8 +167,7 @@ void parse_dns_response(const struct arguments *args, const struct udp_session *
if (u->version == 4) { if (u->version == 4) {
inet_ntop(AF_INET, &u->saddr.ip4, source, sizeof(source)); inet_ntop(AF_INET, &u->saddr.ip4, source, sizeof(source));
inet_ntop(AF_INET, &u->daddr.ip4, dest, sizeof(dest)); inet_ntop(AF_INET, &u->daddr.ip4, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &u->saddr.ip6, source, sizeof(source)); inet_ntop(AF_INET6, &u->saddr.ip6, source, sizeof(source));
inet_ntop(AF_INET6, &u->daddr.ip6, dest, sizeof(dest)); inet_ntop(AF_INET6, &u->daddr.ip6, dest, sizeof(dest));
} }
@ -188,8 +181,7 @@ void parse_dns_response(const struct arguments *args, const struct udp_session *
name, 0, 0); name, 0, 0);
log_packet(args, objPacket); log_packet(args, objPacket);
} }
} } else if (acount > 0)
else if (acount > 0)
log_android(ANDROID_LOG_WARN, log_android(ANDROID_LOG_WARN,
"DNS response qr %d opcode %d qcount %d acount %d", "DNS response qr %d opcode %d qcount %d acount %d",
dns->qr, dns->opcode, qcount, acount); dns->qr, dns->opcode, qcount, acount);
@ -217,8 +209,7 @@ int get_dns_query(const struct arguments *args, const struct udp_session *u,
*qtype = ntohs(*((uint16_t *) (data + off))); *qtype = ntohs(*((uint16_t *) (data + off)));
*qclass = ntohs(*((uint16_t *) (data + off + 2))); *qclass = ntohs(*((uint16_t *) (data + off + 2)));
return 0; return 0;
} } else
else
log_android(ANDROID_LOG_WARN, "DNS query invalid off %d datalen %d", off, datalen); log_android(ANDROID_LOG_WARN, "DNS query invalid off %d datalen %d", off, datalen);
} }

View File

@ -42,8 +42,7 @@ int check_icmp_session(const struct arguments *args, struct ng_session *s,
if (s->icmp.version == 4) { if (s->icmp.version == 4) {
inet_ntop(AF_INET, &s->icmp.saddr.ip4, source, sizeof(source)); inet_ntop(AF_INET, &s->icmp.saddr.ip4, source, sizeof(source));
inet_ntop(AF_INET, &s->icmp.daddr.ip4, dest, sizeof(dest)); inet_ntop(AF_INET, &s->icmp.daddr.ip4, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &s->icmp.saddr.ip6, source, sizeof(source)); inet_ntop(AF_INET6, &s->icmp.saddr.ip6, source, sizeof(source));
inet_ntop(AF_INET6, &s->icmp.daddr.ip6, dest, sizeof(dest)); inet_ntop(AF_INET6, &s->icmp.daddr.ip6, dest, sizeof(dest));
} }
@ -79,8 +78,7 @@ void check_icmp_socket(const struct arguments *args, const struct epoll_event *e
serr, strerror(serr)); serr, strerror(serr));
s->icmp.stop = 1; s->icmp.stop = 1;
} } else {
else {
// Check socket read // Check socket read
if (ev->events & EPOLLIN) { if (ev->events & EPOLLIN) {
s->icmp.time = time(NULL); s->icmp.time = time(NULL);
@ -95,13 +93,11 @@ void check_icmp_socket(const struct arguments *args, const struct epoll_event *e
if (errno != EINTR && errno != EAGAIN) if (errno != EINTR && errno != EAGAIN)
s->icmp.stop = 1; s->icmp.stop = 1;
} } else if (bytes == 0) {
else if (bytes == 0) {
log_android(ANDROID_LOG_WARN, "ICMP recv eof"); log_android(ANDROID_LOG_WARN, "ICMP recv eof");
s->icmp.stop = 1; s->icmp.stop = 1;
} } else {
else {
// Socket read data // Socket read data
char dest[INET6_ADDRSTRLEN + 1]; char dest[INET6_ADDRSTRLEN + 1];
if (s->icmp.version == 4) if (s->icmp.version == 4)
@ -163,8 +159,7 @@ jboolean handle_icmp(const struct arguments *args,
if (version == 4) { if (version == 4) {
inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source)); inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source));
inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest)); inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source)); inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source));
inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest)); inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest));
} }
@ -201,8 +196,7 @@ jboolean handle_icmp(const struct arguments *args,
if (version == 4) { if (version == 4) {
s->icmp.saddr.ip4 = (__be32) ip4->saddr; s->icmp.saddr.ip4 = (__be32) ip4->saddr;
s->icmp.daddr.ip4 = (__be32) ip4->daddr; s->icmp.daddr.ip4 = (__be32) ip4->daddr;
} } else {
else {
memcpy(&s->icmp.saddr.ip6, &ip6->ip6_src, 16); memcpy(&s->icmp.saddr.ip6, &ip6->ip6_src, 16);
memcpy(&s->icmp.daddr.ip6, &ip6->ip6_dst, 16); memcpy(&s->icmp.daddr.ip6, &ip6->ip6_dst, 16);
} }
@ -264,8 +258,7 @@ jboolean handle_icmp(const struct arguments *args,
server4.sin_family = AF_INET; server4.sin_family = AF_INET;
server4.sin_addr.s_addr = (__be32) ip4->daddr; server4.sin_addr.s_addr = (__be32) ip4->daddr;
server4.sin_port = 0; server4.sin_port = 0;
} } else {
else {
server6.sin6_family = AF_INET6; server6.sin6_family = AF_INET6;
memcpy(&server6.sin6_addr, &ip6->ip6_dst, 16); memcpy(&server6.sin6_addr, &ip6->ip6_dst, 16);
server6.sin6_port = 0; server6.sin6_port = 0;
@ -273,7 +266,8 @@ jboolean handle_icmp(const struct arguments *args,
// Send raw ICMP message // Send raw ICMP message
if (sendto(cur->socket, icmp, (socklen_t) icmplen, MSG_NOSIGNAL, if (sendto(cur->socket, icmp, (socklen_t) icmplen, MSG_NOSIGNAL,
(const struct sockaddr *) (version == 4 ? &server4 : &server6), (version == 4 ? (const struct sockaddr *) &server4
: (const struct sockaddr *) &server6),
(socklen_t) (version == 4 ? sizeof(server4) : sizeof(server6))) != icmplen) { (socklen_t) (version == 4 ? sizeof(server4) : sizeof(server6))) != icmplen) {
log_android(ANDROID_LOG_ERROR, "ICMP sendto error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_ERROR, "ICMP sendto error %d: %s", errno, strerror(errno));
if (errno != EINTR && errno != EAGAIN) { if (errno != EINTR && errno != EAGAIN) {
@ -330,8 +324,7 @@ ssize_t write_icmp(const struct arguments *args, const struct icmp_session *cur,
// Calculate IP4 checksum // Calculate IP4 checksum
ip4->check = ~calc_checksum(0, (uint8_t *) ip4, sizeof(struct iphdr)); ip4->check = ~calc_checksum(0, (uint8_t *) ip4, sizeof(struct iphdr));
} } else {
else {
len = sizeof(struct ip6_hdr) + datalen; len = sizeof(struct ip6_hdr) + datalen;
buffer = malloc(len); buffer = malloc(len);
struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer; struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer;
@ -350,9 +343,11 @@ ssize_t write_icmp(const struct arguments *args, const struct icmp_session *cur,
} }
inet_ntop(cur->version == 4 ? AF_INET : AF_INET6, inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
cur->version == 4 ? &cur->saddr.ip4 : &cur->saddr.ip6, source, sizeof(source)); cur->version == 4 ? (const void *) &cur->saddr.ip4 : (const void *) &cur->saddr.ip6,
source, sizeof(source));
inet_ntop(cur->version == 4 ? AF_INET : AF_INET6, inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
cur->version == 4 ? &cur->daddr.ip4 : &cur->daddr.ip6, dest, sizeof(dest)); cur->version == 4 ? (const void *) &cur->daddr.ip4 : (const void *) &cur->daddr.ip6,
dest, sizeof(dest));
// Send raw ICMP message // Send raw ICMP message
log_android(ANDROID_LOG_WARN, log_android(ANDROID_LOG_WARN,
@ -366,8 +361,7 @@ ssize_t write_icmp(const struct arguments *args, const struct icmp_session *cur,
if (res >= 0) { if (res >= 0) {
if (pcap_file != NULL) if (pcap_file != NULL)
write_pcap_rec(buffer, (size_t) res); write_pcap_rec(buffer, (size_t) res);
} } else
else
log_android(ANDROID_LOG_WARN, "ICMP write error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_WARN, "ICMP write error %d: %s", errno, strerror(errno));
free(buffer); free(buffer);

View File

@ -46,8 +46,7 @@ int check_tun(const struct arguments *args,
args->tun, errno, strerror(errno)); args->tun, errno, strerror(errno));
report_exit(args, "fcntl tun %d F_GETFL error %d: %s", report_exit(args, "fcntl tun %d F_GETFL error %d: %s",
args->tun, errno, strerror(errno)); args->tun, errno, strerror(errno));
} } else
else
report_exit(args, "tun %d exception", args->tun); report_exit(args, "tun %d exception", args->tun);
return -1; return -1;
} }
@ -69,8 +68,7 @@ int check_tun(const struct arguments *args,
args->tun, errno, strerror(errno)); args->tun, errno, strerror(errno));
return -1; return -1;
} }
} } else if (length > 0) {
else if (length > 0) {
// Write pcap record // Write pcap record
if (pcap_file != NULL) if (pcap_file != NULL)
write_pcap_rec(buffer, (size_t) length); write_pcap_rec(buffer, (size_t) length);
@ -84,8 +82,7 @@ int check_tun(const struct arguments *args,
handle_ip(args, buffer, (size_t) length, epoll_fd, sessions, maxsessions); handle_ip(args, buffer, (size_t) length, epoll_fd, sessions, maxsessions);
free(buffer); free(buffer);
} } else {
else {
// tun eof // tun eof
free(buffer); free(buffer);
@ -167,8 +164,7 @@ void handle_ip(const struct arguments *args,
return; return;
} }
} }
} } else if (version == 6) {
else if (version == 6) {
if (length < sizeof(struct ip6_hdr)) { if (length < sizeof(struct ip6_hdr)) {
log_android(ANDROID_LOG_WARN, "IP6 packet too short length %d", length); log_android(ANDROID_LOG_WARN, "IP6 packet too short length %d", length);
return; return;
@ -203,8 +199,7 @@ void handle_ip(const struct arguments *args,
payload = (uint8_t *) (pkt + sizeof(struct ip6_hdr) + off); payload = (uint8_t *) (pkt + sizeof(struct ip6_hdr) + off);
// TODO checksum // TODO checksum
} } else {
else {
log_android(ANDROID_LOG_ERROR, "Unknown version %d", version); log_android(ANDROID_LOG_ERROR, "Unknown version %d", version);
return; return;
} }
@ -228,8 +223,7 @@ void handle_ip(const struct arguments *args,
sport = ntohs(icmp->icmp_id); sport = ntohs(icmp->icmp_id);
dport = ntohs(icmp->icmp_id); dport = ntohs(icmp->icmp_id);
} } else if (protocol == IPPROTO_UDP) {
else if (protocol == IPPROTO_UDP) {
if (length - (payload - pkt) < sizeof(struct udphdr)) { if (length - (payload - pkt) < sizeof(struct udphdr)) {
log_android(ANDROID_LOG_WARN, "UDP packet too short"); log_android(ANDROID_LOG_WARN, "UDP packet too short");
return; return;
@ -241,8 +235,7 @@ void handle_ip(const struct arguments *args,
dport = ntohs(udp->dest); dport = ntohs(udp->dest);
// TODO checksum (IPv6) // TODO checksum (IPv6)
} } else if (protocol == IPPROTO_TCP) {
else if (protocol == IPPROTO_TCP) {
if (length - (payload - pkt) < sizeof(struct tcphdr)) { if (length - (payload - pkt) < sizeof(struct tcphdr)) {
log_android(ANDROID_LOG_WARN, "TCP packet too short"); log_android(ANDROID_LOG_WARN, "TCP packet too short");
return; return;
@ -267,8 +260,7 @@ void handle_ip(const struct arguments *args,
flags[flen++] = 'R'; flags[flen++] = 'R';
// TODO checksum // TODO checksum
} } else if (protocol != IPPROTO_HOPOPTS && protocol != IPPROTO_IGMP && protocol != IPPROTO_ESP)
else if (protocol != IPPROTO_HOPOPTS && protocol != IPPROTO_IGMP && protocol != IPPROTO_ESP)
log_android(ANDROID_LOG_WARN, "Unknown protocol %d", protocol); log_android(ANDROID_LOG_WARN, "Unknown protocol %d", protocol);
flags[flen] = 0; flags[flen] = 0;
@ -320,8 +312,7 @@ void handle_ip(const struct arguments *args,
handle_udp(args, pkt, length, payload, uid, redirect, epoll_fd); handle_udp(args, pkt, length, payload, uid, redirect, epoll_fd);
else if (protocol == IPPROTO_TCP) else if (protocol == IPPROTO_TCP)
handle_tcp(args, pkt, length, payload, uid, allowed, redirect, epoll_fd); handle_tcp(args, pkt, length, payload, uid, allowed, redirect, epoll_fd);
} } else {
else {
if (protocol == IPPROTO_UDP) if (protocol == IPPROTO_UDP)
block_udp(args, pkt, length, payload, uid); block_udp(args, pkt, length, payload, uid);
if (protocol == IPPROTO_TCP) if (protocol == IPPROTO_TCP)
@ -442,8 +433,7 @@ jint get_uid_sub(const int version, const int protocol,
break; break;
} }
} }
} } else
else
log_android(ANDROID_LOG_ERROR, "Invalid field #%d: %s", fields, line); log_android(ANDROID_LOG_ERROR, "Invalid field #%d: %s", fields, line);
} }
} }

View File

@ -242,7 +242,7 @@ Java_eu_faircode_netguard_ServiceSinkhole_jni_1get_1stats(JNIEnv *env, jobject i
getrlimit(RLIMIT_NOFILE, &rlim); getrlimit(RLIMIT_NOFILE, &rlim);
jcount[4] = (jint) rlim.rlim_cur; jcount[4] = (jint) rlim.rlim_cur;
(*env)->ReleaseIntArrayElements(env, jarray, jcount, NULL); (*env)->ReleaseIntArrayElements(env, jarray, jcount, 0);
return jarray; return jarray;
} }
@ -418,7 +418,7 @@ void report_error(const struct arguments *args, jint error, const char *fmt, ...
static jmethodID midProtect = NULL; static jmethodID midProtect = NULL;
int protect_socket(const struct arguments *args, int socket) { int protect_socket(const struct arguments *args, int socket) {
if (args->sdk >= 21) if (args->sdk >= 23)
return 0; return 0;
jclass cls = (*args->env)->GetObjectClass(args->env, args->instance); jclass cls = (*args->env)->GetObjectClass(args->env, args->instance);

View File

@ -20,6 +20,8 @@
#include <netdb.h> #include <netdb.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/in6.h>
#include <netinet/ip.h> #include <netinet/ip.h>
#include <netinet/ip6.h> #include <netinet/ip6.h>
#include <netinet/udp.h> #include <netinet/udp.h>
@ -212,14 +214,14 @@ typedef struct pcap_hdr_s {
guint32_t sigfigs; guint32_t sigfigs;
guint32_t snaplen; guint32_t snaplen;
guint32_t network; guint32_t network;
} __packed; } __packed pcap_hdr_s;
typedef struct pcaprec_hdr_s { typedef struct pcaprec_hdr_s {
guint32_t ts_sec; guint32_t ts_sec;
guint32_t ts_usec; guint32_t ts_usec;
guint32_t incl_len; guint32_t incl_len;
guint32_t orig_len; guint32_t orig_len;
} __packed; } __packed pcaprec_hdr_s;
#define LINKTYPE_RAW 101 #define LINKTYPE_RAW 101
@ -271,7 +273,7 @@ typedef struct dns_rr {
__be16 qclass; __be16 qclass;
__be32 ttl; __be32 ttl;
__be16 rdlength; __be16 rdlength;
} __packed; } __packed dns_rr;
// DHCP // DHCP
@ -293,12 +295,12 @@ typedef struct dhcp_packet {
uint8_t sname[64]; uint8_t sname[64];
uint8_t file[128]; uint8_t file[128];
uint32_t option_format; uint32_t option_format;
} __packed; } __packed dhcp_packet;
typedef struct dhcp_option { typedef struct dhcp_option {
uint8_t code; uint8_t code;
uint8_t length; uint8_t length;
} __packed; } __packed dhcp_option;
// Prototypes // Prototypes

View File

@ -49,6 +49,7 @@ sighandler_t old_handler;
sigjmp_buf jump; sigjmp_buf jump;
void handle_sigabrt(int sig) { void handle_sigabrt(int sig) {
log_android(ANDROID_LOG_ERROR, "sigabrt");
old_handler(sig); old_handler(sig);
siglongjmp(jump, 1); siglongjmp(jump, 1);
} }

View File

@ -61,8 +61,7 @@ int check_tcp_session(const struct arguments *args, struct ng_session *s,
if (s->tcp.version == 4) { if (s->tcp.version == 4) {
inet_ntop(AF_INET, &s->tcp.saddr.ip4, source, sizeof(source)); inet_ntop(AF_INET, &s->tcp.saddr.ip4, source, sizeof(source));
inet_ntop(AF_INET, &s->tcp.daddr.ip4, dest, sizeof(dest)); inet_ntop(AF_INET, &s->tcp.daddr.ip4, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &s->tcp.saddr.ip6, source, sizeof(source)); inet_ntop(AF_INET6, &s->tcp.saddr.ip6, source, sizeof(source));
inet_ntop(AF_INET6, &s->tcp.daddr.ip6, dest, sizeof(dest)); inet_ntop(AF_INET6, &s->tcp.daddr.ip6, dest, sizeof(dest));
} }
@ -126,8 +125,7 @@ int monitor_tcp_session(const struct arguments *args, struct ng_session *s, int
events = events | EPOLLOUT; events = events | EPOLLOUT;
else else
events = events | EPOLLIN; events = events | EPOLLIN;
} } else if (s->tcp.state == TCP_ESTABLISHED || s->tcp.state == TCP_CLOSE_WAIT) {
else if (s->tcp.state == TCP_ESTABLISHED || s->tcp.state == TCP_CLOSE_WAIT) {
// Check for incoming data // Check for incoming data
if (get_send_window(&s->tcp) > 0) if (get_send_window(&s->tcp) > 0)
@ -161,8 +159,7 @@ int monitor_tcp_session(const struct arguments *args, struct ng_session *s, int
if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, s->socket, &s->ev)) { if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, s->socket, &s->ev)) {
s->tcp.state = TCP_CLOSING; s->tcp.state = TCP_CLOSING;
log_android(ANDROID_LOG_ERROR, "epoll mod tcp error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_ERROR, "epoll mod tcp error %d: %s", errno, strerror(errno));
} } else
else
log_android(ANDROID_LOG_DEBUG, "epoll mod tcp socket %d in %d out %d", log_android(ANDROID_LOG_DEBUG, "epoll mod tcp socket %d in %d out %d",
s->socket, (events & EPOLLIN) != 0, (events & EPOLLOUT) != 0); s->socket, (events & EPOLLIN) != 0, (events & EPOLLOUT) != 0);
} }
@ -235,8 +232,7 @@ void check_tcp_socket(const struct arguments *args,
if (s->tcp.version == 4) { if (s->tcp.version == 4) {
inet_ntop(AF_INET, &s->tcp.saddr.ip4, source, sizeof(source)); inet_ntop(AF_INET, &s->tcp.saddr.ip4, source, sizeof(source));
inet_ntop(AF_INET, &s->tcp.daddr.ip4, dest, sizeof(dest)); inet_ntop(AF_INET, &s->tcp.daddr.ip4, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &s->tcp.saddr.ip6, source, sizeof(source)); inet_ntop(AF_INET6, &s->tcp.saddr.ip6, source, sizeof(source));
inet_ntop(AF_INET6, &s->tcp.daddr.ip6, dest, sizeof(dest)); inet_ntop(AF_INET6, &s->tcp.daddr.ip6, dest, sizeof(dest));
} }
@ -274,7 +270,7 @@ void check_tcp_socket(const struct arguments *args,
else else
icmp.icmp_code = ICMP_UNREACH_HOST; icmp.icmp_code = ICMP_UNREACH_HOST;
icmp.icmp_cksum = 0; icmp.icmp_cksum = 0;
icmp.icmp_cksum = ~calc_checksum(0, &icmp, 4); icmp.icmp_cksum = ~calc_checksum(0, (const uint8_t *) &icmp, 4);
struct icmp_session sicmp; struct icmp_session sicmp;
memset(&sicmp, 0, sizeof(struct icmp_session)); memset(&sicmp, 0, sizeof(struct icmp_session));
@ -282,16 +278,14 @@ void check_tcp_socket(const struct arguments *args,
if (s->tcp.version == 4) { if (s->tcp.version == 4) {
sicmp.saddr.ip4 = (__be32) s->tcp.saddr.ip4; sicmp.saddr.ip4 = (__be32) s->tcp.saddr.ip4;
sicmp.daddr.ip4 = (__be32) s->tcp.daddr.ip4; sicmp.daddr.ip4 = (__be32) s->tcp.daddr.ip4;
} } else {
else {
memcpy(&sicmp.saddr.ip6, &s->tcp.saddr.ip6, 16); memcpy(&sicmp.saddr.ip6, &s->tcp.saddr.ip6, 16);
memcpy(&sicmp.daddr.ip6, &s->tcp.daddr.ip6, 16); memcpy(&sicmp.daddr.ip6, &s->tcp.daddr.ip6, 16);
} }
write_icmp(args, &sicmp, &icmp, 8); write_icmp(args, &sicmp, (uint8_t *) &icmp, 8);
} }
} } else {
else {
// Assume socket okay // Assume socket okay
if (s->tcp.state == TCP_LISTEN) { if (s->tcp.state == TCP_LISTEN) {
// Check socket connect // Check socket connect
@ -307,8 +301,7 @@ void check_tcp_socket(const struct arguments *args,
else else
s->tcp.socks5 = SOCKS5_CONNECTED; s->tcp.socks5 = SOCKS5_CONNECTED;
} }
} } else {
else {
if (ev->events & EPOLLIN) { if (ev->events & EPOLLIN) {
uint8_t buffer[32]; uint8_t buffer[32];
ssize_t bytes = recv(s->socket, buffer, sizeof(buffer), 0); ssize_t bytes = recv(s->socket, buffer, sizeof(buffer), 0);
@ -316,8 +309,7 @@ void check_tcp_socket(const struct arguments *args,
log_android(ANDROID_LOG_ERROR, "%s recv SOCKS5 error %d: %s", log_android(ANDROID_LOG_ERROR, "%s recv SOCKS5 error %d: %s",
session, errno, strerror(errno)); session, errno, strerror(errno));
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} } else {
else {
char *h = hex(buffer, (const size_t) bytes); char *h = hex(buffer, (const size_t) bytes);
log_android(ANDROID_LOG_INFO, "%s recv SOCKS5 %s", session, h); log_android(ANDROID_LOG_INFO, "%s recv SOCKS5 %s", session, h);
free(h); free(h);
@ -335,30 +327,26 @@ void check_tcp_socket(const struct arguments *args,
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} }
} } else if (s->tcp.socks5 == SOCKS5_AUTH &&
else if (s->tcp.socks5 == SOCKS5_AUTH && bytes == 2 &&
bytes == 2 && (buffer[0] == 1 || buffer[0] == 5)) {
(buffer[0] == 1 || buffer[0] == 5)) {
if (buffer[1] == 0) { if (buffer[1] == 0) {
s->tcp.socks5 = SOCKS5_CONNECT; s->tcp.socks5 = SOCKS5_CONNECT;
log_android(ANDROID_LOG_WARN, "%s SOCKS5 auth OK", session); log_android(ANDROID_LOG_WARN, "%s SOCKS5 auth OK", session);
} } else {
else {
s->tcp.socks5 = 0; s->tcp.socks5 = 0;
log_android(ANDROID_LOG_ERROR, "%s SOCKS5 auth error %d", log_android(ANDROID_LOG_ERROR, "%s SOCKS5 auth error %d",
session, buffer[1]); session, buffer[1]);
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} }
} } else if (s->tcp.socks5 == SOCKS5_CONNECT &&
else if (s->tcp.socks5 == SOCKS5_CONNECT && bytes == 6 + (s->tcp.version == 4 ? 4 : 16) &&
bytes == 6 + (s->tcp.version == 4 ? 4 : 16) && buffer[0] == 5) {
buffer[0] == 5) {
if (buffer[1] == 0) { if (buffer[1] == 0) {
s->tcp.socks5 = SOCKS5_CONNECTED; s->tcp.socks5 = SOCKS5_CONNECTED;
log_android(ANDROID_LOG_WARN, "%s SOCKS5 connected", session); log_android(ANDROID_LOG_WARN, "%s SOCKS5 connected", session);
} } else {
else {
s->tcp.socks5 = 0; s->tcp.socks5 = 0;
log_android(ANDROID_LOG_ERROR, "%s SOCKS5 connect error %d", log_android(ANDROID_LOG_ERROR, "%s SOCKS5 connect error %d",
session, buffer[1]); session, buffer[1]);
@ -376,8 +364,7 @@ void check_tcp_socket(const struct arguments *args,
*/ */
} }
} } else {
else {
s->tcp.socks5 = 0; s->tcp.socks5 = 0;
log_android(ANDROID_LOG_ERROR, "%s recv SOCKS5 state %d", log_android(ANDROID_LOG_ERROR, "%s recv SOCKS5 state %d",
session, s->tcp.socks5); session, s->tcp.socks5);
@ -400,8 +387,7 @@ void check_tcp_socket(const struct arguments *args,
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} }
} } else if (s->tcp.socks5 == SOCKS5_AUTH) {
else if (s->tcp.socks5 == SOCKS5_AUTH) {
uint8_t ulen = strlen(socks5_username); uint8_t ulen = strlen(socks5_username);
uint8_t plen = strlen(socks5_password); uint8_t plen = strlen(socks5_password);
uint8_t buffer[512]; uint8_t buffer[512];
@ -425,8 +411,7 @@ void check_tcp_socket(const struct arguments *args,
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} }
} } else if (s->tcp.socks5 == SOCKS5_CONNECT) {
else if (s->tcp.socks5 == SOCKS5_CONNECT) {
uint8_t buffer[22]; uint8_t buffer[22];
*(buffer + 0) = 5; // version *(buffer + 0) = 5; // version
*(buffer + 1) = 1; // TCP/IP stream connection *(buffer + 1) = 1; // TCP/IP stream connection
@ -435,8 +420,7 @@ void check_tcp_socket(const struct arguments *args,
if (s->tcp.version == 4) { if (s->tcp.version == 4) {
memcpy(buffer + 4, &s->tcp.daddr.ip4, 4); memcpy(buffer + 4, &s->tcp.daddr.ip4, 4);
*((__be16 *) (buffer + 4 + 4)) = s->tcp.dest; *((__be16 *) (buffer + 4 + 4)) = s->tcp.dest;
} } else {
else {
memcpy(buffer + 4, &s->tcp.daddr.ip6, 16); memcpy(buffer + 4, &s->tcp.daddr.ip6, 16);
*((__be16 *) (buffer + 4 + 16)) = s->tcp.dest; *((__be16 *) (buffer + 4 + 16)) = s->tcp.dest;
} }
@ -455,8 +439,7 @@ void check_tcp_socket(const struct arguments *args,
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} }
} } else if (s->tcp.socks5 == SOCKS5_CONNECTED) {
else if (s->tcp.socks5 == SOCKS5_CONNECTED) {
s->tcp.remote_seq++; // remote SYN s->tcp.remote_seq++; // remote SYN
if (write_syn_ack(args, &s->tcp) >= 0) { if (write_syn_ack(args, &s->tcp) >= 0) {
s->tcp.time = time(NULL); s->tcp.time = time(NULL);
@ -464,8 +447,7 @@ void check_tcp_socket(const struct arguments *args,
s->tcp.state = TCP_SYN_RECV; s->tcp.state = TCP_SYN_RECV;
} }
} }
} } else {
else {
// Always forward data // Always forward data
int fwd = 0; int fwd = 0;
@ -493,13 +475,11 @@ void check_tcp_socket(const struct arguments *args,
if (errno == EINTR || errno == EAGAIN) { if (errno == EINTR || errno == EAGAIN) {
// Retry later // Retry later
break; break;
} } else {
else {
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
break; break;
} }
} } else {
else {
fwd = 1; fwd = 1;
buffer_size -= sent; buffer_size -= sent;
s->tcp.sent += sent; s->tcp.sent += sent;
@ -511,8 +491,7 @@ void check_tcp_socket(const struct arguments *args,
s->tcp.forward = s->tcp.forward->next; s->tcp.forward = s->tcp.forward->next;
free(p->data); free(p->data);
free(p); free(p);
} } else {
else {
log_android(ANDROID_LOG_WARN, log_android(ANDROID_LOG_WARN,
"%s partial send %u/%u", "%s partial send %u/%u",
session, s->tcp.forward->sent, s->tcp.forward->len); session, s->tcp.forward->sent, s->tcp.forward->len);
@ -570,8 +549,7 @@ void check_tcp_socket(const struct arguments *args,
if (errno != EINTR && errno != EAGAIN) if (errno != EINTR && errno != EAGAIN)
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} } else if (bytes == 0) {
else if (bytes == 0) {
log_android(ANDROID_LOG_WARN, "%s recv eof", session); log_android(ANDROID_LOG_WARN, "%s recv eof", session);
if (s->tcp.forward == NULL) { if (s->tcp.forward == NULL) {
@ -586,8 +564,7 @@ void check_tcp_socket(const struct arguments *args,
s->tcp.state = TCP_LAST_ACK; s->tcp.state = TCP_LAST_ACK;
else else
log_android(ANDROID_LOG_ERROR, "%s invalid close", session); log_android(ANDROID_LOG_ERROR, "%s invalid close", session);
} } else {
else {
// There was still data to send // There was still data to send
log_android(ANDROID_LOG_ERROR, "%s close with queue", session); log_android(ANDROID_LOG_ERROR, "%s close with queue", session);
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
@ -598,8 +575,7 @@ void check_tcp_socket(const struct arguments *args,
session, errno, strerror(errno)); session, errno, strerror(errno));
s->socket = -1; s->socket = -1;
} } else {
else {
// Socket read data // Socket read data
log_android(ANDROID_LOG_DEBUG, "%s recv bytes %d", session, bytes); log_android(ANDROID_LOG_DEBUG, "%s recv bytes %d", session, bytes);
s->tcp.received += bytes; s->tcp.received += bytes;
@ -652,8 +628,7 @@ jboolean handle_tcp(const struct arguments *args,
if (version == 4) { if (version == 4) {
inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source)); inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source));
inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest)); inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source)); inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source));
inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest)); inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest));
} }
@ -697,7 +672,7 @@ jboolean handle_tcp(const struct arguments *args,
uint16_t mss = get_default_mss(version); uint16_t mss = get_default_mss(version);
uint8_t ws = 0; uint8_t ws = 0;
int optlen = tcpoptlen; int optlen = tcpoptlen;
uint8_t *options = tcpoptions; uint8_t *options = (uint8_t *) tcpoptions;
while (optlen > 0) { while (optlen > 0) {
uint8_t kind = *options; uint8_t kind = *options;
uint8_t len = *(options + 1); uint8_t len = *(options + 1);
@ -713,8 +688,7 @@ jboolean handle_tcp(const struct arguments *args,
if (kind == 1) { if (kind == 1) {
optlen--; optlen--;
options++; options++;
} } else {
else {
optlen -= len; optlen -= len;
options += len; options += len;
} }
@ -746,8 +720,7 @@ jboolean handle_tcp(const struct arguments *args,
if (version == 4) { if (version == 4) {
s->tcp.saddr.ip4 = (__be32) ip4->saddr; s->tcp.saddr.ip4 = (__be32) ip4->saddr;
s->tcp.daddr.ip4 = (__be32) ip4->daddr; s->tcp.daddr.ip4 = (__be32) ip4->daddr;
} } else {
else {
memcpy(&s->tcp.saddr.ip6, &ip6->ip6_src, 16); memcpy(&s->tcp.saddr.ip6, &ip6->ip6_src, 16);
memcpy(&s->tcp.daddr.ip6, &ip6->ip6_dst, 16); memcpy(&s->tcp.daddr.ip6, &ip6->ip6_dst, 16);
} }
@ -799,8 +772,7 @@ jboolean handle_tcp(const struct arguments *args,
log_android(ANDROID_LOG_WARN, "%s resetting blocked session", packet); log_android(ANDROID_LOG_WARN, "%s resetting blocked session", packet);
write_rst(args, &s->tcp); write_rst(args, &s->tcp);
} }
} } else {
else {
log_android(ANDROID_LOG_WARN, "%s unknown session", packet); log_android(ANDROID_LOG_WARN, "%s unknown session", packet);
struct tcp_session rst; struct tcp_session rst;
@ -812,8 +784,7 @@ jboolean handle_tcp(const struct arguments *args,
if (version == 4) { if (version == 4) {
rst.saddr.ip4 = (__be32) ip4->saddr; rst.saddr.ip4 = (__be32) ip4->saddr;
rst.daddr.ip4 = (__be32) ip4->daddr; rst.daddr.ip4 = (__be32) ip4->daddr;
} } else {
else {
memcpy(&rst.saddr.ip6, &ip6->ip6_src, 16); memcpy(&rst.saddr.ip6, &ip6->ip6_src, 16);
memcpy(&rst.daddr.ip6, &ip6->ip6_dst, 16); memcpy(&rst.daddr.ip6, &ip6->ip6_dst, 16);
} }
@ -824,8 +795,7 @@ jboolean handle_tcp(const struct arguments *args,
write_rst(args, &rst); write_rst(args, &rst);
return 0; return 0;
} }
} } else {
else {
char session[250]; char session[250];
sprintf(session, sprintf(session,
"%s %s loc %u rem %u acked %u", "%s %s loc %u rem %u acked %u",
@ -840,8 +810,7 @@ jboolean handle_tcp(const struct arguments *args,
log_android(ANDROID_LOG_WARN, "%s was closed", session); log_android(ANDROID_LOG_WARN, "%s was closed", session);
write_rst(args, &cur->tcp); write_rst(args, &cur->tcp);
return 0; return 0;
} } else {
else {
int oldstate = cur->tcp.state; int oldstate = cur->tcp.state;
uint32_t oldlocal = cur->tcp.local_seq; uint32_t oldlocal = cur->tcp.local_seq;
uint32_t oldremote = cur->tcp.remote_seq; uint32_t oldremote = cur->tcp.remote_seq;
@ -874,45 +843,35 @@ jboolean handle_tcp(const struct arguments *args,
log_android(ANDROID_LOG_WARN, "%s received reset", session); log_android(ANDROID_LOG_WARN, "%s received reset", session);
cur->tcp.state = TCP_CLOSING; cur->tcp.state = TCP_CLOSING;
return 0; return 0;
} } else {
else {
if (!tcphdr->ack || ntohl(tcphdr->ack_seq) == cur->tcp.local_seq) { if (!tcphdr->ack || ntohl(tcphdr->ack_seq) == cur->tcp.local_seq) {
if (tcphdr->syn) { if (tcphdr->syn) {
log_android(ANDROID_LOG_WARN, "%s repeated SYN", session); log_android(ANDROID_LOG_WARN, "%s repeated SYN", session);
// The socket is probably not opened yet // The socket is probably not opened yet
} } else if (tcphdr->fin /* +ACK */) {
else if (tcphdr->fin /* +ACK */) {
if (cur->tcp.state == TCP_ESTABLISHED) { if (cur->tcp.state == TCP_ESTABLISHED) {
log_android(ANDROID_LOG_WARN, "%s FIN received", session); log_android(ANDROID_LOG_WARN, "%s FIN received", session);
if (cur->tcp.forward == NULL) { if (cur->tcp.forward == NULL) {
cur->tcp.remote_seq++; // remote FIN cur->tcp.remote_seq++; // remote FIN
if (write_ack(args, &cur->tcp) >= 0) if (write_ack(args, &cur->tcp) >= 0)
cur->tcp.state = TCP_CLOSE_WAIT; cur->tcp.state = TCP_CLOSE_WAIT;
} } else
else
cur->tcp.state = TCP_CLOSE_WAIT; cur->tcp.state = TCP_CLOSE_WAIT;
} } else if (cur->tcp.state == TCP_CLOSE_WAIT) {
else if (cur->tcp.state == TCP_CLOSE_WAIT) {
log_android(ANDROID_LOG_WARN, "%s repeated FIN", session); log_android(ANDROID_LOG_WARN, "%s repeated FIN", session);
// The socket is probably not closed yet // The socket is probably not closed yet
} } else if (cur->tcp.state == TCP_FIN_WAIT1) {
else if (cur->tcp.state == TCP_FIN_WAIT1) {
log_android(ANDROID_LOG_WARN, "%s last ACK", session); log_android(ANDROID_LOG_WARN, "%s last ACK", session);
cur->tcp.remote_seq++; // remote FIN cur->tcp.remote_seq++; // remote FIN
if (write_ack(args, &cur->tcp) >= 0) if (write_ack(args, &cur->tcp) >= 0)
cur->tcp.state = TCP_CLOSE; cur->tcp.state = TCP_CLOSE;
} } else {
else {
log_android(ANDROID_LOG_ERROR, "%s invalid FIN", session); log_android(ANDROID_LOG_ERROR, "%s invalid FIN", session);
return 0; return 0;
} }
} } else if (tcphdr->ack) {
else if (tcphdr->ack) {
cur->tcp.acked = ntohl(tcphdr->ack_seq); cur->tcp.acked = ntohl(tcphdr->ack_seq);
if (cur->tcp.state == TCP_SYN_RECV) if (cur->tcp.state == TCP_SYN_RECV)
@ -920,31 +879,22 @@ jboolean handle_tcp(const struct arguments *args,
else if (cur->tcp.state == TCP_ESTABLISHED) { else if (cur->tcp.state == TCP_ESTABLISHED) {
// Do nothing // Do nothing
} } else if (cur->tcp.state == TCP_LAST_ACK)
else if (cur->tcp.state == TCP_LAST_ACK)
cur->tcp.state = TCP_CLOSING; cur->tcp.state = TCP_CLOSING;
else if (cur->tcp.state == TCP_CLOSE_WAIT) { else if (cur->tcp.state == TCP_CLOSE_WAIT) {
// ACK after FIN/ACK // ACK after FIN/ACK
} } else if (cur->tcp.state == TCP_FIN_WAIT1) {
else if (cur->tcp.state == TCP_FIN_WAIT1) {
// Do nothing // Do nothing
} } else {
else {
log_android(ANDROID_LOG_ERROR, "%s invalid state", session); log_android(ANDROID_LOG_ERROR, "%s invalid state", session);
return 0; return 0;
} }
} } else {
else {
log_android(ANDROID_LOG_ERROR, "%s unknown packet", session); log_android(ANDROID_LOG_ERROR, "%s unknown packet", session);
return 0; return 0;
} }
} } else {
else {
uint32_t ack = ntohl(tcphdr->ack_seq); uint32_t ack = ntohl(tcphdr->ack_seq);
if ((uint32_t) (ack + 1) == cur->tcp.local_seq) { if ((uint32_t) (ack + 1) == cur->tcp.local_seq) {
// Keep alive // Keep alive
@ -956,12 +906,10 @@ jboolean handle_tcp(const struct arguments *args,
session, errno, strerror(errno)); session, errno, strerror(errno));
else else
log_android(ANDROID_LOG_WARN, "%s enabled keep alive", session); log_android(ANDROID_LOG_WARN, "%s enabled keep alive", session);
} } else
else
log_android(ANDROID_LOG_WARN, "%s keep alive", session); log_android(ANDROID_LOG_WARN, "%s keep alive", session);
} } else if (compare_u32(ack, cur->tcp.local_seq) < 0) {
else if (compare_u32(ack, cur->tcp.local_seq) < 0) {
if (compare_u32(ack, cur->tcp.acked) <= 0) if (compare_u32(ack, cur->tcp.acked) <= 0)
log_android( log_android(
ack == cur->tcp.acked ? ANDROID_LOG_WARN : ANDROID_LOG_ERROR, ack == cur->tcp.acked ? ANDROID_LOG_WARN : ANDROID_LOG_ERROR,
@ -976,8 +924,7 @@ jboolean handle_tcp(const struct arguments *args,
} }
return 1; return 1;
} } else {
else {
log_android(ANDROID_LOG_ERROR, "%s future ACK", session); log_android(ANDROID_LOG_ERROR, "%s future ACK", session);
write_rst(args, &cur->tcp); write_rst(args, &cur->tcp);
return 0; return 0;
@ -1032,8 +979,7 @@ void queue_tcp(const struct arguments *args,
cur->forward = n; cur->forward = n;
else else
p->next = n; p->next = n;
} } else if (s != NULL && s->seq == seq) {
else if (s != NULL && s->seq == seq) {
if (s->len == datalen) if (s->len == datalen)
log_android(ANDROID_LOG_WARN, "%s segment already queued %u..%u", log_android(ANDROID_LOG_WARN, "%s segment already queued %u..%u",
session, session,
@ -1046,8 +992,7 @@ void queue_tcp(const struct arguments *args,
free(s->data); free(s->data);
s->data = malloc(datalen); s->data = malloc(datalen);
memcpy(s->data, data, datalen); memcpy(s->data, data, datalen);
} } else
else
log_android(ANDROID_LOG_ERROR, "%s segment larger %u..%u < %u", log_android(ANDROID_LOG_ERROR, "%s segment larger %u..%u < %u",
session, session,
s->seq - cur->remote_start, s->seq + s->len - cur->remote_start, s->seq - cur->remote_start, s->seq + s->len - cur->remote_start,
@ -1065,8 +1010,7 @@ int open_tcp_socket(const struct arguments *args,
version = (strstr(socks5_addr, ":") == NULL ? 4 : 6); version = (strstr(socks5_addr, ":") == NULL ? 4 : 6);
else else
version = cur->version; version = cur->version;
} } else
else
version = (strstr(redirect->raddr, ":") == NULL ? 4 : 6); version = (strstr(redirect->raddr, ":") == NULL ? 4 : 6);
// Get TCP socket // Get TCP socket
@ -1099,27 +1043,23 @@ int open_tcp_socket(const struct arguments *args,
addr4.sin_family = AF_INET; addr4.sin_family = AF_INET;
inet_pton(AF_INET, socks5_addr, &addr4.sin_addr); inet_pton(AF_INET, socks5_addr, &addr4.sin_addr);
addr4.sin_port = htons(socks5_port); addr4.sin_port = htons(socks5_port);
} } else {
else {
addr6.sin6_family = AF_INET6; addr6.sin6_family = AF_INET6;
inet_pton(AF_INET6, socks5_addr, &addr6.sin6_addr); inet_pton(AF_INET6, socks5_addr, &addr6.sin6_addr);
addr6.sin6_port = htons(socks5_port); addr6.sin6_port = htons(socks5_port);
} }
} } else {
else {
if (version == 4) { if (version == 4) {
addr4.sin_family = AF_INET; addr4.sin_family = AF_INET;
addr4.sin_addr.s_addr = (__be32) cur->daddr.ip4; addr4.sin_addr.s_addr = (__be32) cur->daddr.ip4;
addr4.sin_port = cur->dest; addr4.sin_port = cur->dest;
} } else {
else {
addr6.sin6_family = AF_INET6; addr6.sin6_family = AF_INET6;
memcpy(&addr6.sin6_addr, &cur->daddr.ip6, 16); memcpy(&addr6.sin6_addr, &cur->daddr.ip6, 16);
addr6.sin6_port = cur->dest; addr6.sin6_port = cur->dest;
} }
} }
} } else {
else {
log_android(ANDROID_LOG_WARN, "TCP%d redirect to %s/%u", log_android(ANDROID_LOG_WARN, "TCP%d redirect to %s/%u",
version, redirect->raddr, redirect->rport); version, redirect->raddr, redirect->rport);
@ -1127,8 +1067,7 @@ int open_tcp_socket(const struct arguments *args,
addr4.sin_family = AF_INET; addr4.sin_family = AF_INET;
inet_pton(AF_INET, redirect->raddr, &addr4.sin_addr); inet_pton(AF_INET, redirect->raddr, &addr4.sin_addr);
addr4.sin_port = htons(redirect->rport); addr4.sin_port = htons(redirect->rport);
} } else {
else {
addr6.sin6_family = AF_INET6; addr6.sin6_family = AF_INET6;
inet_pton(AF_INET6, redirect->raddr, &addr6.sin6_addr); inet_pton(AF_INET6, redirect->raddr, &addr6.sin6_addr);
addr6.sin6_port = htons(redirect->rport); addr6.sin6_port = htons(redirect->rport);
@ -1137,7 +1076,8 @@ int open_tcp_socket(const struct arguments *args,
// Initiate connect // Initiate connect
int err = connect(sock, int err = connect(sock,
(const struct sockaddr *) (version == 4 ? &addr4 : &addr6), (version == 4 ? (const struct sockaddr *) &addr4
: (const struct sockaddr *) &addr6),
(socklen_t) (version == 4 (socklen_t) (version == 4
? sizeof(struct sockaddr_in) ? sizeof(struct sockaddr_in)
: sizeof(struct sockaddr_in6))); : sizeof(struct sockaddr_in6)));
@ -1238,8 +1178,7 @@ ssize_t write_tcp(const struct arguments *args, const struct tcp_session *cur,
pseudo.ippseudo_len = htons(sizeof(struct tcphdr) + optlen + datalen); pseudo.ippseudo_len = htons(sizeof(struct tcphdr) + optlen + datalen);
csum = calc_checksum(0, (uint8_t *) &pseudo, sizeof(struct ippseudo)); csum = calc_checksum(0, (uint8_t *) &pseudo, sizeof(struct ippseudo));
} } else {
else {
len = sizeof(struct ip6_hdr) + sizeof(struct tcphdr) + optlen + datalen; len = sizeof(struct ip6_hdr) + sizeof(struct tcphdr) + optlen + datalen;
buffer = malloc(len); buffer = malloc(len);
struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer; struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer;
@ -1305,9 +1244,11 @@ ssize_t write_tcp(const struct arguments *args, const struct tcp_session *cur,
tcp->check = ~csum; tcp->check = ~csum;
inet_ntop(cur->version == 4 ? AF_INET : AF_INET6, inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
cur->version == 4 ? &cur->saddr.ip4 : &cur->saddr.ip6, source, sizeof(source)); cur->version == 4 ? (const void *) &cur->saddr.ip4 : (const void *) &cur->saddr.ip6,
source, sizeof(source));
inet_ntop(cur->version == 4 ? AF_INET : AF_INET6, inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
cur->version == 4 ? &cur->daddr.ip4 : &cur->daddr.ip6, dest, sizeof(dest)); cur->version == 4 ? (const void *) &cur->daddr.ip4 : (const void *) &cur->daddr.ip6,
dest, sizeof(dest));
// Send packet // Send packet
log_android(ANDROID_LOG_DEBUG, log_android(ANDROID_LOG_DEBUG,
@ -1327,8 +1268,7 @@ ssize_t write_tcp(const struct arguments *args, const struct tcp_session *cur,
if (res >= 0) { if (res >= 0) {
if (pcap_file != NULL) if (pcap_file != NULL)
write_pcap_rec(buffer, (size_t) res); write_pcap_rec(buffer, (size_t) res);
} } else
else
log_android(ANDROID_LOG_ERROR, "TCP write%s%s%s%s data %d error %d: %s", log_android(ANDROID_LOG_ERROR, "TCP write%s%s%s%s data %d error %d: %s",
(tcp->syn ? " SYN" : ""), (tcp->syn ? " SYN" : ""),
(tcp->ack ? " ACK" : ""), (tcp->ack ? " ACK" : ""),

View File

@ -40,8 +40,7 @@ int check_udp_session(const struct arguments *args, struct ng_session *s,
if (s->udp.version == 4) { if (s->udp.version == 4) {
inet_ntop(AF_INET, &s->udp.saddr.ip4, source, sizeof(source)); inet_ntop(AF_INET, &s->udp.saddr.ip4, source, sizeof(source));
inet_ntop(AF_INET, &s->udp.daddr.ip4, dest, sizeof(dest)); inet_ntop(AF_INET, &s->udp.daddr.ip4, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &s->udp.saddr.ip6, source, sizeof(source)); inet_ntop(AF_INET6, &s->udp.saddr.ip6, source, sizeof(source));
inet_ntop(AF_INET6, &s->udp.daddr.ip6, dest, sizeof(dest)); inet_ntop(AF_INET6, &s->udp.daddr.ip6, dest, sizeof(dest));
} }
@ -101,8 +100,7 @@ void check_udp_socket(const struct arguments *args, const struct epoll_event *ev
log_android(ANDROID_LOG_ERROR, "UDP SO_ERROR %d: %s", serr, strerror(serr)); log_android(ANDROID_LOG_ERROR, "UDP SO_ERROR %d: %s", serr, strerror(serr));
s->udp.state = UDP_FINISHING; s->udp.state = UDP_FINISHING;
} } else {
else {
// Check socket read // Check socket read
if (ev->events & EPOLLIN) { if (ev->events & EPOLLIN) {
s->udp.time = time(NULL); s->udp.time = time(NULL);
@ -116,13 +114,11 @@ void check_udp_socket(const struct arguments *args, const struct epoll_event *ev
if (errno != EINTR && errno != EAGAIN) if (errno != EINTR && errno != EAGAIN)
s->udp.state = UDP_FINISHING; s->udp.state = UDP_FINISHING;
} } else if (bytes == 0) {
else if (bytes == 0) {
log_android(ANDROID_LOG_WARN, "UDP recv eof"); log_android(ANDROID_LOG_WARN, "UDP recv eof");
s->udp.state = UDP_FINISHING; s->udp.state = UDP_FINISHING;
} } else {
else {
// Socket read data // Socket read data
char dest[INET6_ADDRSTRLEN + 1]; char dest[INET6_ADDRSTRLEN + 1];
if (s->udp.version == 4) if (s->udp.version == 4)
@ -192,8 +188,7 @@ void block_udp(const struct arguments *args,
if (version == 4) { if (version == 4) {
inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source)); inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source));
inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest)); inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source)); inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source));
inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest)); inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest));
} }
@ -212,8 +207,7 @@ void block_udp(const struct arguments *args,
if (version == 4) { if (version == 4) {
s->udp.saddr.ip4 = (__be32) ip4->saddr; s->udp.saddr.ip4 = (__be32) ip4->saddr;
s->udp.daddr.ip4 = (__be32) ip4->daddr; s->udp.daddr.ip4 = (__be32) ip4->daddr;
} } else {
else {
memcpy(&s->udp.saddr.ip6, &ip6->ip6_src, 16); memcpy(&s->udp.saddr.ip6, &ip6->ip6_src, 16);
memcpy(&s->udp.daddr.ip6, &ip6->ip6_dst, 16); memcpy(&s->udp.daddr.ip6, &ip6->ip6_dst, 16);
} }
@ -257,8 +251,7 @@ jboolean handle_udp(const struct arguments *args,
if (version == 4) { if (version == 4) {
inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source)); inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source));
inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest)); inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest));
} } else {
else {
inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source)); inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source));
inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest)); inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest));
} }
@ -295,8 +288,7 @@ jboolean handle_udp(const struct arguments *args,
if (version == 4) { if (version == 4) {
s->udp.saddr.ip4 = (__be32) ip4->saddr; s->udp.saddr.ip4 = (__be32) ip4->saddr;
s->udp.daddr.ip4 = (__be32) ip4->daddr; s->udp.daddr.ip4 = (__be32) ip4->daddr;
} } else {
else {
memcpy(&s->udp.saddr.ip6, &ip6->ip6_src, 16); memcpy(&s->udp.saddr.ip6, &ip6->ip6_src, 16);
memcpy(&s->udp.daddr.ip6, &ip6->ip6_dst, 16); memcpy(&s->udp.daddr.ip6, &ip6->ip6_dst, 16);
} }
@ -376,14 +368,12 @@ jboolean handle_udp(const struct arguments *args,
addr4.sin_family = AF_INET; addr4.sin_family = AF_INET;
addr4.sin_addr.s_addr = (__be32) cur->udp.daddr.ip4; addr4.sin_addr.s_addr = (__be32) cur->udp.daddr.ip4;
addr4.sin_port = cur->udp.dest; addr4.sin_port = cur->udp.dest;
} } else {
else {
addr6.sin6_family = AF_INET6; addr6.sin6_family = AF_INET6;
memcpy(&addr6.sin6_addr, &cur->udp.daddr.ip6, 16); memcpy(&addr6.sin6_addr, &cur->udp.daddr.ip6, 16);
addr6.sin6_port = cur->udp.dest; addr6.sin6_port = cur->udp.dest;
} }
} } else {
else {
rversion = (strstr(redirect->raddr, ":") == NULL ? 4 : 6); rversion = (strstr(redirect->raddr, ":") == NULL ? 4 : 6);
log_android(ANDROID_LOG_WARN, "UDP%d redirect to %s/%u", log_android(ANDROID_LOG_WARN, "UDP%d redirect to %s/%u",
rversion, redirect->raddr, redirect->rport); rversion, redirect->raddr, redirect->rport);
@ -392,8 +382,7 @@ jboolean handle_udp(const struct arguments *args,
addr4.sin_family = AF_INET; addr4.sin_family = AF_INET;
inet_pton(AF_INET, redirect->raddr, &addr4.sin_addr); inet_pton(AF_INET, redirect->raddr, &addr4.sin_addr);
addr4.sin_port = htons(redirect->rport); addr4.sin_port = htons(redirect->rport);
} } else {
else {
addr6.sin6_family = AF_INET6; addr6.sin6_family = AF_INET6;
inet_pton(AF_INET6, redirect->raddr, &addr6.sin6_addr); inet_pton(AF_INET6, redirect->raddr, &addr6.sin6_addr);
addr6.sin6_port = htons(redirect->rport); addr6.sin6_port = htons(redirect->rport);
@ -401,15 +390,15 @@ jboolean handle_udp(const struct arguments *args,
} }
if (sendto(cur->socket, data, (socklen_t) datalen, MSG_NOSIGNAL, if (sendto(cur->socket, data, (socklen_t) datalen, MSG_NOSIGNAL,
(const struct sockaddr *) (rversion == 4 ? &addr4 : &addr6), (rversion == 4 ? (const struct sockaddr *) &addr4
: (const struct sockaddr *) &addr6),
(socklen_t) (rversion == 4 ? sizeof(addr4) : sizeof(addr6))) != datalen) { (socklen_t) (rversion == 4 ? sizeof(addr4) : sizeof(addr6))) != datalen) {
log_android(ANDROID_LOG_ERROR, "UDP sendto error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_ERROR, "UDP sendto error %d: %s", errno, strerror(errno));
if (errno != EINTR && errno != EAGAIN) { if (errno != EINTR && errno != EAGAIN) {
cur->udp.state = UDP_FINISHING; cur->udp.state = UDP_FINISHING;
return 0; return 0;
} }
} } else
else
cur->udp.sent += datalen; cur->udp.sent += datalen;
return 1; return 1;
@ -445,8 +434,7 @@ int open_udp_socket(const struct arguments *args,
log_android(ANDROID_LOG_ERROR, "UDP setsockopt SO_BROADCAST error %d: %s", log_android(ANDROID_LOG_ERROR, "UDP setsockopt SO_BROADCAST error %d: %s",
errno, strerror(errno)); errno, strerror(errno));
} }
} } else {
else {
// http://man7.org/linux/man-pages/man7/ipv6.7.html // http://man7.org/linux/man-pages/man7/ipv6.7.html
if (*((uint8_t *) &cur->daddr.ip6) == 0xFF) { if (*((uint8_t *) &cur->daddr.ip6) == 0xFF) {
log_android(ANDROID_LOG_WARN, "UDP6 broadcast"); log_android(ANDROID_LOG_WARN, "UDP6 broadcast");
@ -516,8 +504,7 @@ ssize_t write_udp(const struct arguments *args, const struct udp_session *cur,
pseudo.ippseudo_len = htons(sizeof(struct udphdr) + datalen); pseudo.ippseudo_len = htons(sizeof(struct udphdr) + datalen);
csum = calc_checksum(0, (uint8_t *) &pseudo, sizeof(struct ippseudo)); csum = calc_checksum(0, (uint8_t *) &pseudo, sizeof(struct ippseudo));
} } else {
else {
len = sizeof(struct ip6_hdr) + sizeof(struct udphdr) + datalen; len = sizeof(struct ip6_hdr) + sizeof(struct udphdr) + datalen;
buffer = malloc(len); buffer = malloc(len);
struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer; struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer;
@ -558,9 +545,13 @@ ssize_t write_udp(const struct arguments *args, const struct udp_session *cur,
udp->check = ~csum; udp->check = ~csum;
inet_ntop(cur->version == 4 ? AF_INET : AF_INET6, inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
cur->version == 4 ? &cur->saddr.ip4 : &cur->saddr.ip6, source, sizeof(source)); (cur->version == 4 ? (const void *) &cur->saddr.ip4 : (const void *) &cur->saddr.ip6),
source,
sizeof(source));
inet_ntop(cur->version == 4 ? AF_INET : AF_INET6, inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
cur->version == 4 ? &cur->daddr.ip4 : &cur->daddr.ip6, dest, sizeof(dest)); (cur->version == 4 ? (const void *) &cur->daddr.ip4 : (const void *) &cur->daddr.ip6),
dest,
sizeof(dest));
// Send packet // Send packet
log_android(ANDROID_LOG_DEBUG, log_android(ANDROID_LOG_DEBUG,
@ -573,8 +564,7 @@ ssize_t write_udp(const struct arguments *args, const struct udp_session *cur,
if (res >= 0) { if (res >= 0) {
if (pcap_file != NULL) if (pcap_file != NULL)
write_pcap_rec(buffer, (size_t) res); write_pcap_rec(buffer, (size_t) res);
} } else
else
log_android(ANDROID_LOG_WARN, "UDP write error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_WARN, "UDP write error %d: %s", errno, strerror(errno));
free(buffer); free(buffer);

View File

@ -66,7 +66,7 @@ void log_android(int prio, const char *fmt, ...) {
va_list argptr; va_list argptr;
va_start(argptr, fmt); va_start(argptr, fmt);
vsprintf(line, fmt, argptr); vsprintf(line, fmt, argptr);
__android_log_print(prio, TAG, line); __android_log_print(prio, TAG, "%s", line);
va_end(argptr); va_end(argptr);
} }
} }
@ -148,8 +148,7 @@ int32_t get_local_port(const int sock) {
if (getsockname(sock, (struct sockaddr *) &sin, &len) < 0) { if (getsockname(sock, (struct sockaddr *) &sin, &len) < 0) {
log_android(ANDROID_LOG_ERROR, "getsockname error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_ERROR, "getsockname error %d: %s", errno, strerror(errno));
return -1; return -1;
} } else
else
return ntohs(sin.sin_port); return ntohs(sin.sin_port);
} }
@ -162,8 +161,7 @@ int is_event(int fd, short event) {
if (r < 0) { if (r < 0) {
log_android(ANDROID_LOG_ERROR, "poll readable error %d: %s", errno, strerror(errno)); log_android(ANDROID_LOG_ERROR, "poll readable error %d: %s", errno, strerror(errno));
return 0; return 0;
} } else if (r == 0)
else if (r == 0)
return 0; return 0;
else else
return (p.revents & event); return (p.revents & event);

View File

@ -8,7 +8,7 @@ buildscript {
// http://tools.android.com/tech-docs/new-build-system/gradle-experimental // http://tools.android.com/tech-docs/new-build-system/gradle-experimental
// https://bintray.com/android/android-tools/com.android.tools.build.gradle-experimental/view // https://bintray.com/android/android-tools/com.android.tools.build.gradle-experimental/view
// https://bintray.com/android/android-tools/com.google.gms.google-services/view // https://bintray.com/android/android-tools/com.google.gms.google-services/view
classpath 'com.android.tools.build:gradle-experimental:0.9.3' classpath 'com.android.tools.build:gradle:3.0.0-rc2'
classpath 'com.google.gms:google-services:3.1.0' classpath 'com.google.gms:google-services:3.1.0'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

View File

@ -1,6 +1,6 @@
#Mon Sep 12 16:15:29 CEST 2016 #Mon Oct 23 20:40:54 CEST 2017
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip