1 // Copyright (c) 2002-2008, Software Development Laboratories, "Fish" (David B. Trout)
2 /////////////////////////////////////////////////////////////////////////////////////////
3 //
4 //  TT32API.h  --  TunTap32 DLL exported functions interface
5 //
6 /////////////////////////////////////////////////////////////////////////////////////////
7 //
8 //                        T U N T A P 3 2 . D L L
9 //
10 //                     EXPORTED FUNCTION DEFINITIONS
11 //
12 //    These functions provide a 'C' language interface and can be called from
13 //    any type of app that can access a DLL: VB, C/C++, PowerBuilder, etc.
14 //
15 /////////////////////////////////////////////////////////////////////////////////////////
16 //
17 //  Change History:
18 //
19 //  12/22/01    1.0.0   Created.
20 //  07/20/02    2.0.0   JAP: LCS modifications/enhancements.
21 //  07/02/03    2.0.2   use std 'uint32_t' type instead of Win32 DWORD
22 //  06/16/04    2.1.0   'ex' variant functions to pass errno value.
23 //  11/01/03    3.1.0   TT32MINMTU, TT32MAXMTU, TT32DEFMTU
24 //  11/03/03    3.1.0   TT32_MAX_MULTICAST_LIST_ENTRIES
25 //  12/31/03    3.1.0   support for deprecated functions dropped/deleted.
26 //  02/05/06    3.1.0   New exported function: 'tuntap32_build_herc_iface_mac'
27 //  02/14/06    3.1.0   Added #defines for TUNTAP32_DLLNAME
28 //  04/14/06    3.1.0   Added 'tuntap32_calc_checksum' function
29 //  07/02/06    3.1.2   Added #defines for min/max/def buffer sizes
30 //  08/09/06    3.1.6   Added 'tuntap32_calc_checksum' function
31 //  mm/dd/07    3.2.0   VS2005 + x64 + WinPCap 4.0
32 //  11/06/08    3.3.0   VS2008 + auto-link pragma.
33 //  11/06/08    3.3.0   Additional counters...
34 //
35 //////////////////////////////////////////////////////////////////////////////////////////
36 
37 #ifndef _TT32API_H_
38 #define _TT32API_H_
39 
40 /////////////////////////////////////////////////////////////////////////////////////////
41 //                            TunTap32.dll name
42 /////////////////////////////////////////////////////////////////////////////////////////
43 
44 #if defined(_WIN64)
45   #if defined(_UNICODE) || defined(UNICODE)
46     #if defined(_DEBUG) || defined(DEBUG)
47       #define  BASE_TUNTAP32_NAME  "TunTap64UD"
48     #else
49       #define  BASE_TUNTAP32_NAME  "TunTap64U"
50     #endif
51   #else
52     #if defined(_DEBUG) || defined(DEBUG)
53       #define  BASE_TUNTAP32_NAME  "TunTap64D"
54     #else
55       #define  BASE_TUNTAP32_NAME  "TunTap64"
56     #endif
57   #endif
58 #else
59   #if defined(_UNICODE) || defined(UNICODE)
60     #if defined(_DEBUG) || defined(DEBUG)
61       #define  BASE_TUNTAP32_NAME  "TunTap32UD"
62     #else
63       #define  BASE_TUNTAP32_NAME  "TunTap32U"
64     #endif
65   #else
66     #if defined(_DEBUG) || defined(DEBUG)
67       #define  BASE_TUNTAP32_NAME  "TunTap32D"
68     #else
69       #define  BASE_TUNTAP32_NAME  "TunTap32"
70     #endif
71   #endif
72 #endif
73 
74 #if defined( _MSC_VER ) && defined( AUTOLINK_TUNTAP32_LIB )
75   #pragma comment ( lib, BASE_TUNTAP32_NAME ".lib" )
76 #endif
77 #define TUNTAP32_DLLNAME  BASE_TUNTAP32_NAME ".dll"
78 
79 /////////////////////////////////////////////////////////////////////////////////////////
80 //                   TunTap32 structures, #defines and typedefs, etc...
81 /////////////////////////////////////////////////////////////////////////////////////////
82 
83 #ifdef __cplusplus
84 extern "C"
85 {
86 #endif
87 
88 #define TT32MINMTU   (     60)       // minimum MTU value
89 #define TT32DEFMTU   (   1500)       // default MTU value
90 #define TT32MAXMTU  ((64*1024)-14)   // maximum MTU value  (14 == eth_hdr_size)
91 
92 #define TT32_MAX_MULTICAST_LIST_ENTRIES  (32)
93 
94 #define TT32SDEVBUFF    _IOW('T', 220, int)
95 #define TT32GDEVBUFF    _IOR('T', 220, int)
96 #define TT32SIOBUFF     _IOW('T', 221, int)
97 #define TT32GIOBUFF     _IOR('T', 221, int)
98 #define TT32STIMEOUT    _IOW('T', 222, int)
99 #define TT32GTIMEOUT    _IOR('T', 222, int)
100 #define TT32GSTATS      _IOR('T', 223, int)
101 
102 struct tt32ctl
103 {
104     union
105     {
106         char    ctln_name[IFNAMSIZ];    // iface name (e.g. "tun0")
107     } tt32_ctln;
108 
109     union
110     {
111         int     ctlu_devbuffsize;       // Kernel buffer size
112         int     ctlu_iobuffsize;        // Read buffer size
113         int     ctlu_readtimeout;       // Read timeout value
114     } tt32_ctlu;
115 };
116 
117 #define tt32ctl_name         tt32_ctln.ctln_name
118 #define tt32ctl_devbuffsize  tt32_ctlu.ctlu_devbuffsize
119 #define tt32ctl_iobuffsize   tt32_ctlu.ctlu_iobuffsize
120 #define tt32ctl_readtimeout  tt32_ctlu.ctlu_readtimeout
121 
122 // WinPCap device driver capture buffer sizes
123 
124 #define MIN_CAPTURE_BUFFSIZE  (64*1024)      // minimum = 64K
125 #define DEF_CAPTURE_BUFFSIZE  (1*1024*1024)  // default =  1M
126 #define MAX_CAPTURE_BUFFSIZE  (16*1024*1024) // maximum = 16M
127 
128 // FishPack I/O buffer sizes
129 
130 #define MIN_PACKET_BUFFSIZE   (16*1024)      // minimum =  16K
131 #define DEF_PACKET_BUFFSIZE   (1*64*1024)    // default =  64K
132 #define MAX_PACKET_BUFFSIZE   (1024*1024)    // maximum =   1M
133 
134 typedef struct TT32STATS
135 {
136     uint32_t  dwStructSize;             // size of this structure
137     uint32_t  dwKernelBuffSize;         // size of kernel capture buffer
138     uint32_t  dwReadBuffSize;           // size of dll I/O buffer
139     uint32_t  dwMaxBytesReceived;       // max dll I/O bytes received
140 
141     int64_t  n64WriteCalls;             // total #of write requests
142     int64_t  n64WriteIOs;               // total #of write I/Os
143 
144     int64_t  n64ReadCalls;              // total #of read requests
145     int64_t  n64ReadIOs;                // total #of read I/Os
146 
147     int64_t  n64PacketsRead;            // total #of packets read
148     int64_t  n64PacketsWritten;         // total #of packets written
149 
150     int64_t  n64BytesRead;              // total #of bytes read
151     int64_t  n64BytesWritten;           // total #of bytes written
152 
153     int64_t  n64InternalPackets;        // total #of packets handled internally
154     int64_t  n64IgnoredPackets;         // total #of packets ignored
155 
156     // New version 3.3 counters...
157 
158     int64_t  n64OwnPacketsIgnored;      // total #of packets read with our source MAC
159     int64_t  n64ZeroMACPacketsRead;     // total #of packets read with dest MAC all zeros
160     int64_t  n64ZeroMACPacketsWritten;  // total #of packets written with dest MAC all zeros
161 }
162 TT32STATS, *PTT32STATS;
163 
164 
165 #ifndef EXPORT
166 #define EXPORT   // we must be importing instead of exporting)
167 #endif
168 
169 /////////////////////////////////////////////////////////////////////////////////////////
170 //                   TunTap32.dll exported functions...
171 /////////////////////////////////////////////////////////////////////////////////////////
172 
173 typedef void (__cdecl *ptr_to_print_debug_string_func)(const char* debug_string);
174 
175 extern const char* WINAPI EXPORT tuntap32_copyright_string         ();
176 extern const char* WINAPI EXPORT tuntap32_version_string           ();
177 extern void        WINAPI EXPORT tuntap32_version_numbers          (int* major, int* inter, int* minor, int* build);
178 extern int         WINAPI EXPORT tuntap32_set_debug_output_func    (ptr_to_print_debug_string_func pfn);
179 extern int         WINAPI EXPORT tuntap32_open                     (char* gatewaydev, int flags);
180 extern int         WINAPI EXPORT tuntap32_write                    (int fd, u_char* buffer, u_long len);
181 extern int         WINAPI EXPORT tuntap32_read                     (int fd, u_char* buffer, u_long len);
182 extern int         WINAPI EXPORT tuntap32_close                    (int fd);
183 extern int         WINAPI EXPORT tuntap32_ioctl                    (int fd, int request, char* argp);
184 extern int         WINAPI EXPORT tuntap32_get_stats                (int fd, TT32STATS* stats);
185 extern const char* WINAPI EXPORT tuntap32_get_default_iface        ();
186 extern void        WINAPI EXPORT tuntap32_build_herc_iface_mac     (u_char* mac, const u_char* ip);
187 extern u_short     WINAPI EXPORT tuntap32_calc_inet_checksum       (u_char* buffer, u_long bytes);
188 extern u_short     WINAPI EXPORT tuntap32_calc_checksum            (u_char* buffer, u_long bytes);
189 
190 // (functions to work around an as-yet unidentified/unresolved 'errno' bug)
191 
192 extern const char* WINAPI EXPORT tuntap32_copyright_string_ex      (                                                int* eno);
193 extern const char* WINAPI EXPORT tuntap32_version_string_ex        (                                                int* eno);
194 extern void        WINAPI EXPORT tuntap32_version_numbers_ex       (int* major, int* inter, int* minor, int* build, int* eno);
195 extern int         WINAPI EXPORT tuntap32_set_debug_output_func_ex (ptr_to_print_debug_string_func pfn,             int* eno);
196 extern int         WINAPI EXPORT tuntap32_open_ex                  (char* gatewaydev, int flags,                    int* eno);
197 extern int         WINAPI EXPORT tuntap32_write_ex                 (int fd, u_char* buffer, u_long len,             int* eno);
198 extern int         WINAPI EXPORT tuntap32_read_ex                  (int fd, u_char* buffer, u_long len,             int* eno);
199 extern int         WINAPI EXPORT tuntap32_close_ex                 (int fd,                                         int* eno);
200 extern int         WINAPI EXPORT tuntap32_ioctl_ex                 (int fd, int request, char* argp,                int* eno);
201 extern int         WINAPI EXPORT tuntap32_get_stats_ex             (int fd, TT32STATS* stats,                       int* eno);
202 extern const char* WINAPI EXPORT tuntap32_get_default_iface_ex     (                                                int* eno);
203 
204 // (in case they want to use LoadLibrary and GetProcAddress instead)
205 
206 typedef const char* (WINAPI *ptuntap32_copyright_string)           ();
207 typedef const char* (WINAPI *ptuntap32_version_string)             ();
208 typedef void        (WINAPI *ptuntap32_version_numbers)            (int*,int*,int*,int*);
209 typedef int         (WINAPI *ptuntap32_set_debug_output_func)      (ptr_to_print_debug_string_func);
210 typedef int         (WINAPI *ptuntap32_open)                       (char*,int);
211 typedef int         (WINAPI *ptuntap32_write)                      (int,u_char*,u_long);
212 typedef int         (WINAPI *ptuntap32_read)                       (int,u_char*,u_long);
213 typedef int         (WINAPI *ptuntap32_close)                      (int);
214 typedef int         (WINAPI *ptuntap32_ioctl)                      (int,int,char*);
215 typedef int         (WINAPI *ptuntap32_get_stats)                  (int fd, TT32STATS* stats);
216 typedef const char* (WINAPI *ptuntap32_get_default_iface)          ();
217 typedef void        (WINAPI *ptuntap32_build_herc_iface_mac)       (u_char* mac, const u_char* ip);
218 typedef u_short     (WINAPI *ptuntap32_calc_inet_checksum)         (u_char*, u_long);
219 typedef u_short     (WINAPI *ptuntap32_calc_checksum)              (u_char*, u_long);
220 
221 // (functions to work around an as-yet unidentified/unresolved 'errno' bug)
222 
223 typedef const char* (WINAPI *ptuntap32_copyright_string_ex)        (                                                int* eno);
224 typedef const char* (WINAPI *ptuntap32_version_string_ex)          (                                                int* eno);
225 typedef void        (WINAPI *ptuntap32_version_numbers_ex)         (int* major, int* inter, int* minor, int* build, int* eno);
226 typedef int         (WINAPI *ptuntap32_set_debug_output_func_ex)   (ptr_to_print_debug_string_func pfn,             int* eno);
227 typedef int         (WINAPI *ptuntap32_open_ex)                    (char* gatewaydev, int flags,                    int* eno);
228 typedef int         (WINAPI *ptuntap32_write_ex)                   (int fd, u_char* buffer, u_long len,             int* eno);
229 typedef int         (WINAPI *ptuntap32_read_ex)                    (int fd, u_char* buffer, u_long len,             int* eno);
230 typedef int         (WINAPI *ptuntap32_close_ex)                   (int fd,                                         int* eno);
231 typedef int         (WINAPI *ptuntap32_ioctl_ex)                   (int fd, int request, char* argp,                int* eno);
232 typedef int         (WINAPI *ptuntap32_get_stats_ex)               (int fd, TT32STATS* stats,                       int* eno);
233 typedef const char* (WINAPI *ptuntap32_get_default_iface_ex)       (                                                int* eno);
234 
235 /////////////////////////////////////////////////////////////////////////////////////////
236 
237 #ifdef __cplusplus
238 }
239 #endif
240 
241 #endif /* _TT32API_H_ */
242 
243 /////////////////////////////////////////////////////////////////////////////////////////
244