FreeRDP
transport.c File Reference
#include <freerdp/config.h>
#include "settings.h"
#include <winpr/assert.h>
#include <winpr/crt.h>
#include <winpr/synch.h>
#include <winpr/print.h>
#include <winpr/stream.h>
#include <winpr/winsock.h>
#include <winpr/crypto.h>
#include <freerdp/log.h>
#include <freerdp/error.h>
#include <freerdp/utils/ringbuffer.h>
#include <openssl/bio.h>
#include <time.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <sys/socket.h>
#include "tpkt.h"
#include "fastpath.h"
#include "transport.h"
#include "rdp.h"
#include "proxy.h"
#include "utils.h"
#include "state.h"
#include "childsession.h"
#include "gateway/rdg.h"
#include "gateway/wst.h"
#include "gateway/arm.h"

Macros

#define TAG   FREERDP_TAG("core.transport")
 
#define BUFFER_SIZE   16384
 
#define WLog_ERR_BIO(transport, biofunc, bio)    transport_bio_error_log(transport, biofunc, bio, __FILE__, __func__, __LINE__)
 

Functions

static void transport_ssl_cb (SSL *ssl, int where, int ret)
 
wStreamtransport_send_stream_init (rdpTransport *transport, size_t size)
 
BOOL transport_attach (rdpTransport *transport, int sockfd)
 Attach a socket to the transport layer. More...
 
static BOOL transport_default_attach (rdpTransport *transport, int sockfd)
 
BOOL transport_connect_rdp (rdpTransport *transport)
 
BOOL transport_connect_tls (rdpTransport *transport)
 
static BOOL transport_default_connect_tls (rdpTransport *transport)
 
BOOL transport_connect_nla (rdpTransport *transport, BOOL earlyUserAuth)
 
BOOL transport_connect_rdstls (rdpTransport *transport)
 
BOOL transport_connect_aad (rdpTransport *transport)
 
BOOL transport_connect (rdpTransport *transport, const char *hostname, UINT16 port, DWORD timeout)
 
BOOL transport_connect_childsession (rdpTransport *transport)
 
BOOL transport_accept_rdp (rdpTransport *transport)
 
BOOL transport_accept_tls (rdpTransport *transport)
 
static BOOL transport_default_accept_tls (rdpTransport *transport)
 
BOOL transport_accept_nla (rdpTransport *transport)
 
BOOL transport_accept_rdstls (rdpTransport *transport)
 
static void transport_bio_error_log (rdpTransport *transport, LPCSTR biofunc, BIO *bio, LPCSTR file, LPCSTR func, DWORD line)
 
static SSIZE_T transport_read_layer (rdpTransport *transport, BYTE *data, size_t bytes)
 
static SSIZE_T transport_read_layer_bytes (rdpTransport *transport, wStream *s, size_t toRead)
 Tries to read toRead bytes from the specified transport. More...
 
int transport_read_pdu (rdpTransport *transport, wStream *s)
 Try to read a complete PDU (NLA, fast-path or tpkt) from the underlying transport. More...
 
static SSIZE_T parse_nla_mode_pdu (rdpTransport *transport, wStream *stream)
 
static SSIZE_T parse_default_mode_pdu (rdpTransport *transport, wStream *stream)
 
SSIZE_T transport_parse_pdu (rdpTransport *transport, wStream *s, BOOL *incomplete)
 
static int transport_default_read_pdu (rdpTransport *transport, wStream *s)
 
int transport_write (rdpTransport *transport, wStream *s)
 
static int transport_default_write (rdpTransport *transport, wStream *s)
 
BOOL transport_get_public_key (rdpTransport *transport, const BYTE **data, DWORD *length)
 
static BOOL transport_default_get_public_key (rdpTransport *transport, const BYTE **data, DWORD *length)
 
DWORD transport_get_event_handles (rdpTransport *transport, HANDLE *events, DWORD count)
 
BOOL transport_is_write_blocked (rdpTransport *transport)
 
int transport_drain_output_buffer (rdpTransport *transport)
 
int transport_check_fds (rdpTransport *transport)
 
BOOL transport_set_blocking_mode (rdpTransport *transport, BOOL blocking)
 
static BOOL transport_default_set_blocking_mode (rdpTransport *transport, BOOL blocking)
 
void transport_set_gateway_enabled (rdpTransport *transport, BOOL GatewayEnabled)
 
void transport_set_nla_mode (rdpTransport *transport, BOOL NlaMode)
 
void transport_set_rdstls_mode (rdpTransport *transport, BOOL RdstlsMode)
 
void transport_set_aad_mode (rdpTransport *transport, BOOL AadMode)
 
BOOL transport_disconnect (rdpTransport *transport)
 
static BOOL transport_default_disconnect (rdpTransport *transport)
 
rdpTransport * transport_new (rdpContext *context)
 
void transport_free (rdpTransport *transport)
 
BOOL transport_set_io_callbacks (rdpTransport *transport, const rdpTransportIo *io_callbacks)
 
const rdpTransportIo * transport_get_io_callbacks (rdpTransport *transport)
 
rdpContext * transport_get_context (rdpTransport *transport)
 
rdpTransport * freerdp_get_transport (rdpContext *context)
 
BOOL transport_set_nla (rdpTransport *transport, rdpNla *nla)
 
rdpNla * transport_get_nla (rdpTransport *transport)
 
BOOL transport_set_tls (rdpTransport *transport, rdpTls *tls)
 
rdpTls * transport_get_tls (rdpTransport *transport)
 
BOOL transport_set_tsg (rdpTransport *transport, rdpTsg *tsg)
 
rdpTsg * transport_get_tsg (rdpTransport *transport)
 
wStreamtransport_take_from_pool (rdpTransport *transport, size_t size)
 
ULONG transport_get_bytes_sent (rdpTransport *transport, BOOL resetCount)
 
TRANSPORT_LAYER transport_get_layer (rdpTransport *transport)
 
BOOL transport_set_layer (rdpTransport *transport, TRANSPORT_LAYER layer)
 
BOOL transport_set_connected_event (rdpTransport *transport)
 
BOOL transport_set_recv_callbacks (rdpTransport *transport, TransportRecv recv, void *extra)
 
BOOL transport_get_blocking (rdpTransport *transport)
 
BOOL transport_set_blocking (rdpTransport *transport, BOOL blocking)
 
BOOL transport_have_more_bytes_to_read (rdpTransport *transport)
 
int transport_tcp_connect (rdpTransport *transport, const char *hostname, int port, DWORD timeout)
 
HANDLE transport_get_front_bio (rdpTransport *transport)
 
BOOL transport_io_callback_set_event (rdpTransport *transport, BOOL set)
 
void transport_set_early_user_auth_mode (rdpTransport *transport, BOOL EUAMode)
 

Macro Definition Documentation

◆ BUFFER_SIZE

#define BUFFER_SIZE   16384

◆ TAG

#define TAG   FREERDP_TAG("core.transport")

FreeRDP: A Remote Desktop Protocol Implementation Network Transport Layer

Copyright 2011 Vic Lee

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

◆ WLog_ERR_BIO

#define WLog_ERR_BIO (   transport,
  biofunc,
  bio 
)     transport_bio_error_log(transport, biofunc, bio, __FILE__, __func__, __LINE__)

Function Documentation

◆ freerdp_get_transport()

rdpTransport* freerdp_get_transport ( rdpContext *  context)
Here is the caller graph for this function:

◆ parse_default_mode_pdu()

