OpenVPN
socket.c File Reference
#include "syshead.h"
#include "socket.h"
#include "fdmisc.h"
#include "misc.h"
#include "gremlin.h"
#include "plugin.h"
#include "ps.h"
#include "run_command.h"
#include "manage.h"
#include "openvpn.h"
#include "forward.h"
#include "resolve.h"
#include "memdbg.h"
Include dependency graph for socket.c:

Go to the source code of this file.

Functions

bool sockets_read_residual (const struct context *c)
static int socket_get_sndbuf (socket_descriptor_t sd)
static void socket_set_sndbuf (socket_descriptor_t sd, int size)
static int socket_get_rcvbuf (socket_descriptor_t sd)
static void socket_set_rcvbuf (socket_descriptor_t sd, int size)
void socket_set_buffers (socket_descriptor_t fd, const struct socket_buffer_size *sbs, bool reduce_size)
 Sets the receive and send buffer sizes of a socket descriptor.
static bool socket_set_tcp_nodelay (socket_descriptor_t sd, int state)
static void socket_set_mark (socket_descriptor_t sd, int mark)
void link_socket_update_buffer_sizes (struct link_socket *sock, int rcvbuf, int sndbuf)
socket_descriptor_t create_socket_tcp (struct addrinfo *addrinfo)
static socket_descriptor_t create_socket_udp (struct addrinfo *addrinfo, const unsigned int flags, bool optional)
static void bind_local (const struct link_socket *sock)
static void socket_apply_options (socket_descriptor_t sd, const struct socket_buffer_size *sbs, int mark, const char *bind_dev)
socket_descriptor_t create_socket_udp_configured (sa_family_t af, unsigned int sockflags, const struct socket_buffer_size *sbs, int mark, const char *bind_dev, struct addrinfo *bind_addr, bool bind_ipv6_only, bool optional)
 Create a UDP socket for af set up the way a link socket is: –sndbuf/–rcvbuf, –mark, –bind-dev and, when bind_addr is given, the local bind (IPV6_V6ONLY per bind_ipv6_only).
static void create_socket (struct link_socket *sock, struct addrinfo *addr)
static void socket_do_listen (socket_descriptor_t sd, const struct addrinfo *local, bool do_listen, bool do_set_nonblock)
socket_descriptor_t socket_do_accept (socket_descriptor_t sd, struct link_socket_actual *act, const bool nowait)
static void tcp_connection_established (const struct link_socket_actual *act)
static socket_descriptor_t socket_listen_accept (socket_descriptor_t sd, struct link_socket_actual *act, const struct addrinfo *local, bool do_listen, bool nowait, volatile int *signal_received)
void socket_bind (socket_descriptor_t sd, const struct addrinfo *local, int ai_family, const char *prefix, bool ipv6only)
int openvpn_connect (socket_descriptor_t sd, const struct sockaddr *remote, int connect_timeout, volatile int *signal_received)
void set_actual_address (struct link_socket_actual *actual, struct addrinfo *ai)
static void socket_connect (socket_descriptor_t *sd, const struct sockaddr *dest, const int connect_timeout, struct signal_info *sig_info)
static void stream_buf_init (struct stream_buf *sb, const struct buffer *buf, const unsigned int sockflags, const int proto)
static void stream_buf_close (struct stream_buf *sb)
static bool stream_buf_added (struct stream_buf *sb, ssize_t length_added)
 This will determine if sb->buf contains a full packet.
static void socket_frame_init (const struct frame *frame, struct link_socket *sock)
static void resolve_bind_local (struct link_socket *sock)
static void resolve_remote (struct link_socket *sock, int phase, struct signal_info *sig_info)
struct link_socket * link_socket_new (void)
void link_socket_init_phase1 (struct context *c, int sock_index, int mode)
static void phase2_set_socket_flags (const struct link_socket *sock)
static void linksock_print_addr (struct link_socket *sock)
static void phase2_tcp_server (struct link_socket *sock, struct signal_info *sig_info)
static void phase2_tcp_client (struct link_socket *sock, struct signal_info *sig_info)
static void phase2_socks_client (struct link_socket *sock, struct signal_info *sig_info)
static void create_socket_dco_win (struct context *c, struct link_socket *sock, struct signal_info *sig_info)
void link_socket_init_phase2 (struct context *c, struct link_socket *sock)
void link_socket_close (struct link_socket *sock)
void setenv_trusted (struct env_set *es, const struct link_socket_info *info)
static void ipchange_fmt (const bool include_cmd, struct argv *argv, const struct link_socket_info *info, struct gc_arena *gc)
void link_socket_connection_initiated (struct link_socket_info *info, const struct link_socket_actual *act, const char *common_name, struct env_set *es)
void link_socket_bad_incoming_addr (struct buffer *buf, const struct link_socket_info *info, const struct link_socket_actual *from_addr)
void link_socket_bad_outgoing_addr (void)
in_addr_t link_socket_current_remote (const struct link_socket_info *info)
const struct in6_addr * link_socket_current_remote_ipv6 (const struct link_socket_info *info)
const char * socket_stat (const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc)
static void stream_buf_reset (struct stream_buf *sb)
 resets the stream buffer to be set up for the next round of reassembling a packet
