FreeRDP
|
#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 (const SSL *ssl, int where, int ret) |
wStream * | transport_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) |
rdpTransportLayer * | transport_connect_layer (rdpTransport *transport, const char *hostname, int port, DWORD timeout) |
static rdpTransportLayer * | transport_default_connect_layer (rdpTransport *transport, const char *hostname, int port, DWORD timeout) |
BOOL | transport_attach_layer (rdpTransport *transport, rdpTransportLayer *layer) |
Attach a transport layer. More... | |
static BOOL | transport_default_attach_layer (rdpTransport *transport, rdpTransportLayer *layer) |
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) |
wStream * | transport_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) |
rdpTransportLayer * | transport_layer_new (rdpTransport *transport, size_t contextSize) |
void | transport_layer_free (rdpTransportLayer *layer) |
static int | transport_layer_bio_write (BIO *bio, const char *buf, int size) |
static int | transport_layer_bio_read (BIO *bio, char *buf, int size) |
static int | transport_layer_bio_puts (BIO *bio, const char *str) |
static int | transport_layer_bio_gets (BIO *bio, char *str, int size) |
static long | transport_layer_bio_ctrl (BIO *bio, int cmd, long arg1, void *arg2) |
static int | transport_layer_bio_new (BIO *bio) |
static int | transport_layer_bio_free (BIO *bio) |
BIO_METHOD * | BIO_s_transport_layer (void) |
#define BUFFER_SIZE 16384 |
#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.
#define WLog_ERR_BIO | ( | transport, | |
biofunc, | |||
bio | |||
) | transport_bio_error_log(transport, biofunc, bio, __FILE__, __func__, __LINE__) |
BIO_METHOD* BIO_s_transport_layer | ( | void | ) |
rdpTransport* freerdp_get_transport | ( | rdpContext * | context | ) |
|
static |
|
static |
BOOL transport_accept_nla | ( | rdpTransport * | transport | ) |
BOOL transport_accept_rdp | ( | rdpTransport * | transport | ) |
BOOL transport_accept_rdstls | ( | rdpTransport * | transport | ) |
BOOL transport_accept_tls | ( | rdpTransport * | transport | ) |
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)
transport | The transport instance to attach the socket to |
sockfd | The socket to attach to the transport |
BOOL transport_attach_layer | ( | rdpTransport * | transport, |
rdpTransportLayer * | layer | ||
) |
Attach a transport layer.
!
The ownership of the transport layer provided by layer is taken if and only if the function is successful. In such a case the caller must no longer free or otherwise use the layer. If the function fails it is up to the caller to free the layer.
The implementation can be overridden by transport_set_io_callbacks(rdpTransportIo::AttachLayer)
transport | The transport instance to attach the socket to |
layer | The layer to attach to the transport |
|
static |
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
BOOL transport_connect | ( | rdpTransport * | transport, |
const char * | hostname, | ||
UINT16 | port, | ||
DWORD | timeout | ||
) |
BOOL transport_connect_aad | ( | rdpTransport * | transport | ) |
BOOL transport_connect_childsession | ( | rdpTransport * | transport | ) |
rdpTransportLayer* transport_connect_layer | ( | rdpTransport * | transport, |
const char * | hostname, | ||
int | port, | ||
DWORD | timeout | ||
) |
BOOL transport_connect_nla | ( | rdpTransport * | transport, |
BOOL | earlyUserAuth | ||
) |
BOOL transport_connect_rdp | ( | rdpTransport * | transport | ) |
BOOL transport_connect_rdstls | ( | rdpTransport * | transport | ) |
BOOL transport_connect_tls | ( | rdpTransport * | transport | ) |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
BOOL transport_disconnect | ( | rdpTransport * | transport | ) |
int transport_drain_output_buffer | ( | rdpTransport * | transport | ) |
void transport_free | ( | rdpTransport * | transport | ) |
BOOL transport_get_blocking | ( | rdpTransport * | transport | ) |
ULONG transport_get_bytes_sent | ( | rdpTransport * | transport, |
BOOL | resetCount | ||
) |
rdpContext* transport_get_context | ( | rdpTransport * | transport | ) |
DWORD transport_get_event_handles | ( | rdpTransport * | transport, |
HANDLE * | events, | ||
DWORD | count | ||
) |
HANDLE transport_get_front_bio | ( | rdpTransport * | transport | ) |
const rdpTransportIo* transport_get_io_callbacks | ( | rdpTransport * | transport | ) |
TRANSPORT_LAYER transport_get_layer | ( | rdpTransport * | transport | ) |
rdpNla* transport_get_nla | ( | rdpTransport * | transport | ) |
BOOL transport_get_public_key | ( | rdpTransport * | transport, |
const BYTE ** | data, | ||
DWORD * | length | ||
) |
rdpTls* transport_get_tls | ( | rdpTransport * | transport | ) |
rdpTsg* transport_get_tsg | ( | rdpTransport * | transport | ) |
BOOL transport_have_more_bytes_to_read | ( | rdpTransport * | transport | ) |
BOOL transport_io_callback_set_event | ( | rdpTransport * | transport, |
BOOL | set | ||
) |
BOOL transport_is_write_blocked | ( | rdpTransport * | transport | ) |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
void transport_layer_free | ( | rdpTransportLayer * | layer | ) |
rdpTransportLayer* transport_layer_new | ( | rdpTransport * | transport, |
size_t | contextSize | ||
) |
rdpTransport* transport_new | ( | rdpContext * | context | ) |
SSIZE_T transport_parse_pdu | ( | rdpTransport * | transport, |
wStream * | s, | ||
BOOL * | incomplete | ||
) |
|
static |
|
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.
[in] | transport | rdpTransport |
[in] | s | wStream |
[in] | toRead | number of bytes to read |
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
[in] | transport | rdpTransport |
[in] | s | wStream |
wStream* transport_send_stream_init | ( | rdpTransport * | transport, |
size_t | size | ||
) |
void transport_set_aad_mode | ( | rdpTransport * | transport, |
BOOL | AadMode | ||
) |
BOOL transport_set_blocking | ( | rdpTransport * | transport, |
BOOL | blocking | ||
) |
BOOL transport_set_blocking_mode | ( | rdpTransport * | transport, |
BOOL | blocking | ||
) |
BOOL transport_set_connected_event | ( | rdpTransport * | transport | ) |
void transport_set_early_user_auth_mode | ( | rdpTransport * | transport, |
BOOL | EUAMode | ||
) |
void transport_set_gateway_enabled | ( | rdpTransport * | transport, |
BOOL | GatewayEnabled | ||
) |
BOOL transport_set_io_callbacks | ( | rdpTransport * | transport, |
const rdpTransportIo * | io_callbacks | ||
) |
BOOL transport_set_layer | ( | rdpTransport * | transport, |
TRANSPORT_LAYER | layer | ||
) |
BOOL transport_set_nla | ( | rdpTransport * | transport, |
rdpNla * | nla | ||
) |
void transport_set_nla_mode | ( | rdpTransport * | transport, |
BOOL | NlaMode | ||
) |
void transport_set_rdstls_mode | ( | rdpTransport * | transport, |
BOOL | RdstlsMode | ||
) |
BOOL transport_set_recv_callbacks | ( | rdpTransport * | transport, |
TransportRecv | recv, | ||
void * | extra | ||
) |
BOOL transport_set_tls | ( | rdpTransport * | transport, |
rdpTls * | tls | ||
) |
BOOL transport_set_tsg | ( | rdpTransport * | transport, |
rdpTsg * | tsg | ||
) |
|
static |
wStream* transport_take_from_pool | ( | rdpTransport * | transport, |
size_t | size | ||
) |
int transport_tcp_connect | ( | rdpTransport * | transport, |
const char * | hostname, | ||
int | port, | ||
DWORD | timeout | ||
) |
int transport_write | ( | rdpTransport * | transport, |
wStream * | s | ||
) |