⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tun.h

📁 tun虚拟网卡设备源码
💻 H
字号:
/* *  OpenVPN -- An application to securely tunnel IP networks *             over a single TCP/UDP port, with support for SSL/TLS-based *             session authentication and key exchange, *             packet encryption, packet authentication, and *             packet compression. * *  Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License version 2 *  as published by the Free Software Foundation. * *  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 (see the file COPYING included with this *  distribution); if not, write to the Free Software Foundation, Inc., *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef TUN_H#define TUN_H#ifdef WIN32#include <winioctl.h>#include "tap-win32/common.h"#endif#include "buffer.h"#include "error.h"#include "mtu.h"#include "win32.h"#include "event.h"#include "proto.h"#include "misc.h"#ifdef WIN32struct tuntap_options {  /* --ip-win32 options */  bool ip_win32_defined;# define IPW32_SET_MANUAL       0  /* "--ip-win32 manual" */# define IPW32_SET_NETSH        1  /* "--ip-win32 netsh" */# define IPW32_SET_IPAPI        2  /* "--ip-win32 ipapi" */# define IPW32_SET_DHCP_MASQ    3  /* "--ip-win32 dynamic" */# define IPW32_SET_N            4  int ip_win32_type;  /* --ip-win32 dynamic options */  bool dhcp_masq_custom_offset;  int dhcp_masq_offset;  int dhcp_lease_time;  /* --tap-sleep option */  int tap_sleep;  /* --dhcp-option options */  bool dhcp_options;  const char *domain;        /* DOMAIN (15) */  const char *netbios_scope; /* NBS (47) */  int netbios_node_type;     /* NBT 1,2,4,8 (46) */#define N_DHCP_ADDR 4        /* Max # of addresses allowed for			        DNS, WINS, etc. */  /* DNS (6) */  in_addr_t dns[N_DHCP_ADDR];  int dns_len;  /* WINS (44) */  in_addr_t wins[N_DHCP_ADDR];  int wins_len;  /* NTP (42) */  in_addr_t ntp[N_DHCP_ADDR];  int ntp_len;  /* NBDD (45) */  in_addr_t nbdd[N_DHCP_ADDR];  int nbdd_len;  /* DISABLE_NBT (43, Vendor option 001) */  bool disable_nbt;  bool dhcp_renew;  bool dhcp_pre_release;  bool dhcp_release;};#elif TARGET_LINUXstruct tuntap_options {  int txqueuelen;};#elsestruct tuntap_options {  int dummy; /* not used */};#endif/* * Define a TUN/TAP dev. */struct tuntap{# define TUNNEL_TYPE(tt) ((tt) ? ((tt)->type) : DEV_TYPE_UNDEF)  int type; /* DEV_TYPE_x as defined in proto.h */  bool did_ifconfig_setup;  bool did_ifconfig;  bool ipv6;  struct tuntap_options options; /* options set on command line */  char *actual_name; /* actual name of TUN/TAP dev, usually including unit number */  /* number of TX buffers */  int txqueuelen;  /* ifconfig parameters */  in_addr_t local;  in_addr_t remote_netmask;  in_addr_t broadcast;#ifdef WIN32  HANDLE hand;  struct overlapped_io reads;  struct overlapped_io writes;  struct rw_handle rw_handle;  /* used for setting interface address via IP Helper API     or DHCP masquerade */  bool ipapi_context_defined;  ULONG ipapi_context;  ULONG ipapi_instance;  in_addr_t adapter_netmask;  /* Windows adapter index for TAP-Win32 adapter,     ~0 if undefined */  DWORD adapter_index;#else  int fd;   /* file descriptor for TUN/TAP dev */#endif#ifdef TARGET_SOLARIS  int ip_fd;#endif  /* used for printing status info only */  unsigned int rwflags_debug;  /* Some TUN/TAP drivers like to be ioctled for mtu     after open */  int post_open_mtu;};static inline booltuntap_defined (const struct tuntap *tt){#ifdef WIN32  return tt && tt->hand != NULL;#else  return tt && tt->fd >= 0;#endif}/* * Function prototypes */void clear_tuntap (struct tuntap *tuntap);void open_tun (const char *dev, const char *dev_type, const char *dev_node,	       bool ipv6, struct tuntap *tt);void close_tun (struct tuntap *tt);int write_tun (struct tuntap* tt, uint8_t *buf, int len);int read_tun (struct tuntap* tt, uint8_t *buf, int len);void tuncfg (const char *dev, const char *dev_type, const char *dev_node,	     bool ipv6, int persist_mode);const char *guess_tuntap_dev (const char *dev,			      const char *dev_type,			      const char *dev_node,			      struct gc_arena *gc);struct tuntap *init_tun (const char *dev,       /* --dev option */			 const char *dev_type,  /* --dev-type option */			 const char *ifconfig_local_parm,          /* --ifconfig parm 1 */			 const char *ifconfig_remote_netmask_parm, /* --ifconfig parm 2 */			 in_addr_t local_public,			 in_addr_t remote_public,			 const bool strict_warn,			 struct env_set *es);void init_tun_post (struct tuntap *tt,		    const struct frame *frame,		    const struct tuntap_options *options);void do_ifconfig (struct tuntap *tt,		  const char *actual,    /* actual device name */		  int tun_mtu,		  const struct env_set *es);const char *dev_component_in_dev_node (const char *dev_node);bool is_dev_type (const char *dev, const char *dev_type, const char *match_type);int dev_type_enum (const char *dev, const char *dev_type);const char *dev_type_string (const char *dev, const char *dev_type);const char *ifconfig_options_string (const struct tuntap* tt, bool remote, bool disable, struct gc_arena *gc);/* * Inline functions */static inline voidtun_adjust_frame_parameters (struct frame* frame, int size){  frame_add_to_extra_tun (frame, size);}/* * Should ifconfig be called before or after * tun dev open? */#define IFCONFIG_BEFORE_TUN_OPEN 0#define IFCONFIG_AFTER_TUN_OPEN  1#define IFCONFIG_DEFAULT         IFCONFIG_AFTER_TUN_OPENstatic inline intifconfig_order(void){#if defined(TARGET_LINUX)  return IFCONFIG_AFTER_TUN_OPEN;#elif defined(TARGET_SOLARIS)  return IFCONFIG_AFTER_TUN_OPEN;#elif defined(TARGET_OPENBSD)  return IFCONFIG_BEFORE_TUN_OPEN;#elif defined(TARGET_DARWIN)  return IFCONFIG_AFTER_TUN_OPEN;#elif defined(TARGET_NETBSD)  return IFCONFIG_AFTER_TUN_OPEN;#elif defined(WIN32)  return IFCONFIG_BEFORE_TUN_OPEN;#else  return IFCONFIG_DEFAULT;#endif}#ifdef WIN32#define TUN_PASS_BUFFERstruct tap_reg{  const char *guid;  struct tap_reg *next;};struct panel_reg{  const char *name;  const char *guid;  struct panel_reg *next;};int ascii2ipset (const char* name);const char *ipset2ascii (int index);const char *ipset2ascii_all (struct gc_arena *gc);void verify_255_255_255_252 (in_addr_t local, in_addr_t remote);const IP_ADAPTER_INFO *get_adapter_info_list (struct gc_arena *gc);const IP_ADAPTER_INFO *get_tun_adapter (const struct tuntap *tt, const IP_ADAPTER_INFO *list);bool is_adapter_up (const struct tuntap *tt, const IP_ADAPTER_INFO *list);bool is_ip_in_adapter_subnet (const IP_ADAPTER_INFO *ai, const in_addr_t ip, in_addr_t *highest_netmask);DWORD adapter_index_of_ip (const IP_ADAPTER_INFO *list, const in_addr_t ip, int *count);void show_tap_win32_adapters (int msglev, int warnlev);void show_adapters (int msglev);void show_valid_win32_tun_subnets (void);const char *tap_win32_getinfo (const struct tuntap *tt, struct gc_arena *gc);void tun_show_debug (struct tuntap *tt);bool dhcp_release (const struct tuntap *tt);bool dhcp_renew (const struct tuntap *tt);int tun_read_queue (struct tuntap *tt, int maxsize);int tun_write_queue (struct tuntap *tt, struct buffer *buf);int tun_finalize (HANDLE h, struct overlapped_io *io, struct buffer *buf);const char *get_netsh_id (const char *dev_node, struct gc_arena *gc);static inline booltuntap_stop (int status){  /*   * This corresponds to the STATUS_NO_SUCH_DEVICE   * error in tapdrvr.c.   */  if (status < 0)    {      return openvpn_errno () == ERROR_FILE_NOT_FOUND;    }  return false;}static inline inttun_write_win32 (struct tuntap *tt, struct buffer *buf){  int err = 0;  int status = 0;  if (overlapped_io_active (&tt->writes))    {      status = tun_finalize (tt->hand, &tt->writes, NULL);      if (status < 0)	err = GetLastError ();    }  tun_write_queue (tt, buf);  if (status < 0)    {      SetLastError (err);      return status;    }  else    return BLEN (buf);}static inline intread_tun_buffered (struct tuntap *tt, struct buffer *buf, int maxsize){  return tun_finalize (tt->hand, &tt->reads, buf);}static inline intwrite_tun_buffered (struct tuntap *tt, struct buffer *buf){  return tun_write_win32 (tt, buf);}#elsestatic inline booltuntap_stop (int status){  return false;}#endif/* * TUN/TAP I/O wait functions */static inline event_ttun_event_handle (const struct tuntap *tt){#ifdef WIN32  return &tt->rw_handle;#else  return tt->fd;#endif}static inline unsigned inttun_set (struct tuntap *tt,	 struct event_set *es,	 unsigned int rwflags,	 void *arg,	 unsigned int *persistent){  if (tuntap_defined (tt))    {      /* if persistent is defined, call event_ctl only if rwflags has changed since last call */      if (!persistent || *persistent != rwflags)	{	  event_ctl (es, tun_event_handle (tt), rwflags, arg);	  if (persistent)	    *persistent = rwflags;	}#ifdef WIN32      if (rwflags & EVENT_READ)	tun_read_queue (tt, 0);#endif      tt->rwflags_debug = rwflags;    }  return rwflags;}const char *tun_stat (const struct tuntap *tt, unsigned int rwflags, struct gc_arena *gc);#endif /* TUN_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -