Merge "soc: qcom: hgsl: support handshake retry and handshake version 2"
This commit is contained in:
commit
425104746e
@ -295,51 +295,86 @@ static int rpc_handshake(struct hgsl_hyp_priv_t *priv,
|
|||||||
struct hgsl_hab_channel_t *hab_channel)
|
struct hgsl_hab_channel_t *hab_channel)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int rval = GSL_SUCCESS;
|
int rval = GSL_FAILURE;
|
||||||
struct gsl_hab_payload *send_buf = NULL;
|
struct gsl_hab_payload *send_buf = NULL;
|
||||||
struct gsl_hab_payload *recv_buf = NULL;
|
struct gsl_hab_payload *recv_buf = NULL;
|
||||||
struct handshake_params_t params = { 0 };
|
union {
|
||||||
|
struct handshake_params_t v1;
|
||||||
|
struct handshake_params_v2_t v2;
|
||||||
|
} params;
|
||||||
|
size_t params_size;
|
||||||
|
int handshake_version;
|
||||||
int tmp = 0;
|
int tmp = 0;
|
||||||
enum gsl_rpc_server_type_t server_type = GSL_RPC_SERVER_TYPE_LAST;
|
enum gsl_rpc_server_type_t server_type = GSL_RPC_SERVER_TYPE_LAST;
|
||||||
enum gsl_rpc_server_mode_t server_mode = GSL_RPC_SERVER_MODE_LAST;
|
enum gsl_rpc_server_mode_t server_mode = GSL_RPC_SERVER_MODE_LAST;
|
||||||
|
|
||||||
RPC_TRACE();
|
RPC_TRACE();
|
||||||
|
|
||||||
ret = hgsl_rpc_parcel_reset(hab_channel);
|
for (handshake_version = 2; handshake_version >= 1; handshake_version--) {
|
||||||
if (ret) {
|
ret = hgsl_rpc_parcel_reset(hab_channel);
|
||||||
LOGE("hgsl_rpc_parcel_reset failed %d", ret);
|
if (ret) {
|
||||||
goto out;
|
LOGE("hgsl_rpc_parcel_reset failed %d", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
send_buf = &hab_channel->send_buf;
|
||||||
|
recv_buf = &hab_channel->recv_buf;
|
||||||
|
|
||||||
|
switch (handshake_version) {
|
||||||
|
case 1:
|
||||||
|
params_size = sizeof(params.v1);
|
||||||
|
params.v1.client_type = g_client_type;
|
||||||
|
params.v1.client_version = g_client_version;
|
||||||
|
params.v1.pid = priv->client_pid;
|
||||||
|
params.v1.size = sizeof(params.v1);
|
||||||
|
strscpy(params.v1.name, priv->client_name, sizeof(params.v1.name));
|
||||||
|
LOGD("client process name is (%s), handshake version %d",
|
||||||
|
params.v1.name, handshake_version);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
params_size = sizeof(params.v2);
|
||||||
|
params.v2.client_type = g_client_type;
|
||||||
|
params.v2.client_version = g_client_version;
|
||||||
|
params.v2.pid = priv->client_pid;
|
||||||
|
params.v2.size = sizeof(params.v2);
|
||||||
|
strscpy(params.v2.name, priv->client_name, sizeof(params.v2.name));
|
||||||
|
params.v2.uid = from_kuid(current_user_ns(), current_uid());
|
||||||
|
LOGD("client process name is (%s), uid %u, handshake version %d",
|
||||||
|
params.v2.name, params.v2.uid, handshake_version);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOGE("Unknown handshake version %d", handshake_version);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = gsl_rpc_write(send_buf, ¶ms, params_size);
|
||||||
|
if (ret) {
|
||||||
|
LOGE("gsl_rpc_write failed %d", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = gsl_rpc_transact_ext(RPC_HANDSHAKE, handshake_version, hab_channel, 0);
|
||||||
|
if (ret) {
|
||||||
|
LOGE("gsl_rpc_transact_ext failed %d", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = gsl_rpc_read_int32_l(recv_buf, &rval);
|
||||||
|
if (ret) {
|
||||||
|
LOGE("gsl_rpc_read_int32_l failed %d", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rval != GSL_SUCCESS) {
|
||||||
|
LOGE("Handshake failed %d, BE sent error %d, try smaller version",
|
||||||
|
handshake_version, rval);
|
||||||
|
} else {
|
||||||
|
LOGD("Handshake success %d", handshake_version);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (ret == 0 && rval == GSL_SUCCESS) {
|
||||||
send_buf = &hab_channel->send_buf;
|
|
||||||
recv_buf = &hab_channel->recv_buf;
|
|
||||||
|
|
||||||
params.client_type = g_client_type;
|
|
||||||
params.client_version = g_client_version;
|
|
||||||
params.pid = priv->client_pid;
|
|
||||||
params.size = sizeof(params);
|
|
||||||
/* send the current process name to the server */
|
|
||||||
strscpy(params.name, priv->client_name, sizeof(params.name));
|
|
||||||
LOGD("client process name is (%s)", params.name);
|
|
||||||
|
|
||||||
ret = gsl_rpc_write(send_buf, ¶ms, sizeof(params));
|
|
||||||
if (ret) {
|
|
||||||
LOGE("gsl_rpc_write failed %d", ret);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = gsl_rpc_transact_ext(RPC_HANDSHAKE, 1, hab_channel, 0);
|
|
||||||
if (ret) {
|
|
||||||
LOGE("gsl_rpc_transact_ext failed %d", ret);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = gsl_rpc_read_int32_l(recv_buf, &rval);
|
|
||||||
if ((!ret) && (rval != GSL_SUCCESS)) {
|
|
||||||
LOGE("BE sent error %d", rval);
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
if (!ret) {
|
|
||||||
ret = gsl_rpc_read_int32_l(recv_buf, &priv->conn_id);
|
ret = gsl_rpc_read_int32_l(recv_buf, &priv->conn_id);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOGE("Failed to read conn_id %d", ret);
|
LOGE("Failed to read conn_id %d", ret);
|
||||||
|
@ -202,6 +202,7 @@ enum gsl_rpc_server_mode_t {
|
|||||||
|
|
||||||
#pragma pack(push, 4)
|
#pragma pack(push, 4)
|
||||||
|
|
||||||
|
/* For RPC_HANDSHAKE version < 2 */
|
||||||
struct handshake_params_t {
|
struct handshake_params_t {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t client_type;
|
uint32_t client_type;
|
||||||
@ -210,6 +211,18 @@ struct handshake_params_t {
|
|||||||
char name[RPC_CLIENT_NAME_SIZE];
|
char name[RPC_CLIENT_NAME_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct handshake_params_v2_t {
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t client_type;
|
||||||
|
uint32_t client_version;
|
||||||
|
uint32_t pid;
|
||||||
|
char name[RPC_CLIENT_NAME_SIZE];
|
||||||
|
/* user id in current namespace, if set to (uid_t)(-1),
|
||||||
|
* backend will ignore it and use default settings
|
||||||
|
*/
|
||||||
|
uint32_t uid;
|
||||||
|
};
|
||||||
|
|
||||||
struct sub_handshake_params_t {
|
struct sub_handshake_params_t {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t pid;
|
uint32_t pid;
|
||||||
|
Loading…
Reference in New Issue
Block a user