From 04575057219d78a0beae1eae69f11c0dae6867ed Mon Sep 17 00:00:00 2001 From: Massimiliano Pinto Date: Mon, 1 Jul 2013 11:37:26 +0200 Subject: [PATCH] Added DCB_STATE_CONNECT fro backe d connect status Added gw_decode_mysql_server_handshake() in mysql_common.c --- .../include/mysql_client_server_protocol.h | 15 ++-- modules/protocol/mysql_common.c | 73 +++++++++++++++++++ 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/modules/include/mysql_client_server_protocol.h b/modules/include/mysql_client_server_protocol.h index 006767cd6..03c0e21c7 100644 --- a/modules/include/mysql_client_server_protocol.h +++ b/modules/include/mysql_client_server_protocol.h @@ -103,13 +103,14 @@ typedef struct mysql_session { } MYSQL_session; /* MySQL Protocol States */ -#define MYSQL_ALLOC 0 /* Allocate data */ -#define MYSQL_AUTH_SENT 1 /* Authentication handshake has been sent */ -#define MYSQL_AUTH_RECV 2 /* Received user, password, db and capabilities */ -#define MYSQL_AUTH_FAILED 3 /* Auth failed, return error packet */ -#define MYSQL_IDLE 4 /* Auth done. Protocol is idle, waiting for statements */ -#define MYSQL_ROUTING 5 /* The received command has been routed to backend(s) */ -#define MYSQL_WAITING_RESULT 6 /* Waiting for result set */ +#define MYSQL_ALLOC 0 /* Allocate data */ +#define MYSQL_AUTH_SENT 1 /* Authentication handshake has been sent */ +#define MYSQL_AUTH_RECV 2 /* Received user, password, db and capabilities */ +#define MYSQL_AUTH_FAILED 3 /* Auth failed, return error packet */ +#define MYSQL_IDLE 4 /* Auth done. Protocol is idle, waiting for statements */ +#define MYSQL_ROUTING 5 /* The received command has been routed to backends */ +#define MYSQL_WAITING_RESULT 6 /* Waiting for result set */ +#define MYSQL_CONNECTED 7 /* Backend socket Connected */ /* Protocol packing macros. */ #define gw_mysql_set_byte2(__buffer, __int) do { \ diff --git a/modules/protocol/mysql_common.c b/modules/protocol/mysql_common.c index ffd3a7992..d9f5d45b5 100644 --- a/modules/protocol/mysql_common.c +++ b/modules/protocol/mysql_common.c @@ -92,3 +92,76 @@ void gw_mysql_close(MySQLProtocol **ptr) { #endif } +// Decode mysql handshake +int gw_decode_mysql_server_handshake(MySQLProtocol *conn, uint8_t *payload) { + int server_protocol; + uint8_t *server_version_end = NULL; + uint16_t mysql_server_capabilities_one; + uint16_t mysql_server_capabilities_two; + unsigned long tid =0; + uint8_t scramble_data_1[8] = ""; + uint8_t scramble_data_2[12] = ""; + uint8_t capab_ptr[4]; + int scramble_len; + uint8_t scramble[GW_MYSQL_SCRAMBLE_SIZE]; + uint32_t server_capabilities; + uint32_t final_capabilities; + + // zero the vars + memset(&server_capabilities, '\0', sizeof(server_capabilities)); + memset(&final_capabilities, '\0', sizeof(final_capabilities)); + + // Get server protocol + server_protocol= payload[0]; + + payload++; + + // Get server version (string) + server_version_end = (uint8_t *) gw_strend((char*) payload); + payload = server_version_end + 1; + + // get ThreadID + tid = gw_mysql_get_byte4(payload); + memcpy(&conn->tid, &tid, 4); + + payload +=4; + + // scramble_part 1 + memcpy(scramble_data_1, payload, 8); + payload += 8; + + // 1 filler + payload++; + + mysql_server_capabilities_one = gw_mysql_get_byte2(payload); + + //Get capabilities_part 1 (2 bytes) + 1 language + 2 server_status + payload +=5; + + mysql_server_capabilities_two = gw_mysql_get_byte2(payload); + + memcpy(&capab_ptr, &mysql_server_capabilities_one, 2); + + // get capabilities part 2 (2 bytes) + memcpy(&(capab_ptr[2]), &mysql_server_capabilities_two, 2); + + // 2 bytes shift + payload+=2; + + // get scramble len + scramble_len = payload[0] -1; + + payload += 11; + + // copy the second part of the scramble + memcpy(scramble_data_2, payload, scramble_len - 8); + + memcpy(scramble, scramble_data_1, 8); + memcpy(scramble + 8, scramble_data_2, scramble_len - 8); + + // full 20 bytes scramble is ready + memcpy(conn->scramble, scramble, GW_MYSQL_SCRAMBLE_SIZE); + + return 0; +} +///