static struct buffer stream_buf_get_next (struct stream_buf *sb)
 Return a buffer that is backed by the same backend as sb->buf that determines where the next read should be done by also having the right offset into sb->buf.
static void stream_buf_get_final (struct stream_buf *sb, struct buffer *buf)
 Sets the parameter buf to the current buffer of sb->buf.
bool stream_buf_read_setup_dowork (struct stream_buf *sb)
 Will try to check if the buffers in stream form a full packet.
event_t socket_listen_event_handle (struct link_socket *s)
void bad_address_length (int actual, int expected)
ssize_t link_socket_read_tcp (struct link_socket *sock, struct buffer *buf)
ssize_t link_socket_write_tcp (struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to)
static int socket_get_last_error (const struct link_socket *sock)
int socket_recv_queue (struct link_socket *sock, int maxsize)
int socket_send_queue (struct link_socket *sock, const struct buffer *buf, const struct link_socket_actual *to)
static void read_sockaddr_from_overlapped (const struct overlapped_io *io, struct sockaddr *dst, int overlapped_ret)
static int read_sockaddr_from_packet (struct buffer *buf, struct sockaddr *dst)
 Extracts a sockaddr from a packet payload.
int sockethandle_finalize (sockethandle_t sh, struct overlapped_io *io, struct buffer *buf, struct link_socket_actual *from)
unsigned int socket_set (struct link_socket *s, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)

Function Documentation

◆ bad_address_length()

void bad_address_length ( int actual,
int expected )

Definition at line 1907 of file socket.c.

References M_FATAL, and msg.

Referenced by read_sockaddr_from_overlapped(), and socket_recv_queue().

◆ bind_local()

◆ create_socket()

◆ create_socket_dco_win()

◆ create_socket_tcp()

socket_descriptor_t create_socket_tcp ( struct addrinfo * addrinfo)

Definition at line 177 of file socket.c.

References ASSERT, M_ERR, msg, set_cloexec(), and SOCKET_UNDEFINED.

Referenced by create_socket(), man_connect(), man_listen(), and phase2_tcp_client().

◆ create_socket_udp()

socket_descriptor_t create_socket_udp ( struct addrinfo * addrinfo,
const unsigned int flags,
bool optional )
static

Definition at line 209 of file socket.c.

References ASSERT, D_LOW, M_ERR, M_ERRNO, msg, set_cloexec(), SF_USE_IP_PKTINFO, SOCKET_UNDEFINED, and SOL_IP.

Referenced by create_socket_udp_configured().

◆ create_socket_udp_configured()

socket_descriptor_t create_socket_udp_configured ( sa_family_t af,
unsigned int sockflags,
const struct socket_buffer_size * sbs,
int mark,
const char * bind_dev,
struct addrinfo * bind_addr,
bool bind_ipv6_only,
bool optional )

Create a UDP socket for af set up the way a link socket is: –sndbuf/–rcvbuf, –mark, –bind-dev and, when bind_addr is given, the local bind (IPV6_V6ONLY per bind_ipv6_only).

Shared by create_socket() and the –server-probe sockets, so a probe socket is the connection socket it may become. A failed bind is fatal; with optional a socket the host cannot create is not, so –server-probe can skip that address family (SOCKET_UNDEFINED is returned).

Definition at line 309 of file socket.c.

References create_socket_udp(), socket_apply_options(), socket_bind(), and SOCKET_UNDEFINED.

Referenced by create_socket().

◆ ipchange_fmt()

◆ link_socket_bad_incoming_addr()

