summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-12 12:14:27 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-12 12:14:27 +0000
commitb0f62471ea72f5767d859f18e41d4326f57b85c5 (patch)
tree5be22dd454663b8e8daee9e322ed794ccf54e8c4 /pjnath
parent9ca491d9d373e4f9114b429bcd61b72b1ff97048 (diff)
Ticket #399: Initial implementation of tool to perform NAT type detection/classification
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1495 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r--pjnath/build/Makefile2
-rw-r--r--pjnath/build/pjnath.dsp10
-rw-r--r--pjnath/build/pjnath.vcproj8
-rw-r--r--pjnath/build/wince-evc4/pjnath_wince.vcp859
-rw-r--r--pjnath/include/pjnath.h1
-rw-r--r--pjnath/include/pjnath/nat_detect.h95
-rw-r--r--pjnath/src/pjnath/nat_detect.c663
-rw-r--r--pjnath/src/pjstun-client/client_main.c57
8 files changed, 1692 insertions, 3 deletions
diff --git a/pjnath/build/Makefile b/pjnath/build/Makefile
index a5369a9a..42c8e12a 100644
--- a/pjnath/build/Makefile
+++ b/pjnath/build/Makefile
@@ -30,7 +30,7 @@ export _LDFLAGS := $(subst /,$(HOST_PSEP),$(PJNATH_LIB)) \
#
export PJNATH_SRCDIR = ../src/pjnath
export PJNATH_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
- errno.o ice_session.o ice_strans.o stun_auth.o \
+ errno.o ice_session.o ice_strans.o nat_detect.o stun_auth.o \
stun_msg.o stun_msg_dump.o stun_session.o stun_transaction.o
export PJNATH_CFLAGS += $(_CFLAGS)
diff --git a/pjnath/build/pjnath.dsp b/pjnath/build/pjnath.dsp
index cdffc4f7..3f671302 100644
--- a/pjnath/build/pjnath.dsp
+++ b/pjnath/build/pjnath.dsp
@@ -40,6 +40,7 @@ RSC=rc.exe
# PROP Output_Dir "./output/pjnath-i386-win32-vc6-release"
# PROP Intermediate_Dir "./output/pjnath-i386-win32-vc6-release"
# PROP Target_Dir ""
+F90=df.exe
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W4 /GX /O1 /Ob2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D PJ_WIN32=1 /D PJ_M_I386=1 /FR /FD /c
# SUBTRACT CPP /YX
@@ -64,6 +65,7 @@ LIB32=link.exe -lib
# PROP Output_Dir "./output/pjnath-i386-win32-vc6-debug"
# PROP Intermediate_Dir "./output/pjnath-i386-win32-vc6-debug"
# PROP Target_Dir ""
+F90=df.exe
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D PJ_WIN32=1 /D PJ_M_I386=1 /FR /FD /GZ /c
# SUBTRACT CPP /YX
@@ -99,6 +101,10 @@ SOURCE=..\src\pjnath\ice_strans.c
# End Source File
# Begin Source File
+SOURCE=..\src\pjnath\nat_detect.c
+# End Source File
+# Begin Source File
+
SOURCE=..\src\pjnath\stun_auth.c
# End Source File
# Begin Source File
@@ -139,6 +145,10 @@ SOURCE=..\include\pjnath\ice_strans.h
# End Source File
# Begin Source File
+SOURCE=..\include\pjnath\nat_detect.h
+# End Source File
+# Begin Source File
+
SOURCE=..\include\pjnath.h
# End Source File
# Begin Source File
diff --git a/pjnath/build/pjnath.vcproj b/pjnath/build/pjnath.vcproj
index 34f17786..47720b09 100644
--- a/pjnath/build/pjnath.vcproj
+++ b/pjnath/build/pjnath.vcproj
@@ -206,6 +206,10 @@
>
</File>
<File
+ RelativePath="..\src\pjnath\nat_detect.c"
+ >
+ </File>
+ <File
RelativePath="..\src\pjnath\stun_auth.c"
>
<FileConfiguration
@@ -337,6 +341,10 @@
>
</File>
<File
+ RelativePath="..\include\pjnath\nat_detect.h"
+ >
+ </File>
+ <File
RelativePath="..\include\pjnath.h"
>
</File>
diff --git a/pjnath/build/wince-evc4/pjnath_wince.vcp b/pjnath/build/wince-evc4/pjnath_wince.vcp
index d58e7aab..3c544689 100644
--- a/pjnath/build/wince-evc4/pjnath_wince.vcp
+++ b/pjnath/build/wince-evc4/pjnath_wince.vcp
@@ -390,8 +390,12 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -403,10 +407,12 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -642,8 +648,12 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -655,10 +665,12 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -1032,8 +1044,12 @@ DEP_CPP_ICE_S=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -1045,10 +1061,12 @@ DEP_CPP_ICE_S=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -1304,8 +1322,12 @@ DEP_CPP_ICE_S=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -1317,10 +1339,12 @@ DEP_CPP_ICE_S=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -1728,8 +1752,12 @@ DEP_CPP_ICE_ST=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -1741,10 +1769,12 @@ DEP_CPP_ICE_ST=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -2020,8 +2050,12 @@ DEP_CPP_ICE_ST=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -2033,10 +2067,12 @@ DEP_CPP_ICE_ST=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -2379,6 +2415,763 @@ DEP_CPP_ICE_ST=\
# End Source File
# Begin Source File
+SOURCE=..\..\src\pjnath\nat_detect.c
+
+!IF "$(CFG)" == "pjnath_wince - Win32 (WCE emulator) Release"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE emulator) Debug"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE ARMV4I) Release"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE ARMV4I) Debug"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE ARMV4) Release"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE ARMV4) Debug"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE ARMV4T) Release"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE ARMV4T) Debug"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE x86) Release"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjnath_wince - Win32 (WCE x86) Debug"
+
+DEP_CPP_NAT_D=\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\socket.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjnath\config.h"\
+ "..\..\include\pjnath\errno.h"\
+ "..\..\include\pjnath\nat_detect.h"\
+ "..\..\include\pjnath\stun_auth.h"\
+ "..\..\include\pjnath\stun_config.h"\
+ "..\..\include\pjnath\stun_msg.h"\
+ "..\..\include\pjnath\stun_session.h"\
+ "..\..\include\pjnath\stun_transaction.h"\
+ "..\..\include\pjnath\types.h"\
+
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
SOURCE=..\..\src\pjnath\stun_auth.c
!IF "$(CFG)" == "pjnath_wince - Win32 (WCE emulator) Release"
@@ -2456,8 +3249,12 @@ DEP_CPP_STUN_=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -2469,10 +3266,12 @@ DEP_CPP_STUN_=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -2720,8 +3519,12 @@ DEP_CPP_STUN_=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -2733,10 +3536,12 @@ DEP_CPP_STUN_=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -3123,13 +3928,18 @@ DEP_CPP_STUN_M=\
"..\..\..\pjlib-util\include\pjlib-util\crc32.h"\
"..\..\..\pjlib-util\include\pjlib-util\hmac_sha1.h"\
"..\..\..\pjlib-util\include\pjlib-util\md5.h"\
+ "..\..\..\pjlib-util\include\pjlib-util\sha1.h"\
"..\..\..\pjlib-util\include\pjlib-util\types.h"\
"..\..\..\pjlib\include\pj\addr_resolv.h"\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -3141,10 +3951,12 @@ DEP_CPP_STUN_M=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -3395,13 +4207,18 @@ DEP_CPP_STUN_M=\
"..\..\..\pjlib-util\include\pjlib-util\crc32.h"\
"..\..\..\pjlib-util\include\pjlib-util\hmac_sha1.h"\
"..\..\..\pjlib-util\include\pjlib-util\md5.h"\
+ "..\..\..\pjlib-util\include\pjlib-util\sha1.h"\
"..\..\..\pjlib-util\include\pjlib-util\types.h"\
"..\..\..\pjlib\include\pj\addr_resolv.h"\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -3413,10 +4230,12 @@ DEP_CPP_STUN_M=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -3805,8 +4624,12 @@ DEP_CPP_STUN_MS=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -3818,10 +4641,12 @@ DEP_CPP_STUN_MS=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -4057,8 +4882,12 @@ DEP_CPP_STUN_MS=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -4070,10 +4899,12 @@ DEP_CPP_STUN_MS=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -4445,8 +5276,12 @@ DEP_CPP_STUN_S=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -4458,10 +5293,12 @@ DEP_CPP_STUN_S=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -4709,8 +5546,12 @@ DEP_CPP_STUN_S=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -4722,10 +5563,12 @@ DEP_CPP_STUN_S=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -5111,8 +5954,12 @@ DEP_CPP_STUN_T=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -5124,10 +5971,12 @@ DEP_CPP_STUN_T=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -5371,8 +6220,12 @@ DEP_CPP_STUN_T=\
"..\..\..\pjlib\include\pj\array.h"\
"..\..\..\pjlib\include\pj\assert.h"\
"..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
"..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
"..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
"..\..\..\pjlib\include\pj\compat\ctype.h"\
"..\..\..\pjlib\include\pj\compat\errno.h"\
"..\..\..\pjlib\include\pj\compat\high_precision.h"\
@@ -5384,10 +6237,12 @@ DEP_CPP_STUN_T=\
"..\..\..\pjlib\include\pj\compat\os_palmos.h"\
"..\..\..\pjlib\include\pj\compat\os_rtems.h"\
"..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
"..\..\..\pjlib\include\pj\compat\os_win32.h"\
"..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
"..\..\..\pjlib\include\pj\compat\setjmp.h"\
"..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
"..\..\..\pjlib\include\pj\compat\string.h"\
"..\..\..\pjlib\include\pj\config.h"\
"..\..\..\pjlib\include\pj\config_site.h"\
@@ -5714,6 +6569,10 @@ SOURCE=..\..\include\pjnath\ice_strans.h
# End Source File
# Begin Source File
+SOURCE=..\..\include\pjnath\nat_detect.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\include\pjnath.h
# End Source File
# Begin Source File
diff --git a/pjnath/include/pjnath.h b/pjnath/include/pjnath.h
index 20fb28b4..6c925050 100644
--- a/pjnath/include/pjnath.h
+++ b/pjnath/include/pjnath.h
@@ -21,6 +21,7 @@
#include <pjnath/errno.h>
#include <pjnath/ice_session.h>
#include <pjnath/ice_strans.h>
+#include <pjnath/nat_detect.h>
#include <pjnath/stun_auth.h>
#include <pjnath/stun_config.h>
#include <pjnath/stun_msg.h>
diff --git a/pjnath/include/pjnath/nat_detect.h b/pjnath/include/pjnath/nat_detect.h
new file mode 100644
index 00000000..014a8911
--- /dev/null
+++ b/pjnath/include/pjnath/nat_detect.h
@@ -0,0 +1,95 @@
+/* $Id$ */
+/*
+ * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef __PJNATH_NAT_DETECT_H__
+#define __PJNATH_NAT_DETECT_H__
+
+/**
+ * @file ice_session.h
+ * @brief ICE session management
+ */
+#include <pjnath/stun_session.h>
+
+
+PJ_BEGIN_DECL
+
+
+/**
+ * @defgroup PJNATH_NAT_DETECT NAT Classification/Detection Tool
+ * @brief NAT Classification/Detection Tool
+ * @ingroup PJNATH_ICE
+ * @{
+ * This module provides one function to perform NAT classification and
+ * detection.
+ */
+
+/**
+ * This enumeration describes the NAT types.
+ */
+typedef enum pj_stun_nat_type
+{
+ PJ_STUN_NAT_TYPE_UNKNOWN,
+ PJ_STUN_NAT_TYPE_OPEN,
+ PJ_STUN_NAT_TYPE_BLOCKED,
+ PJ_STUN_NAT_TYPE_SYMMETRIC_UDP,
+ PJ_STUN_NAT_TYPE_FULL_CONE,
+ PJ_STUN_NAT_TYPE_SYMMETRIC,
+ PJ_STUN_NAT_TYPE_RESTRICTED,
+ PJ_STUN_NAT_TYPE_PORT_RESTRICTED
+} pj_stun_nat_type;
+
+
+/**
+ * This structure contains the result of NAT classification function.
+ */
+typedef struct pj_stun_nat_detect_result
+{
+ pj_status_t status;
+ const char *status_text;
+ pj_stun_nat_type nat_type;
+ const char *nat_type_name;
+} pj_stun_nat_detect_result;
+
+
+/**
+ * Type of callback to be called when the NAT detection function has
+ * completed.
+ */
+typedef void pj_stun_nat_detect_cb(void *user_data,
+ const pj_stun_nat_detect_result *res);
+
+
+/**
+ * Perform NAT classification function.
+ */
+PJ_DECL(pj_status_t) pj_stun_detect_nat_type(const pj_sockaddr_in *server,
+ pj_stun_config *stun_cfg,
+ void *user_data,
+ pj_stun_nat_detect_cb *cb);
+
+
+/**
+ * @}
+ */
+
+
+PJ_END_DECL
+
+
+#endif /* __PJNATH_NAT_DETECT_H__ */
+
diff --git a/pjnath/src/pjnath/nat_detect.c b/pjnath/src/pjnath/nat_detect.c
new file mode 100644
index 00000000..6d2c75f0
--- /dev/null
+++ b/pjnath/src/pjnath/nat_detect.c
@@ -0,0 +1,663 @@
+/* $Id$ */
+/*
+ * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <pjnath/nat_detect.h>
+#include <pjnath/errno.h>
+#include <pj/assert.h>
+#include <pj/ioqueue.h>
+#include <pj/log.h>
+#include <pj/os.h>
+#include <pj/pool.h>
+#include <pj/string.h>
+#include <pj/timer.h>
+#include <pj/compat/socket.h>
+
+
+static const char *nat_type_names[] =
+{
+ "Unknown",
+ "Open Internet",
+ "Blocked",
+ "Symmetric UDP",
+ "Full Cone",
+ "Symmetric",
+ "Restricted",
+ "Port Restricted"
+};
+
+
+#define CHANGE_PORT (0x01 << 30)
+#define CHANGE_ADDR_PORT (0x03 << 29)
+
+
+enum state
+{
+ ST_TEST_1,
+ ST_TEST_2,
+ ST_TEST_1B,
+ ST_TEST_3
+};
+
+typedef struct nat_detect_session
+{
+ pj_pool_t *pool;
+ pj_mutex_t *mutex;
+
+ pj_timer_heap_t *timer_heap;
+ pj_timer_entry destroy_timer;
+
+ void *user_data;
+ pj_stun_nat_detect_cb *cb;
+ pj_sock_t sock;
+ pj_sockaddr_in local_addr;
+ pj_ioqueue_key_t *key;
+ pj_sockaddr_in server;
+ pj_sockaddr_in *cur_server;
+ pj_stun_session *stun_sess;
+ enum state state;
+
+ pj_ioqueue_op_key_t read_op, write_op;
+ pj_uint8_t rx_pkt[PJ_STUN_MAX_PKT_LEN];
+ pj_ssize_t rx_pkt_len;
+ pj_sockaddr_in src_addr;
+ int src_addr_len;
+
+ pj_bool_t test1_same_ip;
+ pj_sockaddr_in test1_ma; /* MAPPED-ADDRESS */
+ pj_sockaddr_in test1_ca; /* CHANGED-ADDRESS */
+
+} nat_detect_session;
+
+
+static void on_read_complete(pj_ioqueue_key_t *key,
+ pj_ioqueue_op_key_t *op_key,
+ pj_ssize_t bytes_read);
+static void on_request_complete(pj_stun_session *sess,
+ pj_status_t status,
+ pj_stun_tx_data *tdata,
+ const pj_stun_msg *response,
+ const pj_sockaddr_t *src_addr,
+ unsigned src_addr_len);
+static pj_status_t on_send_msg(pj_stun_session *sess,
+ const void *pkt,
+ pj_size_t pkt_size,
+ const pj_sockaddr_t *dst_addr,
+ unsigned addr_len);
+
+static pj_status_t start_test(nat_detect_session *sess,
+ enum state state,
+ const pj_sockaddr_in *alt_addr,
+ pj_uint32_t change_flag);
+static void on_timer_destroy(pj_timer_heap_t *th,
+ pj_timer_entry *te);
+static void sess_destroy(nat_detect_session *sess);
+
+static pj_status_t get_local_interface(const pj_sockaddr_in *server,
+ pj_in_addr *local_addr)
+{
+ pj_sock_t sock;
+ pj_sockaddr_in tmp;
+ int addr_len;
+ pj_status_t status;
+
+ status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ status = pj_sock_bind_in(sock, 0, 0);
+ if (status != PJ_SUCCESS) {
+ pj_sock_close(sock);
+ return status;
+ }
+
+ status = pj_sock_connect(sock, server, sizeof(pj_sockaddr_in));
+ if (status != PJ_SUCCESS) {
+ pj_sock_close(sock);
+ return status;
+ }
+
+ addr_len = sizeof(pj_sockaddr_in);
+ status = pj_sock_getsockname(sock, &tmp, &addr_len);
+ if (status != PJ_SUCCESS) {
+ pj_sock_close(sock);
+ return status;
+ }
+
+ local_addr->s_addr = tmp.sin_addr.s_addr;
+
+ pj_sock_close(sock);
+ return PJ_SUCCESS;
+}
+
+
+PJ_DEF(pj_status_t) pj_stun_detect_nat_type(const pj_sockaddr_in *server,
+ pj_stun_config *stun_cfg,
+ void *user_data,
+ pj_stun_nat_detect_cb *cb)
+{
+ pj_pool_t *pool;
+ nat_detect_session *sess;
+ pj_stun_session_cb sess_cb;
+ pj_ioqueue_callback ioqueue_cb;
+ int addr_len;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(server && stun_cfg, PJ_EINVAL);
+ PJ_ASSERT_RETURN(stun_cfg->pf && stun_cfg->ioqueue && stun_cfg->timer_heap,
+ PJ_EINVAL);
+
+ /*
+ * Init NAT detection session.
+ */
+ pool = pj_pool_create(stun_cfg->pf, "natck%p", 512, 512, NULL);
+ if (!pool)
+ return PJ_ENOMEM;
+
+ sess = PJ_POOL_ZALLOC_T(pool, nat_detect_session);
+ sess->pool = pool;
+ sess->user_data = user_data;
+ sess->cb = cb;
+
+ status = pj_mutex_create_recursive(pool, pool->obj_name, &sess->mutex);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ pj_memcpy(&sess->server, server, sizeof(pj_sockaddr_in));
+
+ /*
+ * Init timer to self-destroy.
+ */
+ sess->timer_heap = stun_cfg->timer_heap;
+ sess->destroy_timer.cb = &on_timer_destroy;
+ sess->destroy_timer.user_data = sess;
+
+
+ /*
+ * Initialize socket.
+ */
+ status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sess->sock);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ /*
+ * Bind to any.
+ */
+ pj_bzero(&sess->local_addr, sizeof(pj_sockaddr_in));
+ sess->local_addr.sin_family = PJ_AF_INET;
+ status = pj_sock_bind(sess->sock, &sess->local_addr,
+ sizeof(pj_sockaddr_in));
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ /*
+ * Get local/bound address.
+ */
+ addr_len = sizeof(sess->local_addr);
+ status = pj_sock_getsockname(sess->sock, &sess->local_addr, &addr_len);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ /*
+ * Find out which interface is used to send to the server.
+ */
+ status = get_local_interface(server, &sess->local_addr.sin_addr);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ PJ_LOG(5,(sess->pool->obj_name, "Local address is %s:%d",
+ pj_inet_ntoa(sess->local_addr.sin_addr),
+ pj_ntohs(sess->local_addr.sin_port)));
+
+ /*
+ * Register socket to ioqueue to receive asynchronous input
+ * notification.
+ */
+ pj_bzero(&ioqueue_cb, sizeof(ioqueue_cb));
+ ioqueue_cb.on_read_complete = &on_read_complete;
+
+ status = pj_ioqueue_register_sock(sess->pool, stun_cfg->ioqueue,
+ sess->sock, sess, &ioqueue_cb,
+ &sess->key);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ /*
+ * Create STUN session.
+ */
+ pj_bzero(&sess_cb, sizeof(sess_cb));
+ sess_cb.on_request_complete = &on_request_complete;
+ sess_cb.on_send_msg = &on_send_msg;
+ status = pj_stun_session_create(stun_cfg, pool->obj_name, &sess_cb,
+ PJ_FALSE, &sess->stun_sess);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ pj_stun_session_set_user_data(sess->stun_sess, sess);
+
+ /*
+ * Kick-off ioqueue reading.
+ */
+ pj_ioqueue_op_key_init(&sess->read_op, sizeof(sess->read_op));
+ pj_ioqueue_op_key_init(&sess->write_op, sizeof(sess->write_op));
+ on_read_complete(sess->key, &sess->read_op, 0);
+
+ /*
+ * Start TEST_1
+ */
+ PJ_LOG(5,(sess->pool->obj_name, "Server set to %s:%d",
+ pj_inet_ntoa(server->sin_addr),
+ pj_ntohs(server->sin_port)));
+
+ status = start_test(sess, ST_TEST_1, NULL, 0);
+ if (status != PJ_SUCCESS)
+ goto on_error;
+
+ return PJ_SUCCESS;
+
+on_error:
+ sess_destroy(sess);
+ return status;
+}
+
+
+static void sess_destroy(nat_detect_session *sess)
+{
+ if (sess->stun_sess) {
+ pj_stun_session_destroy(sess->stun_sess);
+ }
+
+ if (sess->key) {
+ pj_ioqueue_unregister(sess->key);
+ } else if (sess->sock && sess->sock != PJ_INVALID_SOCKET) {
+ pj_sock_close(sess->sock);
+ }
+
+ if (sess->mutex) {
+ pj_mutex_destroy(sess->mutex);
+ }
+
+ if (sess->pool) {
+ pj_pool_release(sess->pool);
+ }
+}
+
+
+static pj_status_t start_test(nat_detect_session *sess,
+ enum state state,
+ const pj_sockaddr_in *alt_addr,
+ pj_uint32_t change_flag)
+{
+ pj_stun_tx_data *tdata;
+ pj_status_t status;
+
+ /* Create BIND request */
+ status = pj_stun_session_create_req(sess->stun_sess,
+ PJ_STUN_BINDING_REQUEST,
+ NULL, &tdata);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ /* Add CHANGE-REQUEST attribute if necessary */
+ if (change_flag) {
+ status = pj_stun_msg_add_uint_attr(sess->pool, tdata->msg,
+ PJ_STUN_ATTR_CHANGE_REQUEST,
+ change_flag);
+ if (status != PJ_SUCCESS)
+ return status;
+ }
+
+ /* Configure alternate address */
+ if (alt_addr)
+ sess->cur_server = (pj_sockaddr_in*) alt_addr;
+ else
+ sess->cur_server = &sess->server;
+
+ /* Send the request */
+ status = pj_stun_session_send_msg(sess->stun_sess, PJ_TRUE,
+ sess->cur_server,
+ sizeof(pj_sockaddr_in),
+ tdata);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ sess->state = state;
+
+ return PJ_SUCCESS;
+}
+
+
+static void end_session(nat_detect_session *sess,
+ pj_status_t status,
+ pj_stun_nat_type nat_type)
+{
+ pj_stun_nat_detect_result result;
+ char errmsg[PJ_ERR_MSG_SIZE];
+ pj_time_val delay;
+
+ pj_bzero(&result, sizeof(result));
+ errmsg[0] = '\0';
+ result.status_text = errmsg;
+
+ result.status = status;
+ pj_strerror(status, errmsg, sizeof(errmsg));
+ result.nat_type = nat_type;
+ result.nat_type_name = nat_type_names[result.nat_type];
+
+ if (sess->cb)
+ (*sess->cb)(sess->user_data, &result);
+
+ delay.sec = 0;
+ delay.msec = 0;
+
+ pj_timer_heap_schedule(sess->timer_heap, &sess->destroy_timer, &delay);
+}
+
+
+/*
+ * Callback upon receiving packet from network.
+ */
+static void on_read_complete(pj_ioqueue_key_t *key,
+ pj_ioqueue_op_key_t *op_key,
+ pj_ssize_t bytes_read)
+{
+ nat_detect_session *sess;
+ pj_status_t status;
+
+ sess = (nat_detect_session *) pj_ioqueue_get_user_data(key);
+ pj_assert(sess != NULL);
+
+ pj_mutex_lock(sess->mutex);
+
+ if (bytes_read < 0) {
+ if (-bytes_read != PJ_STATUS_FROM_OS(OSERR_EWOULDBLOCK) &&
+ -bytes_read != PJ_STATUS_FROM_OS(OSERR_EINPROGRESS) &&
+ -bytes_read != PJ_STATUS_FROM_OS(OSERR_ECONNRESET))
+ {
+ /* Permanent error */
+ end_session(sess, -bytes_read, PJ_STUN_NAT_TYPE_UNKNOWN);
+ goto on_return;
+ }
+
+ } else if (bytes_read > 0) {
+ pj_stun_session_on_rx_pkt(sess->stun_sess, sess->rx_pkt, bytes_read,
+ PJ_STUN_IS_DATAGRAM|PJ_STUN_CHECK_PACKET,
+ NULL, &sess->src_addr, sess->src_addr_len);
+ }
+
+
+ sess->rx_pkt_len = sizeof(sess->rx_pkt);
+ sess->src_addr_len = sizeof(sess->src_addr);
+ status = pj_ioqueue_recvfrom(key, op_key, sess->rx_pkt, &sess->rx_pkt_len,
+ PJ_IOQUEUE_ALWAYS_ASYNC,
+ &sess->src_addr, &sess->src_addr_len);
+
+ if (status != PJ_EPENDING) {
+ pj_assert(status != PJ_SUCCESS);
+ end_session(sess, status, PJ_STUN_NAT_TYPE_UNKNOWN);
+ }
+
+on_return:
+ pj_mutex_unlock(sess->mutex);
+}
+
+
+/*
+ * Callback to send outgoing packet from STUN session.
+ */
+static pj_status_t on_send_msg(pj_stun_session *stun_sess,
+ const void *pkt,
+ pj_size_t pkt_size,
+ const pj_sockaddr_t *dst_addr,
+ unsigned addr_len)
+{
+ nat_detect_session *sess;
+ pj_ssize_t pkt_len;
+
+ sess = (nat_detect_session*) pj_stun_session_get_user_data(stun_sess);
+
+ pkt_len = pkt_size;
+ return pj_ioqueue_sendto(sess->key, &sess->write_op, pkt, &pkt_len, 0,
+ dst_addr, addr_len);
+
+}
+
+/*
+ * Callback upon request completion.
+ */
+static void on_request_complete(pj_stun_session *stun_sess,
+ pj_status_t status,
+ pj_stun_tx_data *tdata,
+ const pj_stun_msg *response,
+ const pj_sockaddr_t *src_addr,
+ unsigned src_addr_len)
+{
+ nat_detect_session *sess;
+ pj_stun_sockaddr_attr *mattr = NULL;
+
+ PJ_UNUSED_ARG(tdata);
+ PJ_UNUSED_ARG(src_addr);
+ PJ_UNUSED_ARG(src_addr_len);
+
+ sess = (nat_detect_session*) pj_stun_session_get_user_data(stun_sess);
+
+ pj_mutex_lock(sess->mutex);
+
+ /* Find errors in the response */
+ if (status == PJ_SUCCESS) {
+
+ /* Check error message */
+ if (PJ_STUN_IS_ERROR_RESPONSE(response->hdr.type)) {
+ pj_stun_errcode_attr *eattr;
+ int err_code;
+
+ eattr = (pj_stun_errcode_attr*)
+ pj_stun_msg_find_attr(response, PJ_STUN_ATTR_ERROR_CODE, 0);
+
+ if (eattr != NULL)
+ err_code = eattr->err_code;
+ else
+ err_code = PJ_STUN_SC_SERVER_ERROR;
+
+ status = PJ_STATUS_FROM_STUN_CODE(err_code);
+
+
+ } else {
+
+ /* Get MAPPED-ADDRESS or XOR-MAPPED-ADDRESS */
+ mattr = (pj_stun_sockaddr_attr*)
+ pj_stun_msg_find_attr(response, PJ_STUN_ATTR_XOR_MAPPED_ADDR, 0);
+ if (mattr == NULL) {
+ mattr = (pj_stun_sockaddr_attr*)
+ pj_stun_msg_find_attr(response, PJ_STUN_ATTR_MAPPED_ADDR, 0);
+ }
+
+ if (mattr == NULL) {
+ status = PJNATH_ESTUNNOMAPPEDADDR;
+ }
+ }
+ }
+
+ /* Handle the test result according to RFC 3489 page 22:
+
+
+ +--------+
+ | Test |
+ | 1 |
+ +--------+
+ |
+ |
+ V
+ /\ /\
+ N / \ Y / \ Y +--------+
+ UDP <-------/Resp\--------->/ IP \------------->| Test |
+ Blocked \ ? / \Same/ | 2 |
+ \ / \? / +--------+
+ \/ \/ |
+ | N |
+ | V
+ V /\
+ +--------+ Sym. N / \
+ | Test | UDP <---/Resp\
+ | 2 | Firewall \ ? /
+ +--------+ \ /
+ | \/
+ V |Y
+ /\ /\ |
+ Symmetric N / \ +--------+ N / \ V
+ NAT <--- / IP \<-----| Test |<--- /Resp\ Open
+ \Same/ | 1B | \ ? / Internet
+ \? / +--------+ \ /
+ \/ \/
+ | |Y
+ | |
+ | V
+ | Full
+ | Cone
+ V /\
+ +--------+ / \ Y
+ | Test |------>/Resp\---->Restricted
+ | 3 | \ ? /
+ +--------+ \ /
+ \/
+ |N
+ | Port
+ +------>Restricted
+
+ Figure 2: Flow for type discovery process
+ */
+
+ switch (sess->state) {
+ case ST_TEST_1:
+ if (status == PJ_SUCCESS) {
+ pj_stun_changed_addr_attr *ca;
+
+ /* Get CHANGED-ADDRESS attribute */
+ ca = (pj_stun_changed_addr_attr*)
+ pj_stun_msg_find_attr(response, PJ_STUN_ATTR_CHANGED_ADDR, 0);
+
+ if (ca) {
+ pj_memcpy(&sess->test1_ca, &ca->sockaddr,
+ sizeof(pj_sockaddr_in));
+ }
+
+ /* Save mapped address */
+ pj_memcpy(&sess->test1_ma, &mattr->sockaddr,
+ sizeof(pj_sockaddr_in));
+
+ /* Compare mapped address with local address */
+ sess->test1_same_ip = (pj_memcmp(&sess->local_addr, &mattr->sockaddr,
+ sizeof(pj_sockaddr_in))==0);
+
+ /* Execute test 2:
+ * Send BINDING_REQUEST with both the "change IP" and "change port"
+ * flags from the CHANGE-REQUEST attribute set
+ */
+ start_test(sess, ST_TEST_2, NULL, CHANGE_ADDR_PORT);
+
+ } else {
+ /* Test 1 has completed with error.
+ * Terminate our test session.
+ */
+ if (status == PJNATH_ESTUNTIMEDOUT)
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_BLOCKED);
+ else
+ end_session(sess, status, PJ_STUN_NAT_TYPE_UNKNOWN);
+ }
+ break;
+
+ case ST_TEST_2:
+ if (sess->test1_same_ip) {
+ if (status == PJ_SUCCESS) {
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_OPEN);
+ } else if (status == PJNATH_ESTUNTIMEDOUT) {
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_SYMMETRIC_UDP);
+ } else {
+ end_session(sess, status, PJ_STUN_NAT_TYPE_UNKNOWN);
+ }
+ } else {
+ if (status == PJ_SUCCESS) {
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_FULL_CONE);
+ } else if (status == PJNATH_ESTUNTIMEDOUT) {
+ if (sess->test1_ca.sin_family == 0) {
+ PJ_LOG(4,(sess->pool->obj_name,
+ "CHANGED-ADDRESS attribute not present in "
+ "Binding response, unable to continue test"));
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_UNKNOWN);
+ } else {
+ /* Execute TEST_1B */
+ start_test(sess, ST_TEST_1B, &sess->test1_ca, 0);
+ }
+ } else {
+ end_session(sess, status, PJ_STUN_NAT_TYPE_UNKNOWN);
+ }
+ }
+ break;
+
+ case ST_TEST_1B:
+ if (status == PJ_SUCCESS) {
+ int cmp;
+
+ /* Compare MAPPED-ADDRESS with the one from TEST_1 */
+ cmp = pj_memcmp(&mattr->sockaddr, &sess->test1_ma,
+ sizeof(pj_sockaddr_in));
+
+ if (cmp!=0) {
+ /* Different address, this is symmetric NAT */
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_SYMMETRIC);
+ } else {
+ /* Same address. Check if this is port restricted.
+ * Execute TEST_3
+ */
+ start_test(sess, ST_TEST_3, NULL, CHANGE_PORT);
+ }
+ } else {
+ end_session(sess, status, PJ_STUN_NAT_TYPE_UNKNOWN);
+ }
+ break;
+
+ case ST_TEST_3:
+ if (status == PJ_SUCCESS) {
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_RESTRICTED);
+ } else if (status == PJNATH_ESTUNTIMEDOUT) {
+ end_session(sess, PJ_SUCCESS, PJ_STUN_NAT_TYPE_PORT_RESTRICTED);
+ } else {
+ end_session(sess, status, PJ_STUN_NAT_TYPE_UNKNOWN);
+ }
+ break;
+ }
+
+ pj_mutex_unlock(sess->mutex);
+}
+
+
+static void on_timer_destroy(pj_timer_heap_t *th,
+ pj_timer_entry *te)
+{
+ nat_detect_session *sess;
+
+ PJ_UNUSED_ARG(th);
+
+ sess = (nat_detect_session*) te->user_data;
+
+ pj_mutex_lock(sess->mutex);
+ pj_ioqueue_unregister(sess->key);
+ sess->key = NULL;
+ pj_mutex_unlock(sess->mutex);
+
+ sess_destroy(sess);
+}
diff --git a/pjnath/src/pjstun-client/client_main.c b/pjnath/src/pjstun-client/client_main.c
index 578a582d..ac828925 100644
--- a/pjnath/src/pjstun-client/client_main.c
+++ b/pjnath/src/pjstun-client/client_main.c
@@ -49,6 +49,8 @@ static struct global
pj_sockaddr_in relay_addr;
char data_buf[256];
char *data;
+ pj_bool_t detect;
+ pj_status_t detect_result;
} g;
static struct options
@@ -152,6 +154,7 @@ static int worker_thread(void *unused)
int n;
pj_timer_heap_poll(g.th, NULL);
+ pj_ioqueue_poll(g.stun_config.ioqueue, &timeout);
PJ_FD_ZERO(&readset);
PJ_FD_SET(g.sock, &readset);
@@ -330,6 +333,10 @@ static int init()
return -1;
}
+ status = pj_ioqueue_create(g.pool, 16, &g.stun_config.ioqueue);
+ if (status != PJ_SUCCESS)
+ return status;
+
status = pj_thread_create(g.pool, "stun", &worker_thread, NULL,
0, 0, &g.thread);
if (status != PJ_SUCCESS)
@@ -587,9 +594,42 @@ static void set_peer_addr(void)
}
+
+static void nat_detect_cb(void *user_data,
+ const pj_stun_nat_detect_result *res)
+{
+ g.detect_result = res->status;
+
+ if (res->status == PJ_SUCCESS) {
+ PJ_LOG(3,(THIS_FILE, "NAT successfully detected as %s", res->nat_type_name));
+ } else {
+ PJ_LOG(2,(THIS_FILE, "Error detecting NAT type: %s", res->status_text));
+ }
+}
+
+static pj_status_t perform_detection()
+{
+ pj_status_t status;
+
+ g.detect_result = PJ_EPENDING;
+ status = pj_stun_detect_nat_type(&g.srv_addr, &g.stun_config, NULL,
+ &nat_detect_cb);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ while (g.detect_result == PJ_EPENDING)
+ pj_thread_sleep(100);
+
+ status = g.detect_result;
+
+ return status;
+}
+
+
static void menu(void)
{
puts("Menu:");
+ puts(" d Perform NAT detection");
printf(" pr Set peer address (currently %s:%d)\n",
pj_inet_ntoa(g.peer_addr.sin_addr), pj_ntohs(g.peer_addr.sin_port));
printf(" dt Set data (currently \"%s\")\n", g.data);
@@ -616,7 +656,9 @@ static void console_main(void)
fgets(input, sizeof(input), stdin);
- if (0) {
+ if (input[0] == 'd' && (input[1]=='\r' || input[1]=='\n')) {
+
+ perform_detection();
} else if (input[0]=='d' && input[1]=='t') {
printf("Input data: ");
@@ -663,6 +705,7 @@ static void usage(void)
puts("where TARGET is \"host[:port]\"");
puts("");
puts("and OPTIONS:");
+ puts(" --detect, -d Perform NAT type detection first");
puts(" --realm, -r Set realm of the credential");
puts(" --username, -u Set username of the credential");
puts(" --password, -p Set password of the credential");
@@ -676,6 +719,7 @@ static void usage(void)
int main(int argc, char *argv[])
{
struct pj_getopt_option long_options[] = {
+ { "detect", 0, 0, 'd'},
{ "realm", 1, 0, 'r'},
{ "username", 1, 0, 'u'},
{ "password", 1, 0, 'p'},
@@ -692,8 +736,11 @@ int main(int argc, char *argv[])
g.data = g.data_buf;
pj_ansi_strcpy(g.data, "Hello world");
- while((c=pj_getopt_long(argc,argv, "r:u:p:N:hF", long_options, &opt_id))!=-1) {
+ while((c=pj_getopt_long(argc,argv, "r:u:p:N:dhF", long_options, &opt_id))!=-1) {
switch (c) {
+ case 'd':
+ g.detect = PJ_TRUE;
+ break;
case 'r':
o.realm = pj_optarg;
break;
@@ -743,6 +790,12 @@ int main(int argc, char *argv[])
if (status != PJ_SUCCESS)
goto on_return;
+ if (g.detect) {
+ status = perform_detection();
+ if (status != PJ_SUCCESS)
+ goto on_return;
+ }
+
console_main();
on_return: