diff --git a/.gitignore b/.gitignore index 0ec54b2..575037a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ nbdist/ nbactions.xml nb-configuration.xml .nb-gradle/ +/121Nat/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 47d2f3b..4566a51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,8 @@ cmake_minimum_required(VERSION 3.3.2) project (121Nat) +#link_directories("$ENV{STAGING_DIR}/usr/lib") +ADD_SUBDIRECTORY(lib/src/jsoncpp) +ADD_SUBDIRECTORY(lib/src/libtins) ADD_SUBDIRECTORY(src) + diff --git a/Makefile b/Makefile deleted file mode 100644 index 05de621..0000000 --- a/Makefile +++ /dev/null @@ -1,128 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help mesage -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# Available make variables: -# -# CND_BASEDIR base directory for relative paths -# CND_DISTDIR default top distribution directory (build artifacts) -# CND_BUILDDIR default top build directory (object files, ...) -# CONF name of current configuration -# CND_PLATFORM_${CONF} platform name (current configuration) -# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) -# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) -# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) -# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) -# CND_PACKAGE_NAME_${CONF} name of package (current configuration) -# CND_PACKAGE_PATH_${CONF} path to package (current configuration) -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin - - -# build -build: .build-post - -.build-pre: -# Add your pre 'build' code here... - -.build-post: .build-impl -# Add your post 'build' code here... - - -# clean -clean: .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: .clean-impl -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: .clobber-impl -# Add your post 'clobber' code here... - - -# all -all: .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: .all-impl -# Add your post 'all' code here... - - -# build tests -build-tests: .build-tests-post - -.build-tests-pre: -# Add your pre 'build-tests' code here... - -.build-tests-post: .build-tests-impl -# Add your post 'build-tests' code here... - - -# run tests -test: .test-post - -.test-pre: build-tests -# Add your pre 'test' code here... - -.test-post: .test-impl -# Add your post 'test' code here... - - -# help -help: .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: .help-impl -# Add your post 'help' code here... - - - -# include project implementation makefile -include nbproject/Makefile-impl.mk - -# include project make variables -include nbproject/Makefile-variables.mk diff --git a/build.bash b/build.bash deleted file mode 100644 index 3427495..0000000 --- a/build.bash +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -mkdir -p build/121Natbuild -cd build/121Natbuild -cmake ../../ -make -cp src/121Nat ../ -cd ../.. -rm -Rf build/121Natbuild diff --git a/buildAll.bash b/buildAll.bash deleted file mode 100644 index 05ad001..0000000 --- a/buildAll.bash +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd lib -sh buildalllibs.bash -cd .. -sh build.bash diff --git a/lib/buildalllibs.bash b/lib/buildalllibs.bash deleted file mode 100644 index 5e85123..0000000 --- a/lib/buildalllibs.bash +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -sh buildjsoncpp.bash -sh buildlibtins.bash diff --git a/lib/buildjsoncpp.bash b/lib/buildjsoncpp.bash deleted file mode 100644 index 34dfa7c..0000000 --- a/lib/buildjsoncpp.bash +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -mkdir -p bin -mkdir -p build/jsoncpp/ -cd build/jsoncpp/ -cmake ../../src/jsoncpp -make -cp src/lib_json/libjsoncpp.a ../../bin -cd ../.. -rm -Rf build/jsoncpp diff --git a/lib/buildlibtins.bash b/lib/buildlibtins.bash deleted file mode 100644 index 7172162..0000000 --- a/lib/buildlibtins.bash +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -mkdir -p bin -mkdir -p build/libtins/ -cd build/libtins/ -cmake ../../src/libtins -DLIBTINS_BUILD_SHARED=1 -DLIBTINS_ENABLE_CXX11=1 -DLIBTINS_ENABLE_WPA2=0 -DLIBTINS_ENABLE_DOT11=0 -DHAVE_PCAP_IMMEDIATE_MODE=1 -make -cp lib/libtins.so ../../bin -cd ../.. -rm -Rf build/libtins diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk deleted file mode 100644 index 19ce8b5..0000000 --- a/nbproject/Makefile-Debug.mk +++ /dev/null @@ -1,238 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -GREP=grep -NM=nm -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc -CCC=g++ -CXX=g++ -FC=gfortran -AS=as - -# Macros -CND_PLATFORM=GNU-Linux -CND_DLIB_EXT=so -CND_CONF=Debug -CND_DISTDIR=dist -CND_BUILDDIR=build - -# Include project Makefile -include Makefile - -# Object Directory -OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} - -# Object Files -OBJECTFILES= \ - ${OBJECTDIR}/src/PduSender.o \ - ${OBJECTDIR}/src/PduSniffer.o \ - ${OBJECTDIR}/src/main.o \ - ${OBJECTDIR}/src/map/NatRange.o \ - ${OBJECTDIR}/src/map/natmap.o - -# Test Directory -TESTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tests - -# Test Files -TESTFILES= \ - ${TESTDIR}/TestFiles/f2 \ - ${TESTDIR}/TestFiles/f1 - -# Test Object Files -TESTOBJECTFILES= \ - ${TESTDIR}/tests/jsontest.o \ - ${TESTDIR}/tests/jsontestrunner.o \ - ${TESTDIR}/tests/nattest.o \ - ${TESTDIR}/tests/nattestrunner.o - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS= -CXXFLAGS= - -# Fortran Compiler Flags -FFLAGS= - -# Assembler Flags -ASFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS=-lpthread lib/bin/libjsoncpp.a lib/bin/libtins.so - -# Build Targets -.build-conf: ${BUILD_SUBPROJECTS} - "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat - -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat: lib/bin/libjsoncpp.a - -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat: lib/bin/libtins.so - -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat: ${OBJECTFILES} - ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} - ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat ${OBJECTFILES} ${LDLIBSOPTIONS} - -${OBJECTDIR}/src/PduSender.o: src/PduSender.cpp - ${MKDIR} -p ${OBJECTDIR}/src - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp - -${OBJECTDIR}/src/PduSniffer.o: src/PduSniffer.cpp - ${MKDIR} -p ${OBJECTDIR}/src - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp - -${OBJECTDIR}/src/main.o: src/main.cpp - ${MKDIR} -p ${OBJECTDIR}/src - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main.o src/main.cpp - -${OBJECTDIR}/src/map/NatRange.o: src/map/NatRange.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp - -${OBJECTDIR}/src/map/natmap.o: src/map/natmap.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp - -# Subprojects -.build-subprojects: - -# Build Test Targets -.build-tests-conf: .build-tests-subprojects .build-conf ${TESTFILES} -.build-tests-subprojects: - -${TESTDIR}/TestFiles/f2: ${TESTDIR}/tests/jsontest.o ${TESTDIR}/tests/jsontestrunner.o ${OBJECTFILES:%.o=%_nomain.o} - ${MKDIR} -p ${TESTDIR}/TestFiles - ${LINK.cc} -o ${TESTDIR}/TestFiles/f2 $^ ${LDLIBSOPTIONS} `cppunit-config --libs` - -${TESTDIR}/TestFiles/f1: ${TESTDIR}/tests/nattest.o ${TESTDIR}/tests/nattestrunner.o ${OBJECTFILES:%.o=%_nomain.o} - ${MKDIR} -p ${TESTDIR}/TestFiles - ${LINK.cc} -o ${TESTDIR}/TestFiles/f1 $^ ${LDLIBSOPTIONS} `cppunit-config --libs` - - -${TESTDIR}/tests/jsontest.o: tests/jsontest.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/jsontest.o tests/jsontest.cpp - - -${TESTDIR}/tests/jsontestrunner.o: tests/jsontestrunner.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/jsontestrunner.o tests/jsontestrunner.cpp - - -${TESTDIR}/tests/nattest.o: tests/nattest.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -I. -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/nattest.o tests/nattest.cpp - - -${TESTDIR}/tests/nattestrunner.o: tests/nattestrunner.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -I. -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/nattestrunner.o tests/nattestrunner.cpp - - -${OBJECTDIR}/src/PduSender_nomain.o: ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp - ${MKDIR} -p ${OBJECTDIR}/src - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSender.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -g -Wall -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender_nomain.o src/PduSender.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/PduSender.o ${OBJECTDIR}/src/PduSender_nomain.o;\ - fi - -${OBJECTDIR}/src/PduSniffer_nomain.o: ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp - ${MKDIR} -p ${OBJECTDIR}/src - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSniffer.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -g -Wall -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer_nomain.o src/PduSniffer.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/PduSniffer.o ${OBJECTDIR}/src/PduSniffer_nomain.o;\ - fi - -${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp - ${MKDIR} -p ${OBJECTDIR}/src - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/main.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -g -Wall -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main_nomain.o src/main.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/main.o ${OBJECTDIR}/src/main_nomain.o;\ - fi - -${OBJECTDIR}/src/map/NatRange_nomain.o: ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/NatRange.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -g -Wall -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange_nomain.o src/map/NatRange.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/map/NatRange.o ${OBJECTDIR}/src/map/NatRange_nomain.o;\ - fi - -${OBJECTDIR}/src/map/natmap_nomain.o: ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/natmap.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -g -Wall -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/natmap_nomain.o src/map/natmap.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/map/natmap.o ${OBJECTDIR}/src/map/natmap_nomain.o;\ - fi - -# Run Test Targets -.test-conf: - @if [ "${TEST}" = "" ]; \ - then \ - ${TESTDIR}/TestFiles/f2 || true; \ - ${TESTDIR}/TestFiles/f1 || true; \ - else \ - ./${TEST} || true; \ - fi - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r ${CND_BUILDDIR}/${CND_CONF} - ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat - -# Subprojects -.clean-subprojects: - -# Enable dependency checking -.dep.inc: .depcheck-impl - -include .dep.inc diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk deleted file mode 100644 index 0c6869d..0000000 --- a/nbproject/Makefile-Release.mk +++ /dev/null @@ -1,238 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -GREP=grep -NM=nm -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc -CCC=g++ -CXX=g++ -FC=gfortran -AS=as - -# Macros -CND_PLATFORM=GNU-Linux -CND_DLIB_EXT=so -CND_CONF=Release -CND_DISTDIR=dist -CND_BUILDDIR=build - -# Include project Makefile -include Makefile - -# Object Directory -OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} - -# Object Files -OBJECTFILES= \ - ${OBJECTDIR}/src/PduSender.o \ - ${OBJECTDIR}/src/PduSniffer.o \ - ${OBJECTDIR}/src/main.o \ - ${OBJECTDIR}/src/map/NatRange.o \ - ${OBJECTDIR}/src/map/natmap.o - -# Test Directory -TESTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tests - -# Test Files -TESTFILES= \ - ${TESTDIR}/TestFiles/f2 \ - ${TESTDIR}/TestFiles/f1 - -# Test Object Files -TESTOBJECTFILES= \ - ${TESTDIR}/tests/jsontest.o \ - ${TESTDIR}/tests/jsontestrunner.o \ - ${TESTDIR}/tests/nattest.o \ - ${TESTDIR}/tests/nattestrunner.o - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS= -CXXFLAGS= - -# Fortran Compiler Flags -FFLAGS= - -# Assembler Flags -ASFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS=lib/bin/libjsoncpp.a lib/bin/libtins.so -lpthread - -# Build Targets -.build-conf: ${BUILD_SUBPROJECTS} - "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat - -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat: lib/bin/libjsoncpp.a - -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat: lib/bin/libtins.so - -${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat: ${OBJECTFILES} - ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} - ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat ${OBJECTFILES} ${LDLIBSOPTIONS} - -${OBJECTDIR}/src/PduSender.o: src/PduSender.cpp - ${MKDIR} -p ${OBJECTDIR}/src - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp - -${OBJECTDIR}/src/PduSniffer.o: src/PduSniffer.cpp - ${MKDIR} -p ${OBJECTDIR}/src - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp - -${OBJECTDIR}/src/main.o: src/main.cpp - ${MKDIR} -p ${OBJECTDIR}/src - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main.o src/main.cpp - -${OBJECTDIR}/src/map/NatRange.o: src/map/NatRange.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp - -${OBJECTDIR}/src/map/natmap.o: src/map/natmap.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp - -# Subprojects -.build-subprojects: - -# Build Test Targets -.build-tests-conf: .build-tests-subprojects .build-conf ${TESTFILES} -.build-tests-subprojects: - -${TESTDIR}/TestFiles/f2: ${TESTDIR}/tests/jsontest.o ${TESTDIR}/tests/jsontestrunner.o ${OBJECTFILES:%.o=%_nomain.o} - ${MKDIR} -p ${TESTDIR}/TestFiles - ${LINK.cc} -o ${TESTDIR}/TestFiles/f2 $^ ${LDLIBSOPTIONS} `cppunit-config --libs` - -${TESTDIR}/TestFiles/f1: ${TESTDIR}/tests/nattest.o ${TESTDIR}/tests/nattestrunner.o ${OBJECTFILES:%.o=%_nomain.o} - ${MKDIR} -p ${TESTDIR}/TestFiles - ${LINK.cc} -o ${TESTDIR}/TestFiles/f1 $^ ${LDLIBSOPTIONS} `cppunit-config --libs` - - -${TESTDIR}/tests/jsontest.o: tests/jsontest.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/jsontest.o tests/jsontest.cpp - - -${TESTDIR}/tests/jsontestrunner.o: tests/jsontestrunner.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/jsontestrunner.o tests/jsontestrunner.cpp - - -${TESTDIR}/tests/nattest.o: tests/nattest.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -I. -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/nattest.o tests/nattest.cpp - - -${TESTDIR}/tests/nattestrunner.o: tests/nattestrunner.cpp - ${MKDIR} -p ${TESTDIR}/tests - ${RM} "$@.d" - $(COMPILE.cc) -O2 -s -I. -std=c++11 `cppunit-config --cflags` -MMD -MP -MF "$@.d" -o ${TESTDIR}/tests/nattestrunner.o tests/nattestrunner.cpp - - -${OBJECTDIR}/src/PduSender_nomain.o: ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp - ${MKDIR} -p ${OBJECTDIR}/src - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSender.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -O2 -s -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender_nomain.o src/PduSender.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/PduSender.o ${OBJECTDIR}/src/PduSender_nomain.o;\ - fi - -${OBJECTDIR}/src/PduSniffer_nomain.o: ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp - ${MKDIR} -p ${OBJECTDIR}/src - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSniffer.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -O2 -s -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer_nomain.o src/PduSniffer.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/PduSniffer.o ${OBJECTDIR}/src/PduSniffer_nomain.o;\ - fi - -${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp - ${MKDIR} -p ${OBJECTDIR}/src - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/main.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -O2 -s -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main_nomain.o src/main.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/main.o ${OBJECTDIR}/src/main_nomain.o;\ - fi - -${OBJECTDIR}/src/map/NatRange_nomain.o: ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/NatRange.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -O2 -s -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange_nomain.o src/map/NatRange.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/map/NatRange.o ${OBJECTDIR}/src/map/NatRange_nomain.o;\ - fi - -${OBJECTDIR}/src/map/natmap_nomain.o: ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp - ${MKDIR} -p ${OBJECTDIR}/src/map - @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/natmap.o`; \ - if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ - (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ - then \ - ${RM} "$@.d";\ - $(COMPILE.cc) -O2 -s -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/natmap_nomain.o src/map/natmap.cpp;\ - else \ - ${CP} ${OBJECTDIR}/src/map/natmap.o ${OBJECTDIR}/src/map/natmap_nomain.o;\ - fi - -# Run Test Targets -.test-conf: - @if [ "${TEST}" = "" ]; \ - then \ - ${TESTDIR}/TestFiles/f2 || true; \ - ${TESTDIR}/TestFiles/f1 || true; \ - else \ - ./${TEST} || true; \ - fi - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r ${CND_BUILDDIR}/${CND_CONF} - ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat - -# Subprojects -.clean-subprojects: - -# Enable dependency checking -.dep.inc: .depcheck-impl - -include .dep.inc diff --git a/nbproject/Makefile-impl.mk b/nbproject/Makefile-impl.mk deleted file mode 100644 index f7722d7..0000000 --- a/nbproject/Makefile-impl.mk +++ /dev/null @@ -1,133 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a pre- and a post- target defined where you can add customization code. -# -# This makefile implements macros and targets common to all configurations. -# -# NOCDDL - - -# Building and Cleaning subprojects are done by default, but can be controlled with the SUB -# macro. If SUB=no, subprojects will not be built or cleaned. The following macro -# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf -# and .clean-reqprojects-conf unless SUB has the value 'no' -SUB_no=NO -SUBPROJECTS=${SUB_${SUB}} -BUILD_SUBPROJECTS_=.build-subprojects -BUILD_SUBPROJECTS_NO= -BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} -CLEAN_SUBPROJECTS_=.clean-subprojects -CLEAN_SUBPROJECTS_NO= -CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} - - -# Project Name -PROJECTNAME=121Nat - -# Active Configuration -DEFAULTCONF=Debug -CONF=${DEFAULTCONF} - -# All Configurations -ALLCONFS=Debug Release - - -# build -.build-impl: .build-pre .validate-impl .depcheck-impl - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf - - -# clean -.clean-impl: .clean-pre .validate-impl .depcheck-impl - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf - - -# clobber -.clobber-impl: .clobber-pre .depcheck-impl - @#echo "=> Running $@..." - for CONF in ${ALLCONFS}; \ - do \ - "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \ - done - -# all -.all-impl: .all-pre .depcheck-impl - @#echo "=> Running $@..." - for CONF in ${ALLCONFS}; \ - do \ - "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \ - done - -# build tests -.build-tests-impl: .build-impl .build-tests-pre - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf - -# run tests -.test-impl: .build-tests-impl .test-pre - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf - -# dependency checking support -.depcheck-impl: - @echo "# This code depends on make tool being used" >.dep.inc - @if [ -n "${MAKE_VERSION}" ]; then \ - echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \ - echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ - echo "include \$${DEPFILES}" >>.dep.inc; \ - echo "endif" >>.dep.inc; \ - else \ - echo ".KEEP_STATE:" >>.dep.inc; \ - echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ - fi - -# configuration validation -.validate-impl: - @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ - then \ - echo ""; \ - echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \ - echo "See 'make help' for details."; \ - echo "Current directory: " `pwd`; \ - echo ""; \ - fi - @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ - then \ - exit 1; \ - fi - - -# help -.help-impl: .help-pre - @echo "This makefile supports the following configurations:" - @echo " ${ALLCONFS}" - @echo "" - @echo "and the following targets:" - @echo " build (default target)" - @echo " clean" - @echo " clobber" - @echo " all" - @echo " help" - @echo "" - @echo "Makefile Usage:" - @echo " make [CONF=] [SUB=no] build" - @echo " make [CONF=] [SUB=no] clean" - @echo " make [SUB=no] clobber" - @echo " make [SUB=no] all" - @echo " make help" - @echo "" - @echo "Target 'build' will build a specific configuration and, unless 'SUB=no'," - @echo " also build subprojects." - @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no'," - @echo " also clean subprojects." - @echo "Target 'clobber' will remove all built files from all configurations and," - @echo " unless 'SUB=no', also from subprojects." - @echo "Target 'all' will will build all configurations and, unless 'SUB=no'," - @echo " also build subprojects." - @echo "Target 'help' prints this message." - @echo "" - diff --git a/nbproject/Makefile-variables.mk b/nbproject/Makefile-variables.mk deleted file mode 100644 index 4f8f4f4..0000000 --- a/nbproject/Makefile-variables.mk +++ /dev/null @@ -1,35 +0,0 @@ -# -# Generated - do not edit! -# -# NOCDDL -# -CND_BASEDIR=`pwd` -CND_BUILDDIR=build -CND_DISTDIR=dist -# Debug configuration -CND_PLATFORM_Debug=GNU-Linux -CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux -CND_ARTIFACT_NAME_Debug=121nat -CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux/121nat -CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux/package -CND_PACKAGE_NAME_Debug=121nat.tar -CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux/package/121nat.tar -# Release configuration -CND_PLATFORM_Release=GNU-Linux -CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux -CND_ARTIFACT_NAME_Release=121nat -CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux/121nat -CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux/package -CND_PACKAGE_NAME_Release=121nat.tar -CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux/package/121nat.tar -# -# include compiler specific variables -# -# dmake command -ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \ - (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk) -# -# gmake command -.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)) -# -include nbproject/private/Makefile-variables.mk diff --git a/nbproject/Package-Debug.bash b/nbproject/Package-Debug.bash deleted file mode 100644 index 70bd631..0000000 --- a/nbproject/Package-Debug.bash +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_PLATFORM=GNU-Linux -CND_CONF=Debug -CND_DISTDIR=dist -CND_BUILDDIR=build -CND_DLIB_EXT=so -NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat -OUTPUT_BASENAME=121nat -PACKAGE_TOP_DIR=121nat/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package -rm -rf ${NBTMPDIR} -mkdir -p ${NBTMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory "${NBTMPDIR}/121nat/bin" -copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/121nat.tar -cd ${NBTMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/121nat.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${NBTMPDIR} diff --git a/nbproject/Package-Release.bash b/nbproject/Package-Release.bash deleted file mode 100644 index 6517dc1..0000000 --- a/nbproject/Package-Release.bash +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_PLATFORM=GNU-Linux -CND_CONF=Release -CND_DISTDIR=dist -CND_BUILDDIR=build -CND_DLIB_EXT=so -NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/121nat -OUTPUT_BASENAME=121nat -PACKAGE_TOP_DIR=121nat/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package -rm -rf ${NBTMPDIR} -mkdir -p ${NBTMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory "${NBTMPDIR}/121nat/bin" -copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/121nat.tar -cd ${NBTMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/121nat.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${NBTMPDIR} diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml deleted file mode 100644 index 0076034..0000000 --- a/nbproject/configurations.xml +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - src/map/natmap.h - - src/map/NatRange.h - src/PduSender.h - src/PduSniffer.h - - - src/config.json - - - - src/map/natmap.cpp - - src/map/NatRange.cpp - src/PduSender.cpp - src/PduSniffer.cpp - src/main.cpp - - - - tests/jsontest.cpp - tests/jsontest.h - tests/jsontestrunner.cpp - - - tests/nattest.cpp - tests/nattest.h - tests/nattestrunner.cpp - - - - Makefile - - - Makefile - - - - default - true - false - - - - 8 - 2 - - - - pthread - lib/bin/libjsoncpp.a - lib/bin/libtins.so - - - - - - - . - - `cppunit-config --cflags` - - - - . - - `cppunit-config --cflags` - - - ${TESTDIR}/TestFiles/f1 - - `cppunit-config --libs` - - - - - - `cppunit-config --cflags` - - - `cppunit-config --cflags` - - - ${TESTDIR}/TestFiles/f2 - - `cppunit-config --libs` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - true - false - - - - 5 - - - 5 - true - 8 - - - 5 - - - 5 - - - - lib/bin/libjsoncpp.a - lib/bin/libtins.so - pthread - - - - - - - . - - `cppunit-config --cflags` - - - - . - - `cppunit-config --cflags` - - - ${TESTDIR}/TestFiles/f1 - - `cppunit-config --libs` - - - - - - `cppunit-config --cflags` - - - `cppunit-config --cflags` - - - ${TESTDIR}/TestFiles/f2 - - `cppunit-config --libs` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/nbproject/project.xml b/nbproject/project.xml deleted file mode 100644 index 52f2b11..0000000 --- a/nbproject/project.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - org.netbeans.modules.cnd.makeproject - - - 1T1NAT - - cpp - h - UTF-8 - - - - - Debug - 1 - - - Release - 1 - - - - false - - - - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 01c43e2..52ca27a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,8 @@ file(GLOB_RECURSE 121Nat_Src_Files "*.h" "*.cpp") +INCLUDE_DIRECTORIES(../lib/src/libtins/include) +INCLUDE_DIRECTORIES(../lib/src/jsoncpp/include) add_executable(121Nat ${121Nat_Src_Files}) -target_link_libraries (121Nat pthread ${CMAKE_SOURCE_DIR}/lib/bin/libtins.so ${CMAKE_SOURCE_DIR}/lib/bin/libjsoncpp.a) +target_link_libraries (121Nat pthread tins jsoncpp_lib_static) set_property(TARGET 121Nat PROPERTY CXX_STANDARD 11) set_property(TARGET 121Nat PROPERTY CXX_STANDARD_REQUIRED ON) install(TARGETS 121Nat diff --git a/src/PduSender.cpp b/src/PduSender.cpp index c6141cd..6e082f7 100644 --- a/src/PduSender.cpp +++ b/src/PduSender.cpp @@ -1,7 +1,7 @@ -/* +/* * File: PduSender.cpp * Author: dev - * + * * Created on 16. September 2015, 20:31 */ diff --git a/src/config.json b/src/config.json index 919d942..c2385dd 100644 --- a/src/config.json +++ b/src/config.json @@ -5,7 +5,7 @@ } }, { "vboxnet1": { - "rangeIpAddr": "172.27.0.0", + "rangeIpAddr": "172.18.0.0", "rangeNetmask": "255.255.0.0" } }] diff --git a/src/map/main.cpp b/src/map/main.cpp new file mode 100644 index 0000000..df627a5 --- /dev/null +++ b/src/map/main.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include "map/natmap.h" +#include "PduSniffer.h" +#include "PduSender.h" +#include +#include +#include +int main(int argc, char** argv) +{ + if (argc < 2){ + return 0; + } + + otonat::NatMap::NatRangeList list; + std::ifstream config_doc(argv[1], std::ifstream::binary); + Json::Value root; + config_doc >> root; + const Json::Value netcards = root; + for (Json::Value netcard : netcards) { + const std::string name = netcard.getMemberNames()[0].c_str(); + const Json::Value cardMember = netcard[name]; + const std::string ipStr = cardMember["rangeIpAddr"].asString(); + const std::string maskStr = cardMember["rangeNetmask"].asString(); + + const Tins::NetworkInterface net(name); + const otonat::NatRange netRange(net, Tins::IPv4Address(ipStr), Tins::IPv4Address(maskStr)); + list.push_back(netRange); + } + + otonat::NatMap natMap = otonat::NatMap(list); + otonat::PduSniffer sniffer(&natMap); + otonat::PduSender sender(&natMap); + std::thread * mapThread = natMap.translateThread(); + std::thread * senderThread = sender.SendPdusFromQueueThread(); + for (otonat::NatRange & net : list) { + sniffer.SniffInterfaceInNewThread(net.interface); + } + + mapThread->join(); + senderThread->join(); + return 0; +} +