◆ link_socket_bad_outgoing_addr()

void link_socket_bad_outgoing_addr ( void )

Definition at line 1597 of file socket.c.

References D_READ_WRITE, and dmsg.

Referenced by link_socket_get_outgoing_addr().

◆ link_socket_close()

◆ link_socket_connection_initiated()

◆ link_socket_current_remote()

◆ link_socket_current_remote_ipv6()

◆ link_socket_init_phase1()

void link_socket_init_phase1 ( struct context * c,
int sock_index,
int mode )

Definition at line 979 of file socket.c.

References context_2::accept_from, connection_entry::af, link_socket_info::af, local_list::array, ASSERT, link_socket::bind_dev, options::bind_dev, connection_entry::bind_ipv6_only, link_socket_info::bind_ipv6_only, connection_entry::bind_local, link_socket::bind_local, context::c1, context::c2, options::ce, CM_CHILD_TCP, CM_CHILD_UDP, context_1::dns_cache, link_socket::dns_cache, context_1::http_proxy, link_socket::http_proxy, link_socket::info, options::ipchange, link_socket_info::ipchange_command, context_1::link_socket_addrs, context_2::link_sockets, local_entry::local, link_socket::local_host, connection_entry::local_list, connection_entry::local_port, link_socket::local_port, connection_entry::local_port_defined, LS_MODE_TCP_ACCEPT_FROM, link_socket_info::lsa, link_socket::mark, options::mark, context::mode, link_socket::mode, options::mode, MODE_POINT_TO_POINT, connection_entry::mtu_discover_type, link_socket::mtu_discover_type, context::options, http_proxy_info::options, context::plugins, link_socket_info::plugins, http_proxy_options::port, local_entry::port, socks_proxy_info::port, connection_entry::proto, link_socket_info::proto, local_entry::proto, PROTO_N, PROTO_TCP_CLIENT, PROTO_TCP_SERVER, link_socket::proxy_dest_host, link_socket::proxy_dest_port, options::rcvbuf, socket_buffer_size::rcvbuf, connection_entry::remote, connection_entry::remote_float, link_socket_info::remote_float, link_socket::remote_host, connection_entry::remote_port, link_socket::remote_port, resolve_bind_local(), resolve_remote(), link_socket::resolve_retry_seconds, options::resolve_retry_seconds, link_socket::sd, http_proxy_options::server, socks_proxy_info::server, context_2::server_poll_interval, link_socket::server_poll_timeout, SF_PORT_SHARE, options::sndbuf, socket_buffer_size::sndbuf, link_socket::socket_buffer_sizes, link_socket::sockflags, options::sockflags, context_1::socks_proxy, and link_socket::socks_proxy.

Referenced by do_init_socket_phase1().

◆ link_socket_init_phase2()

◆ link_socket_new()

◆ link_socket_read_tcp()

◆ link_socket_update_buffer_sizes()

void link_socket_update_buffer_sizes ( struct link_socket * sock,
int rcvbuf,
int sndbuf )

◆ link_socket_write_tcp()

ssize_t link_socket_write_tcp ( struct link_socket * sock,
struct buffer * buf,
struct link_socket_actual * to )

◆ linksock_print_addr()

◆ openvpn_connect()

int openvpn_connect ( socket_descriptor_t sd,
const struct sockaddr * remote,
int connect_timeout,
volatile int * signal_received )

◆ phase2_set_socket_flags()

◆ phase2_socks_client()

◆ phase2_tcp_client()

◆ phase2_tcp_server()

◆ read_sockaddr_from_overlapped()

void read_sockaddr_from_overlapped ( const struct overlapped_io * io,
struct sockaddr * dst,
int overlapped_ret )
static

◆ read_sockaddr_from_packet()

int read_sockaddr_from_packet ( struct buffer * buf,
struct sockaddr * dst )
static

Extracts a sockaddr from a packet payload.

Reads a sockaddr structure from the start of the packet buffer and writes it to dst.

Parameters
[in]bufPacket buffer containing the payload.
[out]dstDestination buffer for the extracted sockaddr.
Returns
Length of the extracted sockaddr

Definition at line 2467 of file socket.c.

References ASSERT, BPTR, buf_advance(), and buf_len().

Referenced by sockethandle_finalize().

◆ resolve_bind_local()

◆ resolve_remote()

◆ set_actual_address()