static SSIZE_T parse_default_mode_pdu ( rdpTransport *  transport,
wStream stream 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_nla_mode_pdu()

static SSIZE_T parse_nla_mode_pdu ( rdpTransport *  transport,
wStream stream 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_accept_nla()

BOOL transport_accept_nla ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_accept_rdp()

BOOL transport_accept_rdp ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_accept_rdstls()

BOOL transport_accept_rdstls ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_accept_tls()

BOOL transport_accept_tls ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_attach()

BOOL transport_attach ( rdpTransport *  transport,
int  sockfd 
)

Attach a socket to the transport layer.

!

The ownership of the socket provided by sockfd is taken if and only if the function is successful. In such a case the caller must no longer close or otherwise use the socket. If the function fails it is up to the caller to close the socket.

The implementation can be overridden by transport_set_io_callbacks(rdpTransportIo::TransportAttach)

Parameters
transportThe transport instance to attach the socket to
sockfdThe socket to attach to the transport
Returns
TRUE in case of success, FALSE otherwise.
Here is the caller graph for this function:

◆ transport_bio_error_log()

static void transport_bio_error_log ( rdpTransport *  transport,
LPCSTR  biofunc,
BIO *  bio,
LPCSTR  file,
LPCSTR  func,
DWORD  line 
)
static
Here is the call graph for this function:

◆ transport_check_fds()

int transport_check_fds ( rdpTransport *  transport)

Note: transport_read_pdu tries to read one PDU from the transport layer. The ReceiveBuffer might have a position > 0 in case of a non blocking transport. If transport_read_pdu returns 0 the pdu couldn't be read at this point. Note that transport->ReceiveBuffer is replaced after each iteration of this loop with a fresh stream instance from a pool.

status: -1: error 0: success 1: redirection

Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect()

BOOL transport_connect ( rdpTransport *  transport,
const char *  hostname,
UINT16  port,
DWORD  timeout 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect_aad()

BOOL transport_connect_aad ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect_childsession()

BOOL transport_connect_childsession ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect_nla()

BOOL transport_connect_nla ( rdpTransport *  transport,
BOOL  earlyUserAuth 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect_rdp()

BOOL transport_connect_rdp ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect_rdstls()

BOOL transport_connect_rdstls ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_connect_tls()

BOOL transport_connect_tls ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_accept_tls()

static BOOL transport_default_accept_tls ( rdpTransport *  transport)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_attach()

static BOOL transport_default_attach ( rdpTransport *  transport,
int  sockfd 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_connect_tls()

static BOOL transport_default_connect_tls ( rdpTransport *  transport)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_disconnect()

static BOOL transport_default_disconnect ( rdpTransport *  transport)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_get_public_key()

static BOOL transport_default_get_public_key ( rdpTransport *  transport,
const BYTE **  data,
DWORD *  length 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_read_pdu()

static int transport_default_read_pdu ( rdpTransport *  transport,
wStream s 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_default_set_blocking_mode()

static BOOL transport_default_set_blocking_mode ( rdpTransport *  transport,
BOOL  blocking 
)
static
Here is the caller graph for this function:

◆ transport_default_write()

static int transport_default_write ( rdpTransport *  transport,
wStream s 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_disconnect()

BOOL transport_disconnect ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_drain_output_buffer()

int transport_drain_output_buffer ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_free()

void transport_free ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_get_blocking()

BOOL transport_get_blocking ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_bytes_sent()

ULONG transport_get_bytes_sent ( rdpTransport *  transport,
BOOL  resetCount 
)
Here is the caller graph for this function:

◆ transport_get_context()

rdpContext* transport_get_context ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_event_handles()

DWORD transport_get_event_handles ( rdpTransport *  transport,
HANDLE *  events,
DWORD  count 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_get_front_bio()

HANDLE transport_get_front_bio ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_io_callbacks()

const rdpTransportIo* transport_get_io_callbacks ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_layer()

TRANSPORT_LAYER transport_get_layer ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_nla()

rdpNla* transport_get_nla ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_public_key()

BOOL transport_get_public_key ( rdpTransport *  transport,
const BYTE **  data,
DWORD *  length 
)
Here is the caller graph for this function:

◆ transport_get_tls()

rdpTls* transport_get_tls ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_get_tsg()

rdpTsg* transport_get_tsg ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_have_more_bytes_to_read()

BOOL transport_have_more_bytes_to_read ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_io_callback_set_event()

BOOL transport_io_callback_set_event ( rdpTransport *  transport,
BOOL  set 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_is_write_blocked()

BOOL transport_is_write_blocked ( rdpTransport *  transport)
Here is the caller graph for this function:

◆ transport_new()

rdpTransport* transport_new ( rdpContext *  context)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_parse_pdu()

SSIZE_T transport_parse_pdu ( rdpTransport *  transport,
wStream s,
BOOL *  incomplete 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_read_layer()

static SSIZE_T transport_read_layer ( rdpTransport *  transport,
BYTE data,
size_t  bytes 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_read_layer_bytes()

static SSIZE_T transport_read_layer_bytes ( rdpTransport *  transport,
wStream s,
size_t  toRead 
)
static

Tries to read toRead bytes from the specified transport.

Try to read toRead bytes from the transport to the stream. In case it was not possible to read toRead bytes 0 is returned. The stream is always advanced by the number of bytes read.

The function assumes that the stream has enough capacity to hold the data.

Parameters
[in]transportrdpTransport
[in]swStream
[in]toReadnumber of bytes to read
Returns
< 0 on error; 0 if not enough data is available (non blocking mode); 1 toRead bytes read
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_read_pdu()

int transport_read_pdu ( rdpTransport *  transport,
wStream s 
)

Try to read a complete PDU (NLA, fast-path or tpkt) from the underlying transport.

If possible a complete PDU is read, in case of non blocking transport this might not succeed. Except in case of an error the passed stream will point to the last byte read (correct position). When the pdu read is completed the stream is sealed and the pointer set to 0

Parameters
[in]transportrdpTransport
[in]swStream
Returns
< 0 on error; 0 if not enough data is available (non blocking mode); > 0 number of bytes of the complete pdu read
Here is the caller graph for this function:

◆ transport_send_stream_init()

wStream* transport_send_stream_init ( rdpTransport *  transport,
size_t  size 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_set_aad_mode()

void transport_set_aad_mode ( rdpTransport *  transport,
BOOL  AadMode 
)
Here is the caller graph for this function:

◆ transport_set_blocking()

BOOL transport_set_blocking ( rdpTransport *  transport,
BOOL  blocking 
)

◆ transport_set_blocking_mode()

BOOL transport_set_blocking_mode ( rdpTransport *  transport,
BOOL  blocking 
)
Here is the caller graph for this function:

◆ transport_set_connected_event()

BOOL transport_set_connected_event ( rdpTransport *  transport)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_set_early_user_auth_mode()

void transport_set_early_user_auth_mode ( rdpTransport *  transport,
BOOL  EUAMode 
)
Here is the caller graph for this function:

◆ transport_set_gateway_enabled()

void transport_set_gateway_enabled ( rdpTransport *  transport,
BOOL  GatewayEnabled 
)
Here is the caller graph for this function:

◆ transport_set_io_callbacks()

BOOL transport_set_io_callbacks ( rdpTransport *  transport,
const rdpTransportIo *  io_callbacks 
)
Here is the caller graph for this function:

◆ transport_set_layer()

BOOL transport_set_layer ( rdpTransport *  transport,
TRANSPORT_LAYER  layer 
)
Here is the caller graph for this function:

◆ transport_set_nla()

BOOL transport_set_nla ( rdpTransport *  transport,
rdpNla *  nla 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_set_nla_mode()

void transport_set_nla_mode ( rdpTransport *  transport,
BOOL  NlaMode 
)
Here is the caller graph for this function:

◆ transport_set_rdstls_mode()

void transport_set_rdstls_mode ( rdpTransport *  transport,
BOOL  RdstlsMode 
)
Here is the caller graph for this function:

◆ transport_set_recv_callbacks()

BOOL transport_set_recv_callbacks ( rdpTransport *  transport,
TransportRecv  recv,
void *  extra 
)
Here is the caller graph for this function:

◆ transport_set_tls()

BOOL transport_set_tls ( rdpTransport *  transport,
rdpTls *  tls 
)
Here is the call graph for this function:

◆ transport_set_tsg()

BOOL transport_set_tsg ( rdpTransport *  transport,
rdpTsg *  tsg 
)
Here is the call graph for this function:

◆ transport_ssl_cb()

static void transport_ssl_cb ( SSL *  ssl,
int  where,
int  ret 
)
static
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_take_from_pool()

wStream* transport_take_from_pool ( rdpTransport *  transport,
size_t  size 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_tcp_connect()

int transport_tcp_connect ( rdpTransport *  transport,
const char *  hostname,
int  port,
DWORD  timeout 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transport_write()

int transport_write ( rdpTransport *  transport,
wStream s 
)
Here is the caller graph for this function: