Introduce an option to resolve dns names in advance for —remote, —local and http-proxy
PATCH 1/2 Introduce an option to resolve dns names in advance for —remote, —local and http-proxy
Also introduce x_gc_addspeical function that allows to add objects with a custom free function to the gc.
Some additional addrinfo cleanup
--- src/openvpn/buffer.c | 38 +++++ src/openvpn/buffer.h | 28 +++- src/openvpn/init.c | 48 ++++-- src/openvpn/manage.c | 18 ++- src/openvpn/openvpn.h | 3 + src/openvpn/options.c | 12 ++ src/openvpn/options.h | 4 +- src/openvpn/proxy.c | 2 + src/openvpn/proxy.h | 2 + src/openvpn/route.c | 2 +- src/openvpn/socket.c | 404 ++++++++++++++++++++++++++++++++++---------------- src/openvpn/socket.h | 22 ++- 12 files changed, 433 insertions(+), 150 deletions(-)
src/openvpn/buffer.c +38 -0
@@ -372,6 +372,44 @@ x_gc_free (struct gc_arena *a) }/* +* Functions to handle special objects in gc_entries +*/ + +void +x_gc_freespecial (struct gc_arena *a) +{ +struct gc_entry_special *e; + e = a->list_special; + a->list_special =NULL ; + +while (e !=NULL ) + { +struct gc_entry_special *next = e->next; + e->free_fnc (e->addr); +free (e); + e = next; + } +} + +void gc_addspecial (void *addr,void (free_function )(void *),struct gc_arena *a) +{ +ASSERT (a); +struct gc_entry_special *e; +#ifdef DMALLOC + e = (struct gc_entry_special *)openvpn_dmalloc (file, line,sizeof (struct gc_entry_special )); +#else + e = (struct gc_entry_special *)malloc (sizeof (struct gc_entry_special )); +#endif +check_malloc_return (e); + e->free_fnc = free_function; + e->addr = addr; + + e->next = a->list_special; + a->list_special = e; +} + + +/* * Transfer src arena to dest, resetting src to an empty arena. */ void
src/openvpn/buffer.h +26 -2
@@ -91,6 +91,18 @@ struct gc_entry* linked list. */ }; +/** +* Gargabe collection entry for a specially allocated structure that needs +* a custom free function to be freed like struct addrinfo +* +*/ +struct gc_entry_special +{ +struct gc_entry_special *next; +void (*free_fnc)(void *); +void *addr; +}; +/** * Garbage collection arena used to keep track of dynamically allocated
@@ -106,6 +118,7 @@ struct gc_arena {struct gc_entry *list;/**< First element of the linked list of * \c gc_entry structures. */ +struct gc_entry_special *list_special; };
@@ -153,7 +166,6 @@ char *string_alloc_debug (const char *str, struct gc_arena *gc, const char *filestruct buffer string_alloc_buf_debug (const char *str,struct gc_arena *gc,const char *file,int line);#else -struct buffer alloc_buf (size_t size);struct buffer alloc_buf_gc (size_t size,struct gc_arena *gc);/* allocate buffer with garbage collection */ struct buffer clone_buf (const struct buffer * buf);
@@ -163,6 +175,9 @@ struct buffer string_alloc_buf (const char *str, struct gc_arena *gc);#endif +void gc_addspecial (void *addr,void (*free_function)(void *),struct gc_arena *a); + +#ifdef BUF_INIT_TRACKING #define buf_init (buf, offset) buf_init_debug (buf, offset, __FILE__, __LINE__)bool buf_init_debug (struct buffer *buf,int offset,const char *file,int line);
@@ -172,6 +187,11 @@ bool buf_init_debug (struct buffer *buf, int offset, const char *file, int line)/* inline functions */ +inline static void +gc_freeaddrinfo_callback (void *addr) +{ +freeaddrinfo ((struct addrinfo *) addr); +}static inline bool buf_defined (const struct buffer *buf)
@@ -778,6 +798,7 @@ void character_class_debug (void);void gc_transfer (struct gc_arena *dest,struct gc_arena *src);void x_gc_free (struct gc_arena *a); +void x_gc_freespecial (struct gc_arena *a);static inline bool gc_defined (struct gc_arena *a)
@@ -789,6 +810,7 @@ static inline void gc_init (struct gc_arena *a) { a->list =NULL ; + a->list_special =NULL ; } static inline void
@@ -801,7 +823,7 @@ static inline struct gc_arenagc_new (void) {struct gc_arena ret; - ret.list =NULL ; +gc_init (&ret);return ret; }
@@ -810,6 +832,8 @@ gc_free (struct gc_arena *a) {if (a->list)x_gc_free (a); +if (a->list_special) +x_gc_freespecial (a); } static inline void
src/openvpn/init.c +35 -13
115 lines not on this page · raw message
src/openvpn/manage.c +13 -5
@@ -1568,9 +1568,9 @@ man_listen (struct management *man) else#endif { - man->connection.sd_top =create_socket_tcp (AF_INET ); + man->connection.sd_top =create_socket_tcp (man->settings.local->ai_family);socket_bind (man->connection.sd_top, man->settings.local, -AF_INET ,"MANAGEMENT" , true); + man->settings.local->ai_family,"MANAGEMENT" , false); }/*
@@ -2148,8 +2148,14 @@ man_settings_init (struct man_settings *ms, }else { -int status =openvpn_getaddrinfo (GETADDR_RESOLVE |GETADDR_WARN_ON_SIGNAL |GETADDR_FATAL , - addr, port,0 ,NULL ,AF_INET , &ms->local); +int status; +int resolve_flags =GETADDR_RESOLVE |GETADDR_WARN_ON_SIGNAL |GETADDR_FATAL ; + +if (! (flags &MF_CONNECT_AS_CLIENT )) + resolve_flags |=GETADDR_PASSIVE ; + + status =openvpn_getaddrinfo (resolve_flags, addr, port,0 , +NULL ,AF_UNSPEC , &ms->local);ASSERT (status==0 ); } }
@@ -2176,6 +2182,8 @@ man_settings_init (struct man_settings *ms,static void man_settings_close (struct man_settings *ms) { +if (ms->local) +freeaddrinfo (ms->local);free (ms->write_peer_info_file);CLEAR (*ms); }
@@ -2613,7 +2621,7 @@ management_post_tunnel_open (struct management *man, const in_addr_t tun_local_iint ret; ia.s_addr =htonl (tun_local_ip); - ret =openvpn_getaddrinfo (0 ,inet_ntoa (ia),NULL ,0 ,NULL , + ret =openvpn_getaddrinfo (GETADDR_PASSIVE ,inet_ntoa (ia),NULL ,0 ,NULL ,AF_INET , &man->settings.local);ASSERT (ret==0 );man_connection_init (man);
src/openvpn/openvpn.h +3 -0
@@ -166,6 +166,9 @@ struct context_1/* tunnel session keys */ struct key_schedule ks; +/* preresolved host names */ +struct preresovled_host *preresolved; +/* persist crypto sequence number to/from file */ struct packet_id_persist pid_persist;
src/openvpn/options.c +12 -0
@@ -796,6 +796,7 @@ init_options (struct options *o, const bool init_gc) o->route_delay_window =30 ; o->max_routes =MAX_ROUTES_DEFAULT ; o->resolve_retry_seconds =RESOLV_RETRY_INFINITE ; + o->resolve_in_advance = false; o->proto_force =-1 ;#ifdef ENABLE_OCC o->occ = true;
@@ -1369,6 +1370,7 @@ show_connection_entry (const struct connection_entry *o)SHOW_BOOL (remote_float);SHOW_BOOL (bind_defined);SHOW_BOOL (bind_local); +SHOW_BOOL (bind_ipv6_only);SHOW_INT (connect_retry_seconds);SHOW_INT (connect_timeout);
@@ -1494,6 +1496,7 @@ show_settings (const struct options *o)#endif SHOW_INT (resolve_retry_seconds); +SHOW_BOOL (resolve_in_advance);SHOW_STR (username);SHOW_STR (groupname);
@@ -4536,6 +4539,15 @@ add_option (struct options *options,else options->resolve_retry_seconds =positive_atoi (p[1 ]); } +else if (streq (p[0 ],"preresolve" ) ||streq (p[0 ],"ip-remote-hint" )) + { +VERIFY_PERMISSION (OPT_P_GENERAL ); + options->resolve_in_advance = true; +/* Note the ip-remote-hint and the argument p[1] are for +backward compatibility */ +if (p[1 ]) + options->ip_remote_hint=p[1 ]; + }else if (streq (p[0 ],"connect-retry" ) && p[1 ]) {VERIFY_PERMISSION (OPT_P_GENERAL |OPT_P_CONNECTION );
src/openvpn/options.h +3 -1
@@ -90,7 +90,7 @@ struct connection_entrysa_family_t af;const char * local_port;bool local_port_defined; -const char * remote_port; +const char *remote_port;const char *local;const char *remote;bool remote_float;
@@ -278,6 +278,8 @@ struct options#endif int resolve_retry_seconds;/* If hostname resolve fails, retry for n seconds */ +bool resolve_in_advance; +const char *ip_remote_hint;struct tuntap_options tuntap_options;
src/openvpn/proxy.c +2 -0
@@ -478,6 +478,8 @@ http_proxy_new (const struct http_proxy_options *o)msg (M_FATAL ,"Sorry, this version of " PACKAGE_NAME " was built without NTLM Proxy support." );#endif + p->preresoveld_proxy = o->preresolved_proxy; + p->defined = true;return p; }
src/openvpn/proxy.h +2 -0
@@ -59,6 +59,7 @@ struct http_proxy_options {const char *auth_file;const char *http_version;const char *user_agent; +struct addrinfo *preresolved_proxy;struct http_custom_header custom_headers[MAX_CUSTOM_HTTP_HEADER ]; };
@@ -73,6 +74,7 @@ struct http_proxy_info {int auth_method;struct http_proxy_options options;struct user_pass up; +struct addrinfo * preresoveld_proxy;char *proxy_authenticate;bool queried_creds; };
src/openvpn/route.c +1 -1
@@ -659,6 +659,7 @@ init_route_list (struct route_list *rl,else {struct addrinfo * curele; +gc_addspecial (netlist, &gc_freeaddrinfo_callback, &gc);for (curele = netlist; curele; curele = curele->ai_next) {if (j < rl->capacity)
@@ -675,7 +676,6 @@ init_route_list (struct route_list *rl, } } } -freeaddrinfo (netlist); } } rl->n = j;
src/openvpn/socket.c +279 -125
491 lines not on this page · raw message
src/openvpn/socket.h +19 -3
@@ -77,6 +77,16 @@ struct openvpn_sockaddr } addr; }; +/* struct to hold preresolved host names */ +struct preresovled_host { +const char *hostname; +const char *servname; +int ai_family; +int flags; +struct addrinfo *ai; +struct preresovled_host *next; +}; +/* actual address of remote, based on source address of received packets */ struct link_socket_actual {
@@ -188,6 +198,7 @@ struct link_socketconst char *remote_port;const char *local_host;const char *local_port; +struct preresovled_host *preresolved;bool bind_local;# define INETD_NONE 0
@@ -208,8 +219,6 @@ struct link_socketint mtu;/* OS discovered MTU, or 0 if unknown */ -bool did_resolve_remote; -# define SF_USE_IP_PKTINFO (1<<0)# define SF_TCP_NODELAY (1<<1)# define SF_PORT_SHARE (1<<2)
@@ -298,6 +307,8 @@ int openvpn_connect (socket_descriptor_t sd,int connect_timeout, volatile int *signal_received); + +/* * Initialize link_socket object. */
@@ -308,6 +319,7 @@ link_socket_init_phase1 (struct link_socket *sock,const char *local_port, const char *remote_host, const char *remote_port, + struct preresovled_host *preresolved, int proto, sa_family_t af, bool bind_ipv6_only,
@@ -340,6 +352,8 @@ void link_socket_init_phase2 (struct link_socket *sock,const struct frame *frame, struct signal_info *sig_info); +void do_preresolve (struct context *c); +void socket_adjust_frame_parameters (struct frame *frame,int proto);void frame_adjust_path_mtu (struct frame *frame,int pmtu,int proto);
@@ -514,6 +528,8 @@ bool unix_socket_get_peer_uid_gid (const socket_descriptor_t sd, int *uid, int *#define GETADDR_PASSIVE (1<<10)#define GETADDR_DATAGRAM (1<<11) +#define GETADDR_PRERESOLVE_MASK GETADDR_DATAGRAM|GETADDR_PASSIVE + in_addr_t getaddr (unsigned int flags, const char *hostname, int resolve_retry_seconds,
@@ -905,7 +921,7 @@ link_socket_set_outgoing_addr (const struct buffer *buf, &&/* address undef or address == remote or --float */ (info->remote_float || - (!lsa->remote_list ||addrlist_match_proto (&act->dest, lsa->remote_list, info->proto)) + (!lsa->remote_list ||addrlist_match_proto (&act->dest, lsa->remote_list, info->proto)) ) ) {
Signature · 1 line
1.8.3.4 (Apple Git-47)
PATCH 2/2 Fix for server selecting address family
--- src/openvpn/socket.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
src/openvpn/socket.c +12 -12
@@ -1507,21 +1507,10 @@ create_new_socket (struct link_socket* sock)/* clear destination set by set_actual_address */ CLEAR (sock->info.lsa->actual.dest); } - -/* -* Create the socket early if socket should be bound -*/ -if (sock->bind_local) - { -create_socket (sock); - -if (sock->bind_local) -bind_local (sock); - } - } +/* bind socket if necessary */ void link_socket_init_phase1 (struct link_socket *sock,
@@ -1943,6 +1932,17 @@ link_socket_init_phase2 (struct link_socket *sock,/* If socket has not already been created create it now */ if (sock->sd ==SOCKET_UNDEFINED ) { +/* If we have no --remote and have still not figured out the +* protocol family to use we will use the first of the bind */ +if (sock->bind_local && sock->info.lsa->bind_local + && !sock->info.lsa->actual.ai_family && !sock->remote_host) + { +msg (M_WARN ,"Could not determine IPv4/IPv6 protocol. Using %s" , +addr_family_name (sock->info.lsa->bind_local->ai_family)); +set_actual_address (&sock->info.lsa->actual, sock->info.lsa->bind_local); + + } +if (sock->info.lsa->actual.ai_family) {create_socket (sock);
Signature · 1 line
1.8.3.4 (Apple Git-47)
PATCH v2 1/1 Introduce an option to resolve dns names in advance for —remote, —local and http-proxy
In reply to Arne SchwabeAlso introduce x_gc_addspeical function that allows to add objects with a custom free function to the gc.
Some additional addrinfo cleanup
Conflicts:
src/openvpn/socket.c
--- src/openvpn/buffer.c | 38 +++++ src/openvpn/buffer.h | 28 +++- src/openvpn/init.c | 35 +++-- src/openvpn/manage.c | 18 ++- src/openvpn/openvpn.h | 3 + src/openvpn/options.c | 12 ++ src/openvpn/options.h | 4 +- src/openvpn/route.c | 2 +- src/openvpn/socket.c | 395 +++++++++++++++++++++++++++++++++++--------------- src/openvpn/socket.h | 22 ++- 10 files changed, 414 insertions(+), 143 deletions(-)
src/openvpn/buffer.c +38 -0
@@ -372,6 +372,44 @@ x_gc_free (struct gc_arena *a) }/* +* Functions to handle special objects in gc_entries +*/ + +void +x_gc_freespecial (struct gc_arena *a) +{ +struct gc_entry_special *e; + e = a->list_special; + a->list_special =NULL ; + +while (e !=NULL ) + { +struct gc_entry_special *next = e->next; + e->free_fnc (e->addr); +free (e); + e = next; + } +} + +void gc_addspecial (void *addr,void (free_function )(void *),struct gc_arena *a) +{ +ASSERT (a); +struct gc_entry_special *e; +#ifdef DMALLOC + e = (struct gc_entry_special *)openvpn_dmalloc (file, line,sizeof (struct gc_entry_special )); +#else + e = (struct gc_entry_special *)malloc (sizeof (struct gc_entry_special )); +#endif +check_malloc_return (e); + e->free_fnc = free_function; + e->addr = addr; + + e->next = a->list_special; + a->list_special = e; +} + + +/* * Transfer src arena to dest, resetting src to an empty arena. */ void
src/openvpn/buffer.h +26 -2
@@ -91,6 +91,18 @@ struct gc_entry* linked list. */ }; +/** +* Gargabe collection entry for a specially allocated structure that needs +* a custom free function to be freed like struct addrinfo +* +*/ +struct gc_entry_special +{ +struct gc_entry_special *next; +void (*free_fnc)(void *); +void *addr; +}; +/** * Garbage collection arena used to keep track of dynamically allocated
@@ -106,6 +118,7 @@ struct gc_arena {struct gc_entry *list;/**< First element of the linked list of * \c gc_entry structures. */ +struct gc_entry_special *list_special; };
@@ -153,7 +166,6 @@ char *string_alloc_debug (const char *str, struct gc_arena *gc, const char *filestruct buffer string_alloc_buf_debug (const char *str,struct gc_arena *gc,const char *file,int line);#else -struct buffer alloc_buf (size_t size);struct buffer alloc_buf_gc (size_t size,struct gc_arena *gc);/* allocate buffer with garbage collection */ struct buffer clone_buf (const struct buffer * buf);
@@ -163,6 +175,9 @@ struct buffer string_alloc_buf (const char *str, struct gc_arena *gc);#endif +void gc_addspecial (void *addr,void (*free_function)(void *),struct gc_arena *a); + +#ifdef BUF_INIT_TRACKING #define buf_init (buf, offset) buf_init_debug (buf, offset, __FILE__, __LINE__)bool buf_init_debug (struct buffer *buf,int offset,const char *file,int line);
@@ -172,6 +187,11 @@ bool buf_init_debug (struct buffer *buf, int offset, const char *file, int line)/* inline functions */ +inline static void +gc_freeaddrinfo_callback (void *addr) +{ +freeaddrinfo ((struct addrinfo *) addr); +}static inline bool buf_defined (const struct buffer *buf)
@@ -778,6 +798,7 @@ void character_class_debug (void);void gc_transfer (struct gc_arena *dest,struct gc_arena *src);void x_gc_free (struct gc_arena *a); +void x_gc_freespecial (struct gc_arena *a);static inline bool gc_defined (struct gc_arena *a)
@@ -789,6 +810,7 @@ static inline void gc_init (struct gc_arena *a) { a->list =NULL ; + a->list_special =NULL ; } static inline void
@@ -801,7 +823,7 @@ static inline struct gc_arenagc_new (void) {struct gc_arena ret; - ret.list =NULL ; +gc_init (&ret);return ret; }
@@ -810,6 +832,8 @@ gc_free (struct gc_arena *a) {if (a->list)x_gc_free (a); +if (a->list_special) +x_gc_freespecial (a); } static inline void
src/openvpn/init.c +23 -12
@@ -1,4 +1,4 @@ -/* +/* * 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,
@@ -131,7 +131,7 @@ management_callback_proxy_cmd (void *arg, const char **p)msg (M_WARN ,"HTTP proxy support is not available" );#else struct http_proxy_options *ho; -if (ce->proto !=PROTO_TCP && ce->proto !=PROTO_TCP_CLIENT ) { +if (ce->proto !=PROTO_TCP && ce->proto !=PROTO_TCP_CLIENT ) {msg (M_WARN ,"HTTP proxy support only works for TCP based connections" );return false; }
@@ -306,11 +306,10 @@ init_connection_list (struct context *c)/* * Clear the remote address list */ -static void clear_remote_addrlist (struct link_socket_addr *lsa) +static void clear_remote_addrlist (struct link_socket_addr *lsa,bool free) { -if (lsa->remote_list) { -freeaddrinfo (lsa->remote_list); - } +if (lsa->remote_list && free) +freeaddrinfo (lsa->remote_list); lsa->remote_list =NULL ; lsa->current_remote =NULL ; }
@@ -348,9 +347,12 @@ next_connection_entry (struct context *c)* this is broken probably ever since connection lists and multiple * remote existed */ -if (!c->options.persist_remote_ip) -clear_remote_addrlist (&c->c1.link_socket_addr); + { +/* close_instance should have cleared the addrinfo objects */ +ASSERT (c->c1.link_socket_addr.current_remote ==NULL ); +ASSERT (c->c1.link_socket_addr.remote_list ==NULL ); + }else c->c1.link_socket_addr.current_remote = c->c1.link_socket_addr.remote_list;
@@ -2688,6 +2690,7 @@ do_init_socket_1 (struct context *c, const int mode) c->options.ce.local_port, c->options.ce.remote, c->options.ce.remote_port, + c->c1.dns_cache, c->options.ce.proto, c->options.ce.af, c->options.ce.bind_ipv6_only,
@@ -2908,7 +2911,7 @@ do_close_link_socket (struct context *c) || c->options.no_advance)) ))) { -clear_remote_addrlist (&c->c1.link_socket_addr); +clear_remote_addrlist (&c->c1.link_socket_addr, !c->options.resolve_in_advance); }/* Clear the remote actual address when persist_remote_ip is not in use */
@@ -2916,8 +2919,9 @@ do_close_link_socket (struct context *c)CLEAR (c->c1.link_socket_addr.actual);if (!(c->sig->signal_received ==SIGUSR1 && c->options.persist_local_ip)) { -if (c->c1.link_socket_addr.bind_local) -freeaddrinfo (c->c1.link_socket_addr.bind_local); +if (c->c1.link_socket_addr.bind_local && !c->options.resolve_in_advance) +freeaddrinfo (c->c1.link_socket_addr.bind_local); + c->c1.link_socket_addr.bind_local=NULL ; } }
@@ -3355,6 +3359,13 @@ init_instance (struct context *c, const struct env_set *env, const unsigned int goto sig; } +if (c->options.resolve_in_advance) + { +do_preresolve (c); +if (IS_SIG (c)) + goto sig; + } +/* map in current connection entry */ next_connection_entry (c);
@@ -3433,7 +3444,7 @@ init_instance (struct context *c, const struct env_set *env, const unsigned int/* allocate our socket object */ if (c->mode ==CM_P2P || c->mode ==CM_TOP || c->mode ==CM_CHILD_TCP )do_link_socket_new (c); - +#ifdef ENABLE_FRAGMENT /* initialize internal fragmentation object */ if (options->ce.fragment && (c->mode ==CM_P2P || child))
src/openvpn/manage.c +13 -5
@@ -1568,9 +1568,9 @@ man_listen (struct management *man) else#endif { - man->connection.sd_top =create_socket_tcp (AF_INET ); + man->connection.sd_top =create_socket_tcp (man->settings.local->ai_family);socket_bind (man->connection.sd_top, man->settings.local, -AF_INET ,"MANAGEMENT" , true); + man->settings.local->ai_family,"MANAGEMENT" , false); }/*
@@ -2123,8 +2123,14 @@ man_settings_init (struct man_settings *ms, }else { -int status =openvpn_getaddrinfo (GETADDR_RESOLVE |GETADDR_WARN_ON_SIGNAL |GETADDR_FATAL , - addr, port,0 ,NULL ,AF_INET , &ms->local); +int status; +int resolve_flags =GETADDR_RESOLVE |GETADDR_WARN_ON_SIGNAL |GETADDR_FATAL ; + +if (! (flags &MF_CONNECT_AS_CLIENT )) + resolve_flags |=GETADDR_PASSIVE ; + + status =openvpn_getaddrinfo (resolve_flags, addr, port,0 , +NULL ,AF_UNSPEC , &ms->local);ASSERT (status==0 ); } }
@@ -2151,6 +2157,8 @@ man_settings_init (struct man_settings *ms,static void man_settings_close (struct man_settings *ms) { +if (ms->local) +freeaddrinfo (ms->local);free (ms->write_peer_info_file);CLEAR (*ms); }
@@ -2588,7 +2596,7 @@ management_post_tunnel_open (struct management *man, const in_addr_t tun_local_iint ret; ia.s_addr =htonl (tun_local_ip); - ret =openvpn_getaddrinfo (0 ,inet_ntoa (ia),NULL ,0 ,NULL , + ret =openvpn_getaddrinfo (GETADDR_PASSIVE ,inet_ntoa (ia),NULL ,0 ,NULL ,AF_INET , &man->settings.local);ASSERT (ret==0 );man_connection_init (man);
src/openvpn/openvpn.h +3 -0
@@ -166,6 +166,9 @@ struct context_1/* tunnel session keys */ struct key_schedule ks; +/* preresolved and cached host names */ +struct cached_dns_entry *dns_cache; +/* persist crypto sequence number to/from file */ struct packet_id_persist pid_persist;
src/openvpn/options.c +12 -0
@@ -795,6 +795,7 @@ init_options (struct options *o, const bool init_gc) o->route_delay_window =30 ; o->max_routes =MAX_ROUTES_DEFAULT ; o->resolve_retry_seconds =RESOLV_RETRY_INFINITE ; + o->resolve_in_advance = false; o->proto_force =-1 ;#ifdef ENABLE_OCC o->occ = true;
@@ -1368,6 +1369,7 @@ show_connection_entry (const struct connection_entry *o)SHOW_BOOL (remote_float);SHOW_BOOL (bind_defined);SHOW_BOOL (bind_local); +SHOW_BOOL (bind_ipv6_only);SHOW_INT (connect_retry_seconds);SHOW_INT (connect_timeout);
@@ -1493,6 +1495,7 @@ show_settings (const struct options *o)#endif SHOW_INT (resolve_retry_seconds); +SHOW_BOOL (resolve_in_advance);SHOW_STR (username);SHOW_STR (groupname);
@@ -4534,6 +4537,15 @@ add_option (struct options *options,else options->resolve_retry_seconds =positive_atoi (p[1 ]); } +else if (streq (p[0 ],"preresolve" ) ||streq (p[0 ],"ip-remote-hint" )) + { +VERIFY_PERMISSION (OPT_P_GENERAL ); + options->resolve_in_advance = true; +/* Note the ip-remote-hint and the argument p[1] are for +backward compatibility */ +if (p[1 ]) + options->ip_remote_hint=p[1 ]; + }else if (streq (p[0 ],"connect-retry" ) && p[1 ]) {VERIFY_PERMISSION (OPT_P_GENERAL |OPT_P_CONNECTION );
src/openvpn/options.h +3 -1
@@ -90,7 +90,7 @@ struct connection_entrysa_family_t af;const char * local_port;bool local_port_defined; -const char * remote_port; +const char *remote_port;const char *local;const char *remote;bool remote_float;
@@ -278,6 +278,8 @@ struct options#endif int resolve_retry_seconds;/* If hostname resolve fails, retry for n seconds */ +bool resolve_in_advance; +const char *ip_remote_hint;struct tuntap_options tuntap_options;
src/openvpn/route.c +1 -1
@@ -659,6 +659,7 @@ init_route_list (struct route_list *rl,else {struct addrinfo * curele; +gc_addspecial (netlist, &gc_freeaddrinfo_callback, &gc);for (curele = netlist; curele; curele = curele->ai_next) {if (j < rl->capacity)
@@ -675,7 +676,6 @@ init_route_list (struct route_list *rl, } } } -freeaddrinfo (netlist); } } rl->n = j;
src/openvpn/socket.c +276 -119
486 lines not on this page · raw message
src/openvpn/socket.h +19 -3
@@ -77,6 +77,16 @@ struct openvpn_sockaddr } addr; }; +/* struct to hold preresolved host names */ +struct cached_dns_entry { +const char *hostname; +const char *servname; +int ai_family; +int flags; +struct addrinfo *ai; +struct cached_dns_entry *next; +}; +/* actual address of remote, based on source address of received packets */ struct link_socket_actual {
@@ -188,6 +198,7 @@ struct link_socketconst char *remote_port;const char *local_host;const char *local_port; +struct cached_dns_entry *dns_cache;bool bind_local;# define INETD_NONE 0
@@ -208,8 +219,6 @@ struct link_socketint mtu;/* OS discovered MTU, or 0 if unknown */ -bool did_resolve_remote; -# define SF_USE_IP_PKTINFO (1<<0)# define SF_TCP_NODELAY (1<<1)# define SF_PORT_SHARE (1<<2)
@@ -298,6 +307,8 @@ int openvpn_connect (socket_descriptor_t sd,int connect_timeout, volatile int *signal_received); + +/* * Initialize link_socket object. */
@@ -308,6 +319,7 @@ link_socket_init_phase1 (struct link_socket *sock,const char *local_port, const char *remote_host, const char *remote_port, + struct cached_dns_entry *dns_cache, int proto, sa_family_t af, bool bind_ipv6_only,
@@ -340,6 +352,8 @@ void link_socket_init_phase2 (struct link_socket *sock,const struct frame *frame, struct signal_info *sig_info); +void do_preresolve (struct context *c); +void socket_adjust_frame_parameters (struct frame *frame,int proto);void frame_adjust_path_mtu (struct frame *frame,int pmtu,int proto);
@@ -514,6 +528,8 @@ bool unix_socket_get_peer_uid_gid (const socket_descriptor_t sd, int *uid, int *#define GETADDR_PASSIVE (1<<10)#define GETADDR_DATAGRAM (1<<11) +#define GETADDR_CACHE_MASK GETADDR_DATAGRAM|GETADDR_PASSIVE + in_addr_t getaddr (unsigned int flags, const char *hostname, int resolve_retry_seconds,
@@ -888,7 +904,7 @@ link_socket_set_outgoing_addr (const struct buffer *buf, &&/* address undef or address == remote or --float */ (info->remote_float || - (!lsa->remote_list ||addrlist_match_proto (&act->dest, lsa->remote_list, info->proto)) + (!lsa->remote_list ||addrlist_match_proto (&act->dest, lsa->remote_list, info->proto)) ) ) {
Signature · 1 line
1.8.3.4 (Apple Git-47)