void set_actual_address ( struct link_socket_actual * actual,
struct addrinfo * ai )

◆ setenv_trusted()

◆ socket_apply_options()

void socket_apply_options ( socket_descriptor_t sd,
const struct socket_buffer_size * sbs,
int mark,
const char * bind_dev )
static

Definition at line 283 of file socket.c.

References M_ERRNO, M_INFO, M_WARN, msg, socket_set_buffers(), and socket_set_mark().

Referenced by create_socket(), and create_socket_udp_configured().

◆ socket_bind()

void socket_bind ( socket_descriptor_t sd,
const struct addrinfo * local,
int ai_family,
const char * prefix,
bool ipv6only )

◆ socket_connect()

void socket_connect ( socket_descriptor_t * sd,
const struct sockaddr * dest,
const int connect_timeout,
struct signal_info * sig_info )
static

◆ socket_do_accept()

◆ socket_do_listen()

void socket_do_listen ( socket_descriptor_t sd,
const struct addrinfo * local,
bool do_listen,
bool do_set_nonblock )
static

Definition at line 401 of file socket.c.

References ASSERT, gc, gc_free(), gc_new(), M_ERR, M_INFO, msg, print_sockaddr(), and set_nonblock().

Referenced by phase2_tcp_server(), and socket_listen_accept().

◆ socket_frame_init()

◆ socket_get_last_error()

int socket_get_last_error ( const struct link_socket * sock)
static

Definition at line 2205 of file socket.c.

References socket_is_dco_win().

Referenced by socket_recv_queue(), and socket_send_queue().

◆ socket_get_rcvbuf()

int socket_get_rcvbuf ( socket_descriptor_t sd)
static

Definition at line 81 of file socket.c.

Referenced by socket_set_buffers().

◆ socket_get_sndbuf()

int socket_get_sndbuf ( socket_descriptor_t sd)
static

Definition at line 59 of file socket.c.

Referenced by socket_set_buffers().

◆ socket_listen_accept()

socket_descriptor_t socket_listen_accept ( socket_descriptor_t sd,
struct link_socket_actual * act,
const struct addrinfo * local,
bool do_listen,
bool nowait,
volatile int * signal_received )
static

◆ socket_listen_event_handle()

event_t socket_listen_event_handle ( struct link_socket * s)

◆ socket_recv_queue()

◆ socket_send_queue()

◆ socket_set()

unsigned int socket_set ( struct link_socket * s,
struct event_set * es,
unsigned int rwflags,
void * arg,
unsigned int * persistent )

◆ socket_set_buffers()

void socket_set_buffers ( socket_descriptor_t fd,
const struct socket_buffer_size * sbs,
bool reduce_size )

Sets the receive and send buffer sizes of a socket descriptor.

Parameters
fdThe socket to modify
sbsnew sizes.
reduce_sizeapply the new size even if smaller than current one

Definition at line 103 of file socket.c.

References D_OSBUF, msg, socket_buffer_size::rcvbuf, socket_buffer_size::sndbuf, socket_get_rcvbuf(), socket_get_sndbuf(), socket_set_rcvbuf(), and socket_set_sndbuf().

Referenced by link_socket_update_buffer_sizes(), open_tun_afunix(), and socket_apply_options().

◆ socket_set_mark()

void socket_set_mark ( socket_descriptor_t sd,
int mark )
inlinestatic

Definition at line 150 of file socket.c.

References M_WARN, and msg.

Referenced by socket_apply_options().

◆ socket_set_rcvbuf()

void socket_set_rcvbuf ( socket_descriptor_t sd,
int size )
static

Definition at line 94 of file socket.c.

References M_WARN, and msg.

Referenced by socket_set_buffers().

◆ socket_set_sndbuf()

void socket_set_sndbuf ( socket_descriptor_t sd,
int size )
static

Definition at line 72 of file socket.c.

References M_WARN, and msg.

Referenced by socket_set_buffers().

◆ socket_set_tcp_nodelay()

bool socket_set_tcp_nodelay ( socket_descriptor_t sd,
int state )
static

Definition at line 130 of file socket.c.

References D_OSBUF, dmsg, M_WARN, and msg.

Referenced by phase2_set_socket_flags().

◆ socket_stat()

const char * socket_stat ( const struct link_socket * s,
unsigned int rwflags,
struct gc_arena * gc )

◆ sockethandle_finalize()

◆ sockets_read_residual()

