typedef BOOL (*pRTTMeasureRequest)(rdpContext* context, UINT16 sequenceNumber);
typedef BOOL (*pRTTMeasureResponse)(rdpContext* context, UINT16 sequenceNumber);
typedef BOOL (*pBandwidthMeasureStart)(rdpContext* context, UINT16 sequenceNumber);
-typedef BOOL (*pBandwidthMeasurePayload)(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber);
-typedef BOOL (*pBandwidthMeasureStop)(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber);
+typedef BOOL (*pBandwidthMeasureStop)(rdpContext* context, UINT16 sequenceNumber);
typedef BOOL (*pBandwidthMeasureResults)(rdpContext* context, UINT16 sequenceNumber);
typedef BOOL (*pNetworkCharacteristicsResult)(rdpContext* context, UINT16 sequenceNumber);
ALIGN64 pRTTMeasureRequest RTTMeasureRequest; /* 16 */
ALIGN64 pRTTMeasureResponse RTTMeasureResponse; /* 17 */
ALIGN64 pBandwidthMeasureStart BandwidthMeasureStart; /* 18 */
- ALIGN64 pBandwidthMeasurePayload BandwidthMeasurePayload; /* 19 */
- ALIGN64 pBandwidthMeasureStop BandwidthMeasureStop; /* 20 */
- ALIGN64 pBandwidthMeasureResults BandwidthMeasureResults; /* 21 */
- ALIGN64 pNetworkCharacteristicsResult NetworkCharacteristicsResult; /* 22 */
- UINT64 paddingB[32 - 23]; /* 23 */
+ ALIGN64 pBandwidthMeasureStop BandwidthMeasureStop; /* 19 */
+ ALIGN64 pBandwidthMeasureResults BandwidthMeasureResults; /* 20 */
+ ALIGN64 pNetworkCharacteristicsResult NetworkCharacteristicsResult; /* 21 */
+ UINT64 paddingB[32 - 22]; /* 22 */
};
UINT16 responseType;
} AUTODETECT_RSP_PDU;
-static BOOL autodetect_send_rtt_measure_request(rdpContext* context, UINT16 sequenceNumber)
+static BOOL autodetect_send_rtt_measure_request(rdpContext* context, UINT16 sequenceNumber, UINT16 requestType)
{
wStream* s;
Stream_Write_UINT8(s, 0x06); /* headerLength (1 byte) */
Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */
Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */
- Stream_Write_UINT16(s, 0x0001); /* requestType (2 bytes) */
+ Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */
context->rdp->autodetect->rttMeasureStartTime = GetTickCount();
return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ);
}
+static BOOL autodetect_send_continuous_rtt_measure_request(rdpContext* context, UINT16 sequenceNumber)
+{
+ return autodetect_send_rtt_measure_request(context, sequenceNumber, 0x0001);
+}
+
+BOOL autodetect_send_connecttime_rtt_measure_request(rdpContext* context, UINT16 sequenceNumber)
+{
+ return autodetect_send_rtt_measure_request(context, sequenceNumber, 0x1001);
+}
+
static BOOL autodetect_send_rtt_measure_response(rdpRdp* rdp, UINT16 sequenceNumber)
{
wStream* s;
return rdp_send_message_channel_pdu(rdp, s, SEC_AUTODETECT_RSP);
}
-static BOOL autodetect_send_bandwidth_measure_start(rdpContext* context, UINT16 sequenceNumber)
+static BOOL autodetect_send_bandwidth_measure_start(rdpContext* context, UINT16 sequenceNumber, UINT16 requestType)
{
wStream* s;
Stream_Write_UINT8(s, 0x06); /* headerLength (1 byte) */
Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */
Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */
- Stream_Write_UINT16(s, 0x0014); /* requestType (2 bytes) */
+ Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */
return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ);
}
-static BOOL autodetect_send_bandwidth_measure_payload(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber)
+static BOOL autodetect_send_continuous_bandwidth_measure_start(rdpContext* context, UINT16 sequenceNumber)
+{
+ return autodetect_send_bandwidth_measure_start(context, sequenceNumber, 0x0014);
+}
+
+BOOL autodetect_send_connecttime_bandwidth_measure_start(rdpContext* context, UINT16 sequenceNumber)
+{
+ return autodetect_send_bandwidth_measure_start(context, sequenceNumber, 0x1014);
+}
+
+BOOL autodetect_send_bandwidth_measure_payload(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber)
{
- UINT32 i;
+ UINT16 i;
wStream* s;
s = rdp_message_channel_pdu_init(context->rdp);
return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ);
}
-static BOOL autodetect_send_bandwidth_measure_stop(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber)
+static BOOL autodetect_send_bandwidth_measure_stop(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber, UINT16 requestType)
{
- UINT32 i;
+ UINT16 i;
wStream* s;
s = rdp_message_channel_pdu_init(context->rdp);
/* 4-bytes aligned */
payloadLength &= ~3;
- Stream_Write_UINT8(s, 0x08); /* headerLength (1 byte) */
+ Stream_Write_UINT8(s, requestType == 0x002B ? 0x08 : 0x06); /* headerLength (1 byte) */
Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */
Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */
- Stream_Write_UINT16(s, 0x002B); /* requestType (2 bytes) */
- Stream_Write_UINT16(s, payloadLength); /* payloadLength (2 bytes) */
- if (payloadLength > 0)
+ Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */
+ if (requestType == 0x002B)
{
- Stream_EnsureRemainingCapacity(s, payloadLength);
- /* Random data (better measurement in case the line is compressed) */
- for (i = 0; i < payloadLength / 4; i++)
+ Stream_Write_UINT16(s, payloadLength); /* payloadLength (2 bytes) */
+ if (payloadLength > 0)
{
- Stream_Write_UINT32(s, rand());
+ Stream_EnsureRemainingCapacity(s, payloadLength);
+ /* Random data (better measurement in case the line is compressed) */
+ for (i = 0; i < payloadLength / 4; i++)
+ {
+ Stream_Write_UINT32(s, rand());
+ }
}
}
return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ);
}
+static BOOL autodetect_send_continuous_bandwidth_measure_stop(rdpContext* context, UINT16 sequenceNumber)
+{
+ return autodetect_send_bandwidth_measure_stop(context, 0, sequenceNumber, 0x0429);
+}
+
+BOOL autodetect_send_connecttime_bandwidth_measure_stop(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber)
+{
+ return autodetect_send_bandwidth_measure_stop(context, payloadLength, sequenceNumber, 0x002B);
+}
+
static BOOL autodetect_send_bandwidth_measure_results(rdpRdp* rdp, UINT16 responseType, UINT16 sequenceNumber)
{
wStream* s;
void autodetect_register_server_callbacks(rdpAutoDetect* autodetect)
{
- autodetect->RTTMeasureRequest = autodetect_send_rtt_measure_request;
- autodetect->BandwidthMeasureStart = autodetect_send_bandwidth_measure_start;
- autodetect->BandwidthMeasurePayload = autodetect_send_bandwidth_measure_payload;
- autodetect->BandwidthMeasureStop = autodetect_send_bandwidth_measure_stop;
+ autodetect->RTTMeasureRequest = autodetect_send_continuous_rtt_measure_request;
+ autodetect->BandwidthMeasureStart = autodetect_send_continuous_bandwidth_measure_start;
+ autodetect->BandwidthMeasureStop = autodetect_send_continuous_bandwidth_measure_stop;
autodetect->NetworkCharacteristicsResult = autodetect_send_netchar_result;
}