Blame libfreerdp/core/gateway/rts_signature.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Request To Send (RTS) PDU Signatures
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
Packit 1fb8d4
#include "rts_signature.h"
Packit 1fb8d4
Packit 1fb8d4
#define TAG FREERDP_TAG("core.gateway.rts")
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_A1_SIGNATURE = { RTS_FLAG_NONE, 4,
Packit 1fb8d4
	{ RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_RECEIVE_WINDOW_SIZE, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_A2_SIGNATURE = { RTS_FLAG_OUT_CHANNEL, 5,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_CHANNEL_LIFETIME,
Packit 1fb8d4
		RTS_CMD_RECEIVE_WINDOW_SIZE, 0, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_A3_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_B1_SIGNATURE = { RTS_FLAG_NONE, 6,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_CHANNEL_LIFETIME,
Packit 1fb8d4
		RTS_CMD_CLIENT_KEEPALIVE, RTS_CMD_ASSOCIATION_GROUP_ID, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_B2_SIGNATURE = { RTS_FLAG_IN_CHANNEL, 7,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_RECEIVE_WINDOW_SIZE,
Packit 1fb8d4
		RTS_CMD_CONNECTION_TIMEOUT, RTS_CMD_ASSOCIATION_GROUP_ID, RTS_CMD_CLIENT_ADDRESS, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_B3_SIGNATURE = { RTS_FLAG_NONE, 2,
Packit 1fb8d4
	{ RTS_CMD_RECEIVE_WINDOW_SIZE, RTS_CMD_VERSION, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_C1_SIGNATURE = { RTS_FLAG_NONE, 3,
Packit 1fb8d4
	{ RTS_CMD_VERSION, RTS_CMD_RECEIVE_WINDOW_SIZE, RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_CONN_C2_SIGNATURE = { RTS_FLAG_NONE, 3,
Packit 1fb8d4
	{ RTS_CMD_VERSION, RTS_CMD_RECEIVE_WINDOW_SIZE, RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_A1_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 4,
Packit 1fb8d4
	{ RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_COOKIE, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_A2_SIGNATURE = { RTS_FLAG_NONE, 4,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_COOKIE,
Packit 1fb8d4
		RTS_CMD_RECEIVE_WINDOW_SIZE, RTS_CMD_CONNECTION_TIMEOUT, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_A3_SIGNATURE = { RTS_FLAG_NONE, 4,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_DESTINATION, RTS_CMD_VERSION, RTS_CMD_RECEIVE_WINDOW_SIZE,
Packit 1fb8d4
		RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_A4_SIGNATURE = { RTS_FLAG_NONE, 4,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_DESTINATION, RTS_CMD_VERSION, RTS_CMD_RECEIVE_WINDOW_SIZE,
Packit 1fb8d4
		RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_A5_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_A6_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_B1_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_EMPTY, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R1_B2_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_RECEIVE_WINDOW_SIZE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R2_A1_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 4,
Packit 1fb8d4
	{ RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_COOKIE, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R2_A2_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R2_A3_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R2_A4_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_IN_R2_A5_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A1_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 1,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A2_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 1,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A3_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 5,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_COOKIE,
Packit 1fb8d4
		RTS_CMD_RECEIVE_WINDOW_SIZE, 0, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A4_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL | RTS_FLAG_OUT_CHANNEL, 7,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_CHANNEL_LIFETIME,
Packit 1fb8d4
		RTS_CMD_RECEIVE_WINDOW_SIZE, RTS_CMD_CONNECTION_TIMEOUT, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A5_SIGNATURE = { RTS_FLAG_OUT_CHANNEL, 3,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_VERSION, RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A6_SIGNATURE = { RTS_FLAG_OUT_CHANNEL, 3,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_VERSION, RTS_CMD_CONNECTION_TIMEOUT, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A7_SIGNATURE = { RTS_FLAG_OUT_CHANNEL, 2,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A8_SIGNATURE = { RTS_FLAG_OUT_CHANNEL, 2,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A9_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A10_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R1_A11_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A1_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 1,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A2_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 1,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A3_SIGNATURE = { RTS_FLAG_RECYCLE_CHANNEL, 5,
Packit 1fb8d4
	{
Packit 1fb8d4
		RTS_CMD_VERSION, RTS_CMD_COOKIE, RTS_CMD_COOKIE, RTS_CMD_COOKIE,
Packit 1fb8d4
		RTS_CMD_RECEIVE_WINDOW_SIZE, 0, 0, 0
Packit 1fb8d4
	}
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A4_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A5_SIGNATURE = { RTS_FLAG_NONE, 2,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A6_SIGNATURE = { RTS_FLAG_NONE, 2,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A7_SIGNATURE = { RTS_FLAG_NONE, 3,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_COOKIE, RTS_CMD_VERSION, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_A8_SIGNATURE = { RTS_FLAG_OUT_CHANNEL, 2,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_COOKIE, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_B1_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_B2_SIGNATURE = { RTS_FLAG_NONE, 1,
Packit 1fb8d4
	{ RTS_CMD_NEGATIVE_ANCE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_B3_SIGNATURE = { RTS_FLAG_EOF, 1,
Packit 1fb8d4
	{ RTS_CMD_ANCE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_OUT_R2_C1_SIGNATURE = { RTS_FLAG_PING, 1,
Packit 1fb8d4
	{ 0, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
const RtsPduSignature RTS_PDU_KEEP_ALIVE_SIGNATURE = { RTS_FLAG_OTHER_CMD, 1,
Packit 1fb8d4
	{ RTS_CMD_CLIENT_KEEPALIVE, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_PING_TRAFFIC_SENT_NOTIFY_SIGNATURE = { RTS_FLAG_OTHER_CMD, 1,
Packit 1fb8d4
	{ RTS_CMD_PING_TRAFFIC_SENT_NOTIFY, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_ECHO_SIGNATURE = { RTS_FLAG_ECHO, 0,
Packit 1fb8d4
	{ 0, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_PING_SIGNATURE = { RTS_FLAG_PING, 0,
Packit 1fb8d4
	{ 0, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_FLOW_CONTROL_ACK_SIGNATURE = { RTS_FLAG_OTHER_CMD, 1,
Packit 1fb8d4
	{ RTS_CMD_FLOW_CONTROL_ACK, 0, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
const RtsPduSignature RTS_PDU_FLOW_CONTROL_ACK_WITH_DESTINATION_SIGNATURE = { RTS_FLAG_OTHER_CMD, 2,
Packit 1fb8d4
	{ RTS_CMD_DESTINATION, RTS_CMD_FLOW_CONTROL_ACK, 0, 0, 0, 0, 0, 0 }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static const RTS_PDU_SIGNATURE_ENTRY RTS_PDU_SIGNATURE_TABLE[] =
Packit 1fb8d4
{
Packit 1fb8d4
	{ RTS_PDU_CONN_A1, FALSE, &RTS_PDU_CONN_A1_SIGNATURE, "CONN/A1" },
Packit 1fb8d4
	{ RTS_PDU_CONN_A2, FALSE, &RTS_PDU_CONN_A2_SIGNATURE, "CONN/A2" },
Packit 1fb8d4
	{ RTS_PDU_CONN_A3, TRUE, &RTS_PDU_CONN_A3_SIGNATURE, "CONN/A3" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_CONN_B1, FALSE, &RTS_PDU_CONN_B1_SIGNATURE, "CONN/B1" },
Packit 1fb8d4
	{ RTS_PDU_CONN_B2, FALSE, &RTS_PDU_CONN_B2_SIGNATURE, "CONN/B2" },
Packit 1fb8d4
	{ RTS_PDU_CONN_B3, FALSE, &RTS_PDU_CONN_B3_SIGNATURE, "CONN/B3" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_CONN_C1, FALSE, &RTS_PDU_CONN_C1_SIGNATURE, "CONN/C1" },
Packit 1fb8d4
	{ RTS_PDU_CONN_C2, TRUE, &RTS_PDU_CONN_C2_SIGNATURE, "CONN/C2" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_IN_R1_A1, FALSE, &RTS_PDU_IN_R1_A1_SIGNATURE, "IN_R1/A1" },
Packit 1fb8d4
	{ RTS_PDU_IN_R1_A2, FALSE, &RTS_PDU_IN_R1_A2_SIGNATURE, "IN_R1/A2" },
Packit 1fb8d4
	{ RTS_PDU_IN_R1_A3, FALSE, &RTS_PDU_IN_R1_A3_SIGNATURE, "IN_R1/A3" },
Packit 1fb8d4
	{ RTS_PDU_IN_R1_A4, TRUE, &RTS_PDU_IN_R1_A4_SIGNATURE, "IN_R1/A4" },
Packit 1fb8d4
	{ RTS_PDU_IN_R1_A5, TRUE, &RTS_PDU_IN_R1_A5_SIGNATURE, "IN_R1/A5" },
Packit 1fb8d4
	{ RTS_PDU_IN_R1_A6, FALSE, &RTS_PDU_IN_R1_A6_SIGNATURE, "IN_R1/A6" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_IN_R1_B1, FALSE, &RTS_PDU_IN_R1_B1_SIGNATURE, "IN_R1/B1" },
Packit 1fb8d4
	{ RTS_PDU_IN_R1_B2, FALSE, &RTS_PDU_IN_R1_B2_SIGNATURE, "IN_R1/B2" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_IN_R2_A1, FALSE, &RTS_PDU_IN_R2_A1_SIGNATURE, "IN_R2/A1" },
Packit 1fb8d4
	{ RTS_PDU_IN_R2_A2, FALSE, &RTS_PDU_IN_R2_A2_SIGNATURE, "IN_R2/A2" },
Packit 1fb8d4
	{ RTS_PDU_IN_R2_A3, FALSE, &RTS_PDU_IN_R2_A3_SIGNATURE, "IN_R2/A3" },
Packit 1fb8d4
	{ RTS_PDU_IN_R2_A4, TRUE, &RTS_PDU_IN_R2_A4_SIGNATURE, "IN_R2/A4" },
Packit 1fb8d4
	{ RTS_PDU_IN_R2_A5, FALSE, &RTS_PDU_IN_R2_A5_SIGNATURE, "IN_R2/A5" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A1, FALSE, &RTS_PDU_OUT_R1_A1_SIGNATURE, "OUT_R1/A1" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A2, TRUE, &RTS_PDU_OUT_R1_A2_SIGNATURE, "OUT_R1/A2" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A3, FALSE, &RTS_PDU_OUT_R1_A3_SIGNATURE, "OUT_R1/A3" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A4, FALSE, &RTS_PDU_OUT_R1_A4_SIGNATURE, "OUT_R1/A4" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A5, FALSE, &RTS_PDU_OUT_R1_A5_SIGNATURE, "OUT_R1/A5" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A6, TRUE, &RTS_PDU_OUT_R1_A6_SIGNATURE, "OUT_R1/A6" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A7, FALSE, &RTS_PDU_OUT_R1_A7_SIGNATURE, "OUT_R1/A7" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A8, FALSE, &RTS_PDU_OUT_R1_A8_SIGNATURE, "OUT_R1/A8" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A9, FALSE, &RTS_PDU_OUT_R1_A9_SIGNATURE, "OUT_R1/A9" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A10, TRUE, &RTS_PDU_OUT_R1_A10_SIGNATURE, "OUT_R1/A10" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R1_A11, FALSE, &RTS_PDU_OUT_R1_A11_SIGNATURE, "OUT_R1/A11" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A1, FALSE, &RTS_PDU_OUT_R2_A1_SIGNATURE, "OUT_R2/A1" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A2, TRUE, &RTS_PDU_OUT_R2_A2_SIGNATURE, "OUT_R2/A2" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A3, FALSE, &RTS_PDU_OUT_R2_A3_SIGNATURE, "OUT_R2/A3" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A4, FALSE, &RTS_PDU_OUT_R2_A4_SIGNATURE, "OUT_R2/A4" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A5, FALSE, &RTS_PDU_OUT_R2_A5_SIGNATURE, "OUT_R2/A5" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A6, TRUE, &RTS_PDU_OUT_R2_A6_SIGNATURE, "OUT_R2/A6" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A7, FALSE, &RTS_PDU_OUT_R2_A7_SIGNATURE, "OUT_R2/A7" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_A8, FALSE, &RTS_PDU_OUT_R2_A8_SIGNATURE, "OUT_R2/A8" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_B1, FALSE, &RTS_PDU_OUT_R2_B1_SIGNATURE, "OUT_R2/B1" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_B2, FALSE, &RTS_PDU_OUT_R2_B2_SIGNATURE, "OUT_R2/B2" },
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_B3, TRUE, &RTS_PDU_OUT_R2_B3_SIGNATURE, "OUT_R2/B3" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_OUT_R2_C1, FALSE, &RTS_PDU_OUT_R2_C1_SIGNATURE, "OUT_R2/C1" },
Packit 1fb8d4
Packit 1fb8d4
	{ RTS_PDU_KEEP_ALIVE, TRUE, &RTS_PDU_KEEP_ALIVE_SIGNATURE, "Keep-Alive" },
Packit 1fb8d4
	{ RTS_PDU_PING_TRAFFIC_SENT_NOTIFY, TRUE, &RTS_PDU_PING_TRAFFIC_SENT_NOTIFY_SIGNATURE, "Ping Traffic Sent Notify" },
Packit 1fb8d4
	{ RTS_PDU_ECHO, TRUE, &RTS_PDU_ECHO_SIGNATURE, "Echo" },
Packit 1fb8d4
	{ RTS_PDU_PING, TRUE, &RTS_PDU_PING_SIGNATURE, "Ping" },
Packit 1fb8d4
	{ RTS_PDU_FLOW_CONTROL_ACK, TRUE, &RTS_PDU_FLOW_CONTROL_ACK_SIGNATURE, "FlowControlAck" },
Packit 1fb8d4
	{ RTS_PDU_FLOW_CONTROL_ACK_WITH_DESTINATION, TRUE, &RTS_PDU_FLOW_CONTROL_ACK_WITH_DESTINATION_SIGNATURE, "FlowControlAckWithDestination" },
Packit 1fb8d4
Packit 1fb8d4
	{ 0, FALSE, NULL, NULL }
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
BOOL rts_match_pdu_signature(const RtsPduSignature* signature,
Packit 1fb8d4
                             const rpcconn_rts_hdr_t* rts)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT16 i;
Packit 1fb8d4
	int status;
Packit 1fb8d4
	const BYTE* buffer;
Packit 1fb8d4
	UINT32 length;
Packit 1fb8d4
	UINT32 offset;
Packit 1fb8d4
	UINT32 CommandType;
Packit 1fb8d4
	UINT32 CommandLength;
Packit 1fb8d4
Packit 1fb8d4
	if (!signature || !rts)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (rts->Flags != signature->Flags)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (rts->NumberOfCommands != signature->NumberOfCommands)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	buffer = (const BYTE*) rts;
Packit 1fb8d4
	offset = RTS_PDU_HEADER_LENGTH;
Packit 1fb8d4
	length = rts->frag_length - offset;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < rts->NumberOfCommands; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		CommandType = *((UINT32*) &buffer[offset]); /* CommandType (4 bytes) */
Packit 1fb8d4
		offset += 4;
Packit 1fb8d4
Packit 1fb8d4
		if (CommandType != signature->CommandTypes[i])
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		status = rts_command_length(CommandType, &buffer[offset], length);
Packit 1fb8d4
Packit 1fb8d4
		if (status < 0)
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		CommandLength = (UINT32) status;
Packit 1fb8d4
		offset += CommandLength;
Packit 1fb8d4
		length = rts->frag_length - offset;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rts_extract_pdu_signature(RtsPduSignature* signature, const rpcconn_rts_hdr_t* rts)
Packit 1fb8d4
{
Packit 1fb8d4
	int i;
Packit 1fb8d4
	int status;
Packit 1fb8d4
	BYTE* buffer;
Packit 1fb8d4
	UINT32 length;
Packit 1fb8d4
	UINT32 offset;
Packit 1fb8d4
	UINT32 CommandType;
Packit 1fb8d4
	UINT32 CommandLength;
Packit 1fb8d4
Packit 1fb8d4
	if (!signature || !rts)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	signature->Flags = rts->Flags;
Packit 1fb8d4
	signature->NumberOfCommands = rts->NumberOfCommands;
Packit 1fb8d4
	buffer = (BYTE*) rts;
Packit 1fb8d4
	offset = RTS_PDU_HEADER_LENGTH;
Packit 1fb8d4
	length = rts->frag_length - offset;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < rts->NumberOfCommands; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		CommandType = *((UINT32*) &buffer[offset]); /* CommandType (4 bytes) */
Packit 1fb8d4
		offset += 4;
Packit 1fb8d4
		signature->CommandTypes[i] = CommandType;
Packit 1fb8d4
		status = rts_command_length(CommandType, &buffer[offset], length);
Packit 1fb8d4
Packit 1fb8d4
		if (status < 0)
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		CommandLength = (UINT32) status;
Packit 1fb8d4
		offset += CommandLength;
Packit 1fb8d4
		length = rts->frag_length - offset;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
UINT32 rts_identify_pdu_signature(const RtsPduSignature* signature,
Packit 1fb8d4
                                  const RTS_PDU_SIGNATURE_ENTRY** entry)
Packit 1fb8d4
{
Packit 1fb8d4
	size_t i, j;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; RTS_PDU_SIGNATURE_TABLE[i].SignatureId != 0; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		const RtsPduSignature* pSignature = RTS_PDU_SIGNATURE_TABLE[i].Signature;
Packit 1fb8d4
Packit 1fb8d4
		if (!RTS_PDU_SIGNATURE_TABLE[i].SignatureClient)
Packit 1fb8d4
			continue;
Packit 1fb8d4
Packit 1fb8d4
		if (signature->Flags != pSignature->Flags)
Packit 1fb8d4
			continue;
Packit 1fb8d4
Packit 1fb8d4
		if (signature->NumberOfCommands != pSignature->NumberOfCommands)
Packit 1fb8d4
			continue;
Packit 1fb8d4
Packit 1fb8d4
		for (j = 0; j < signature->NumberOfCommands; j++)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (signature->CommandTypes[j] != pSignature->CommandTypes[j])
Packit 1fb8d4
				continue;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (entry)
Packit 1fb8d4
			*entry = &RTS_PDU_SIGNATURE_TABLE[i];
Packit 1fb8d4
Packit 1fb8d4
		return RTS_PDU_SIGNATURE_TABLE[i].SignatureId;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rts_print_pdu_signature(const RtsPduSignature* signature)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 SignatureId;
Packit 1fb8d4
	const RTS_PDU_SIGNATURE_ENTRY* entry;
Packit 1fb8d4
Packit 1fb8d4
	if (!signature)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	WLog_INFO(TAG,  "RTS PDU Signature: Flags: 0x%04"PRIX16" NumberOfCommands: %"PRIu16"",
Packit 1fb8d4
	          signature->Flags, signature->NumberOfCommands);
Packit 1fb8d4
	SignatureId = rts_identify_pdu_signature(signature, &entry);
Packit 1fb8d4
Packit 1fb8d4
	if (SignatureId)
Packit 1fb8d4
		WLog_ERR(TAG,  "Identified %s RTS PDU", entry->PduName);
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}