bool sockets_read_residual ( const struct context * c)

◆ stream_buf_added()

bool stream_buf_added ( struct stream_buf * sb,
ssize_t length_added )
static

This will determine if sb->buf contains a full packet.

It will also move anything in sb->buf beyond a full packet to sb->residual.

The first time the function is called with a valid buffer and port sharing is enabled, the function will also determine if the buffer contains OpenVPN protocol data and store the result in sb->port_share_state.

If a packet outside the allowed range is detected, the error state on sb is set.

Since the buffer in sb->buf is modified from the outside (via stream_buf_get_next) the parameter length_added needs to be set to the amount of bytes that have been written to this buffer. If the buffer was not modified but should still be analysed and potentially split to sb->residual, the parameter length_added should be 0.

Parameters
sbthe stream buffer
length_addedThe length that has been added to sb->buf
Returns
true if sb->buf contains fully reassembled packet

Definition at line 1810 of file socket.c.

References ASSERT, BLEN, stream_buf::buf, buf_copy_excess(), buf_init, buf_read(), D_PS_PROXY, D_STREAM_DEBUG, dmsg, stream_buf::error, buffer::len, stream_buf::len, M_WARN, stream_buf::maxlen, msg, ntohps, stream_buf::residual, and stream_buf_reset().

Referenced by link_socket_read_tcp(), and stream_buf_read_setup_dowork().

◆ stream_buf_close()

void stream_buf_close ( struct stream_buf * sb)
static

Definition at line 1877 of file socket.c.

References free_buf(), and stream_buf::residual.

Referenced by link_socket_close().

◆ stream_buf_get_final()

void stream_buf_get_final ( struct stream_buf * sb,
struct buffer * buf )
inlinestatic

Sets the parameter buf to the current buffer of sb->buf.

This function assumes that caller already checked if the packet in sb->buf is fully assembled.

Parameters
sbstream buffer to operate on
bufbuffer to point to the contents of buf

Definition at line 1766 of file socket.c.

References ASSERT, stream_buf::buf, buf_defined(), D_STREAM_DEBUG, dmsg, and buffer::len.

Referenced by link_socket_read_tcp().

◆ stream_buf_get_next()

struct buffer stream_buf_get_next ( struct stream_buf * sb)
inlinestatic

Return a buffer that is backed by the same backend as sb->buf that determines where the next read should be done by also having the right offset into sb->buf.

Parameters
sbthe stream buffer from which to construct the next buffer

Definition at line 1743 of file socket.c.

References ASSERT, buf_safe(), D_STREAM_DEBUG, dmsg, buffer::len, buffer::offset, and stream_buf_get_next().

Referenced by link_socket_read_tcp(), socket_recv_queue(), and stream_buf_get_next().

◆ stream_buf_init()

void stream_buf_init ( struct stream_buf * sb,
const struct buffer * buf,
const unsigned int sockflags,
const int proto )
static

◆ stream_buf_read_setup_dowork()

bool stream_buf_read_setup_dowork ( struct stream_buf * sb)

Will try to check if the buffers in stream form a full packet.

Will return true if further reads are required and false otherwise. (full packet is ready)

With UDP we always return true as there is no reassembly.

Parameters
sbthe stream buffer that should be worked on
Returns
true if more reads are required.

Definition at line 1774 of file socket.c.

References ASSERT, stream_buf::buf, buf_copy(), buf_init, D_STREAM_DEBUG, dmsg, buffer::len, stream_buf::residual, stream_buf::residual_fully_formed, and stream_buf_added().

Referenced by stream_buf_read_setup().

◆ stream_buf_reset()

void stream_buf_reset ( struct stream_buf * sb)
inlinestatic

resets the stream buffer to be set up for the next round of reassembling a packet

But still leaves the current packet in sb->buf to be potentially read.

Definition at line 1710 of file socket.c.

References stream_buf::buf, stream_buf::buf_init, D_STREAM_DEBUG, dmsg, stream_buf::len, and stream_buf::residual_fully_formed.

Referenced by link_socket_read_tcp(), stream_buf_added(), and stream_buf_init().

◆ tcp_connection_established()

void tcp_connection_established ( const struct link_socket_actual * act)
static

Definition at line 490 of file socket.c.

References gc, gc_free(), gc_new(), M_INFO, msg, and print_link_socket_actual().

Referenced by phase2_tcp_server(), and socket_listen_accept().