static int rts_recv_flow_control_ack_with_destination_pdu(rdpRpc* rpc, BYTE* buffer, UINT32 length) { UINT32 offset; UINT32 Destination; UINT32 BytesReceived; UINT32 AvailableWindow; BYTE ChannelCookie[16]; /** * When the sender receives a FlowControlAck RTS PDU, it MUST use the following formula to * recalculate its Sender AvailableWindow variable: * * Sender AvailableWindow = Receiver AvailableWindow_from_ack - (BytesSent - BytesReceived_from_ack) * * Where: * * Receiver AvailableWindow_from_ack is the Available Window field in the Flow Control * Acknowledgement Structure (section 2.2.3.4) in the PDU received. * * BytesReceived_from_ack is the Bytes Received field in the Flow Control Acknowledgement structure * in the PDU received. * */ offset = 24; offset += rts_destination_command_read(rpc, &buffer[offset], length - offset, &Destination) + 4; offset += rts_flow_control_ack_command_read(rpc, &buffer[offset], length - offset, &BytesReceived, &AvailableWindow, (BYTE*) &ChannelCookie) + 4; WLog_DBG(TAG, "Receiving FlowControlAckWithDestination RTS PDU: BytesReceived: %"PRIu32" AvailableWindow: %"PRIu32"", BytesReceived, AvailableWindow); rpc->VirtualConnection->DefaultInChannel->SenderAvailableWindow = AvailableWindow - (rpc->VirtualConnection->DefaultInChannel->BytesSent - BytesReceived); return 1; }
static int rts_recv_flow_control_ack_pdu(rdpRpc* rpc, BYTE* buffer, UINT32 length) { UINT32 offset; UINT32 BytesReceived; UINT32 AvailableWindow; BYTE ChannelCookie[16]; offset = 24; offset += rts_flow_control_ack_command_read(rpc, &buffer[offset], length - offset, &BytesReceived, &AvailableWindow, (BYTE*) &ChannelCookie) + 4; WLog_ERR(TAG, "Receiving FlowControlAck RTS PDU: BytesReceived: %"PRIu32" AvailableWindow: %"PRIu32"", BytesReceived, AvailableWindow); rpc->VirtualConnection->DefaultInChannel->SenderAvailableWindow = AvailableWindow - (rpc->VirtualConnection->DefaultInChannel->BytesSent - BytesReceived); return 1; }
int rts_recv_flow_control_ack_with_destination_pdu(rdpRpc* rpc, BYTE* buffer, UINT32 length) { UINT32 offset; UINT32 Destination; UINT32 BytesReceived; UINT32 AvailableWindow; BYTE ChannelCookie[16]; /** * When the sender receives a FlowControlAck RTS PDU, it MUST use the following formula to * recalculate its Sender AvailableWindow variable: * * Sender AvailableWindow = Receiver AvailableWindow_from_ack - (BytesSent - BytesReceived_from_ack) * * Where: * * Receiver AvailableWindow_from_ack is the Available Window field in the Flow Control * Acknowledgement Structure (section 2.2.3.4) in the PDU received. * * BytesReceived_from_ack is the Bytes Received field in the Flow Control Acknowledgement structure * in the PDU received. * */ offset = 24; offset += rts_destination_command_read(rpc, &buffer[offset], length - offset, &Destination) + 4; offset += rts_flow_control_ack_command_read(rpc, &buffer[offset], length - offset, &BytesReceived, &AvailableWindow, (BYTE*) &ChannelCookie) + 4; #if 0 WLog_ERR(TAG, "Destination: %d BytesReceived: %d AvailableWindow: %d", Destination, BytesReceived, AvailableWindow); WLog_ERR(TAG, "ChannelCookie: " RPC_UUID_FORMAT_STRING "", RPC_UUID_FORMAT_ARGUMENTS(ChannelCookie)); #endif rpc->VirtualConnection->DefaultInChannel->SenderAvailableWindow = AvailableWindow - (rpc->VirtualConnection->DefaultInChannel->BytesSent - BytesReceived); return 0; }
int rts_recv_flow_control_ack_pdu(rdpRpc* rpc, BYTE* buffer, UINT32 length) { UINT32 offset; UINT32 BytesReceived; UINT32 AvailableWindow; BYTE ChannelCookie[16]; offset = 24; offset += rts_flow_control_ack_command_read(rpc, &buffer[offset], length - offset, &BytesReceived, &AvailableWindow, (BYTE*) &ChannelCookie) + 4; #if 0 WLog_ERR(TAG, "BytesReceived: %d AvailableWindow: %d", BytesReceived, AvailableWindow); WLog_ERR(TAG, "ChannelCookie: " RPC_UUID_FORMAT_STRING "", RPC_UUID_FORMAT_ARGUMENTS(ChannelCookie)); #endif rpc->VirtualConnection->DefaultInChannel->SenderAvailableWindow = AvailableWindow - (rpc->VirtualConnection->DefaultInChannel->BytesSent - BytesReceived); return 0; }
int rts_recv_pdu_commands(rdpRpc* rpc, RTS_PDU* rts_pdu) { int i; STREAM* s; UINT32 CommandType; DEBUG_RTS("numberOfCommands:%d", rts_pdu->header.numberOfCommands); if (rts_pdu->header.flags & RTS_FLAG_PING) { rts_send_keep_alive_pdu(rpc); return 0; } s = stream_new(0); stream_attach(s, rts_pdu->content, rts_pdu->header.frag_length); for (i = 0; i < rts_pdu->header.numberOfCommands; i++) { stream_read_UINT32(s, CommandType); /* CommandType (4 bytes) */ DEBUG_RTS("CommandType: %s (0x%08X)", RTS_CMD_STRINGS[CommandType % 14], CommandType); switch (CommandType) { case RTS_CMD_RECEIVE_WINDOW_SIZE: rts_receive_window_size_command_read(rpc, s); break; case RTS_CMD_FLOW_CONTROL_ACK: rts_flow_control_ack_command_read(rpc, s); break; case RTS_CMD_CONNECTION_TIMEOUT: rts_connection_timeout_command_read(rpc, s); break; case RTS_CMD_COOKIE: rts_cookie_command_read(rpc, s); break; case RTS_CMD_CHANNEL_LIFETIME: rts_channel_lifetime_command_read(rpc, s); break; case RTS_CMD_CLIENT_KEEPALIVE: rts_client_keepalive_command_read(rpc, s); break; case RTS_CMD_VERSION: rts_version_command_read(rpc, s); break; case RTS_CMD_EMPTY: rts_empty_command_read(rpc, s); break; case RTS_CMD_PADDING: rts_padding_command_read(rpc, s); break; case RTS_CMD_NEGATIVE_ANCE: rts_negative_ance_command_read(rpc, s); break; case RTS_CMD_ANCE: rts_ance_command_read(rpc, s); break; case RTS_CMD_CLIENT_ADDRESS: rts_client_address_command_read(rpc, s); break; case RTS_CMD_ASSOCIATION_GROUP_ID: rts_association_group_id_command_read(rpc, s); break; case RTS_CMD_DESTINATION: rts_destination_command_read(rpc, s); break; case RTS_CMD_PING_TRAFFIC_SENT_NOTIFY: rts_ping_traffic_sent_notify_command_read(rpc, s); break; default: printf("Error: Unknown RTS Command Type: 0x%x\n", CommandType); stream_detach(s) ; stream_free(s) ; return -1; break; } } stream_detach(s); stream_free(s); return 0; }