1 /* TUNTAP.H     (c) Copyright James A. Pierson, 2002-2009            */
2 /*              (c) Copyright "Fish" (David B. Trout), 2002-2009     */
3 /*              Hercules - TUN/TAP Abstraction Layer                 */
4 
5 #ifndef __TUNTAP_H_
6 #define __TUNTAP_H_
7 
8 #include "hercules.h"
9 
10 #if defined( HAVE_STRUCT_SOCKADDR_IN_SIN_LEN )
11   #define set_sockaddr_in_sin_len( sockaddr_in_ptr ) \
12     (sockaddr_in_ptr)->sin_len = sizeof( struct sockaddr_in )
13 #else
14   #define set_sockaddr_in_sin_len( sockaddr_in_ptr )
15 #endif
16 
17 // ====================================================================
18 // Declarations
19 // ====================================================================
20 
21 //
22 // Create TUN/TAP Interface
23 //
24 
25 extern int      TUNTAP_CreateInterface  ( char*   pszTUNDevice,
26                                           int     iFlags,
27                                           int*    pfd,
28                                           char*   pszNetDevName );
29 
30 //
31 // Configure TUN/TAP Interface
32 //
33 
34 #ifdef   OPTION_TUNTAP_CLRIPADDR
35 extern int      TUNTAP_ClrIPAddr        ( char*   pszNetDevName );
36 #endif
37 extern int      TUNTAP_SetIPAddr        ( char*   pszNetDevName,
38                                           char*   pszIPAddr );
39 extern int      TUNTAP_SetDestAddr      ( char*   pszNetDevName,
40                                           char*   pszDestAddr );
41 
42 #ifdef OPTION_TUNTAP_SETNETMASK
43 extern int      TUNTAP_SetNetMask       ( char*   pszNetDevName,
44                                           char*   pszNetMask );
45 #endif
46 
47 extern int      TUNTAP_SetMTU           ( char*   pszNetDevName,
48                                           char*   pszMTU );
49 #ifdef OPTION_TUNTAP_SETMACADDR
50 extern int      TUNTAP_SetMACAddr       ( char*   pszNetDevName,
51                                           char*   pszMACAddr );
52 #endif
53 
54 extern int      TUNTAP_SetFlags         ( char*   pszNetDevName,
55                                           int     iFlags );
56 extern int      TUNTAP_GetFlags         ( char*   pszNetDevName,
57                                           int*    piFlags );
58 
59 #ifdef OPTION_TUNTAP_DELADD_ROUTES
60 extern int      TUNTAP_AddRoute         ( char*   pszNetDevName,
61                                           char*   pszDestAddr,
62                                           char*   pszNetMask,
63                                           char*   pszGWAddr,
64                                           int     iFlags );
65 extern int      TUNTAP_DelRoute         ( char*   pszNetDevName,
66                                           char*   pszDestAddr,
67                                           char*   pszNetMask,
68                                           char*   pszGWAddr,
69                                           int     iFlags );
70 #endif
71 
72 // (the following function used by Win32 *and* NON-Win32 platforms)
73 extern void build_herc_iface_mac ( BYTE* out_mac, const BYTE* in_ip );
74 
75 //
76 // Helper Macros
77 //
78 
79 #if defined( WIN32 )
80   #define TUNTAP_Open     tt32_open
81   #define TUNTAP_Close    tt32_close
82   #define TUNTAP_Read     tt32_read
83   #define TUNTAP_Write    tt32_write
84   #define TUNTAP_IOCtl    tt32_ioctl
85 #else
86   #define TUNTAP_Open     open
87   #define TUNTAP_Close    close
88   #define TUNTAP_Read     read
89   #define TUNTAP_Write    write
90   #define TUNTAP_IOCtl    ioctl
91 #endif // defined( WIN32 )
92 
93 #if defined( WIN32 )
94 
95 // Win32 (MinGW/Cygwin/MSVC) does not have these
96 // so we need to define them ourselves...
97 
98 struct rtentry
99 {
100     unsigned long int   rt_pad1;
101     struct sockaddr     rt_dst;         // Target address.
102     struct sockaddr     rt_gateway;     // Gateway addr (RTF_GATEWAY)
103     struct sockaddr     rt_genmask;     // Target network mask (IP)
104     unsigned short int  rt_flags;
105     short int           rt_pad2;
106     unsigned long int   rt_pad3;
107     unsigned char       rt_tos;
108     unsigned char       rt_class;
109     short int           rt_pad4;
110     short int           rt_metric;      // +1 for binary compatibility!
111     char *              rt_dev;         // Forcing the device at add.
112     unsigned long int   rt_mtu;         // Per route MTU/Window.
113     unsigned long int   rt_window;      // Window clamping.
114     unsigned short int  rt_irtt;        // Initial RTT.
115 };
116 
117 #define RTF_UP          0x0001          /* Route usable.  */
118 #define RTF_GATEWAY     0x0002          /* Destination is a gateway.  */
119 
120 #define RTF_HOST        0x0004          /* Host entry (net otherwise).  */
121 #define RTF_REINSTATE   0x0008          /* Reinstate route after timeout.  */
122 #define RTF_DYNAMIC     0x0010          /* Created dyn. (by redirect).  */
123 #define RTF_MODIFIED    0x0020          /* Modified dyn. (by redirect).  */
124 #define RTF_MTU         0x0040          /* Specific MTU for this route.  */
125 #define RTF_MSS         RTF_MTU         /* Compatibility.  */
126 #define RTF_WINDOW      0x0080          /* Per route window clamping.  */
127 #define RTF_IRTT        0x0100          /* Initial round trip time.  */
128 #define RTF_REJECT      0x0200          /* Reject route.  */
129 #define RTF_STATIC      0x0400          /* Manually injected route.  */
130 #define RTF_XRESOLVE    0x0800          /* External resolver.  */
131 #define RTF_NOFORWARD   0x1000          /* Forwarding inhibited.  */
132 #define RTF_THROW       0x2000          /* Go to next class.  */
133 #define RTF_NOPMTUDISC  0x4000          /* Do not send packets with DF.  */
134 
135 /* for IPv6 */
136 #define RTF_DEFAULT     0x00010000      /* default - learned via ND     */
137 #define RTF_ALLONLINK   0x00020000      /* fallback, no routers on link */
138 #define RTF_ADDRCONF    0x00040000      /* addrconf route - RA          */
139 
140 #define RTF_LINKRT      0x00100000      /* link specific - device match */
141 #define RTF_NONEXTHOP   0x00200000      /* route with no nexthop        */
142 
143 #define RTF_CACHE       0x01000000      /* cache entry                  */
144 #define RTF_FLOW        0x02000000      /* flow significant route       */
145 #define RTF_POLICY      0x04000000      /* policy route                 */
146 
147 #define RTCF_VALVE      0x00200000
148 #define RTCF_MASQ       0x00400000
149 #define RTCF_NAT        0x00800000
150 #define RTCF_DOREDIRECT 0x01000000
151 #define RTCF_LOG        0x02000000
152 #define RTCF_DIRECTSRC  0x04000000
153 
154 #define RTF_LOCAL       0x80000000
155 #define RTF_INTERFACE   0x40000000
156 #define RTF_MULTICAST   0x20000000
157 #define RTF_BROADCAST   0x10000000
158 #define RTF_NAT         0x08000000
159 
160 #define RTF_ADDRCLASSMASK       0xF8000000
161 #define RT_ADDRCLASS(flags)     ((__u_int32_t) flags >> 23)
162 
163 #define RT_TOS(tos)             ((tos) & IPTOS_TOS_MASK)
164 
165 #define RT_LOCALADDR(flags)     ((flags & RTF_ADDRCLASSMASK) \
166                                  == (RTF_LOCAL|RTF_INTERFACE))
167 
168 #define RT_CLASS_UNSPEC         0
169 #define RT_CLASS_DEFAULT        253
170 
171 #define RT_CLASS_MAIN           254
172 #define RT_CLASS_LOCAL          255
173 #define RT_CLASS_MAX            255
174 
175 #define RTMSG_ACK               NLMSG_ACK
176 #define RTMSG_OVERRUN           NLMSG_OVERRUN
177 
178 #define RTMSG_NEWDEVICE         0x11
179 #define RTMSG_DELDEVICE         0x12
180 #define RTMSG_NEWROUTE          0x21
181 #define RTMSG_DELROUTE          0x22
182 #define RTMSG_NEWRULE           0x31
183 #define RTMSG_DELRULE           0x32
184 #define RTMSG_CONTROL           0x40
185 
186 #define RTMSG_AR_FAILED         0x51    /* Address Resolution failed.  */
187 
188 /* Use the definitions from the kernel header files.  */
189 //#include <asm/ioctls.h>
190 
191 // PROGRAMMING NOTE: Cygwin's headers define some (but not all)
192 // of the below values, but we unfortunately MUST use the below
193 // defined values since they're what TunTap32 expects...
194 
195 #undef SIOCGIFCONF      // (discard Cygwin's value to use below instead)
196 #undef SIOCGIFFLAGS     // (discard Cygwin's value to use below instead)
197 #undef SIOCGIFADDR      // (discard Cygwin's value to use below instead)
198 #undef SIOCGIFBRDADDR   // (discard Cygwin's value to use below instead)
199 #undef SIOCGIFNETMASK   // (discard Cygwin's value to use below instead)
200 #undef SIOCGIFMETRIC    // (discard Cygwin's value to use below instead)
201 #undef SIOCGIFMTU       // (discard Cygwin's value to use below instead)
202 #undef SIOCGIFHWADDR    // (discard Cygwin's value to use below instead)
203 
204 /* Routing table calls.  */
205 #define SIOCADDRT       0x890B          /* add routing table entry      */
206 #define SIOCDELRT       0x890C          /* delete routing table entry   */
207 #define SIOCRTMSG       0x890D          /* call to routing system       */
208 
209 /* Socket configuration controls. */
210 #define SIOCGIFNAME     0x8910          /* get iface name               */
211 #define SIOCSIFLINK     0x8911          /* set iface channel            */
212 #define SIOCGIFCONF     0x8912          /* get iface list               */
213 #define SIOCGIFFLAGS    0x8913          /* get flags                    */
214 #define SIOCSIFFLAGS    0x8914          /* set flags                    */
215 #define SIOCGIFADDR     0x8915          /* get PA address               */
216 #define SIOCSIFADDR     0x8916          /* set PA address               */
217 #define SIOCGIFDSTADDR  0x8917          /* get remote PA address        */
218 #define SIOCSIFDSTADDR  0x8918          /* set remote PA address        */
219 #define SIOCGIFBRDADDR  0x8919          /* get broadcast PA address     */
220 #define SIOCSIFBRDADDR  0x891a          /* set broadcast PA address     */
221 #define SIOCGIFNETMASK  0x891b          /* get network PA mask          */
222 #define SIOCSIFNETMASK  0x891c          /* set network PA mask          */
223 #define SIOCGIFMETRIC   0x891d          /* get metric                   */
224 #define SIOCSIFMETRIC   0x891e          /* set metric                   */
225 #define SIOCGIFMEM      0x891f          /* get memory address (BSD)     */
226 #define SIOCSIFMEM      0x8920          /* set memory address (BSD)     */
227 #define SIOCGIFMTU      0x8921          /* get MTU size                 */
228 #define SIOCSIFMTU      0x8922          /* set MTU size                 */
229 #define SIOCSIFHWADDR   0x8924          /* set hardware address         */
230 #define SIOCGIFENCAP    0x8925          /* get/set encapsulations       */
231 #define SIOCSIFENCAP    0x8926
232 #define SIOCGIFHWADDR   0x8927          /* Get hardware address         */
233 #define SIOCGIFSLAVE    0x8929          /* Driver slaving support       */
234 #define SIOCSIFSLAVE    0x8930
235 #define SIOCADDMULTI    0x8931          /* Multicast address lists      */
236 #define SIOCDELMULTI    0x8932
237 #define SIOCGIFINDEX    0x8933          /* name -> if_index mapping     */
238 #define SIOGIFINDEX     SIOCGIFINDEX    /* misprint compatibility :-)   */
239 #define SIOCSIFPFLAGS   0x8934          /* set/get extended flags set   */
240 #define SIOCGIFPFLAGS   0x8935
241 #define SIOCDIFADDR     0x8936          /* delete PA address            */
242 #define SIOCSIFHWBROADCAST      0x8937  /* set hardware broadcast addr  */
243 #define SIOCGIFCOUNT    0x8938          /* get number of devices */
244 
245 #define SIOCGIFBR       0x8940          /* Bridging support             */
246 #define SIOCSIFBR       0x8941          /* Set bridging options         */
247 
248 #define SIOCGIFTXQLEN   0x8942          /* Get the tx queue length      */
249 #define SIOCSIFTXQLEN   0x8943          /* Set the tx queue length      */
250 
251 
252 /* ARP cache control calls. */
253                     /*  0x8950 - 0x8952  * obsolete calls, don't re-use */
254 #define SIOCDARP        0x8953          /* delete ARP table entry       */
255 #define SIOCGARP        0x8954          /* get ARP table entry          */
256 #define SIOCSARP        0x8955          /* set ARP table entry          */
257 
258 /* RARP cache control calls. */
259 #define SIOCDRARP       0x8960          /* delete RARP table entry      */
260 #define SIOCGRARP       0x8961          /* get RARP table entry         */
261 #define SIOCSRARP       0x8962          /* set RARP table entry         */
262 
263 /* Driver configuration calls */
264 
265 #define SIOCGIFMAP      0x8970          /* Get device parameters        */
266 #define SIOCSIFMAP      0x8971          /* Set device parameters        */
267 
268 /* DLCI configuration calls */
269 
270 #define SIOCADDDLCI     0x8980          /* Create new DLCI device       */
271 #define SIOCDELDLCI     0x8981          /* Delete DLCI device           */
272 
273 /* Device private ioctl calls.  */
274 
275 /* These 16 ioctls are available to devices via the do_ioctl() device
276    vector.  Each device should include this file and redefine these
277    names as their own. Because these are device dependent it is a good
278    idea _NOT_ to issue them to random objects and hope.  */
279 
280 #define SIOCDEVPRIVATE          0x89F0  /* to 89FF */
281 
282 /*
283  *      These 16 ioctl calls are protocol private
284  */
285 
286 #define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */
287 
288 #endif // defined( WIN32 )
289 
290 #endif // __TUNTAP_H_
291 
292