示例#1
0
static void process_incoming_feature_mask(uint8_t *buf, uint32_t len,
        struct diag_smd_info *smd_info)
{
    int i;
    int header_len = sizeof(struct diag_ctrl_feature_mask);
    int read_len = 0;
    struct diag_ctrl_feature_mask *header = NULL;
    uint32_t feature_mask_len = 0;
    uint32_t feature_mask = 0;
    uint8_t *ptr = buf;

    if (!buf || !smd_info || len == 0)
        return;

    header = (struct diag_ctrl_feature_mask *)ptr;
    ptr += header_len;
    feature_mask_len = header->feature_mask_len;

    if (feature_mask_len == 0) {
        pr_debug("diag: In %s, received invalid feature mask from peripheral %d\n",
                 __func__, smd_info->peripheral);
        return;
    }

    if (feature_mask_len > FEATURE_MASK_LEN) {
        pr_alert("diag: Receiving feature mask length more than Apps support\n");
        feature_mask_len = FEATURE_MASK_LEN;
    }

    driver->rcvd_feature_mask[smd_info->peripheral] = 1;

    for (i = 0; i < feature_mask_len && read_len < len; i++) {
        feature_mask = *(uint8_t *)ptr;
        driver->peripheral_feature[smd_info->peripheral][i] =
            feature_mask;
        ptr += sizeof(uint8_t);
        read_len += sizeof(uint8_t);

        if (FEATURE_SUPPORTED(F_DIAG_LOG_ON_DEMAND_APPS))
            driver->log_on_demand_support = 1;
        if (FEATURE_SUPPORTED(F_DIAG_REQ_RSP_SUPPORT))
            driver->separate_cmdrsp[smd_info->peripheral] = 1;
        if (FEATURE_SUPPORTED(F_DIAG_APPS_HDLC_ENCODE))
            process_hdlc_encoding_feature(smd_info);
        if (FEATURE_SUPPORTED(F_DIAG_STM))
            enable_stm_feature(smd_info);
        if (FEATURE_SUPPORTED(F_DIAG_MASK_CENTRALIZATION))
            driver->mask_centralization[smd_info->peripheral] = 1;
    }
}
static void process_incoming_feature_mask(uint8_t *buf, uint32_t len,
					  uint8_t peripheral)
{
	int i;
	int header_len = sizeof(struct diag_ctrl_feature_mask);
	int read_len = 0;
	struct diag_ctrl_feature_mask *header = NULL;
	uint32_t feature_mask_len = 0;
	uint32_t feature_mask = 0;
	uint8_t *ptr = buf;

	if (!buf || peripheral >= NUM_PERIPHERALS || len == 0)
		return;

	header = (struct diag_ctrl_feature_mask *)ptr;
	ptr += header_len;
	feature_mask_len = header->feature_mask_len;

	if (feature_mask_len == 0) {
		DIAGFWD_DBUG("diag: In %s, received invalid feature mask from peripheral %d\n",
			 __func__, peripheral);
		return;
	}

	if (feature_mask_len > FEATURE_MASK_LEN) {
		pr_alert("diag: Receiving feature mask length more than Apps support\n");
		feature_mask_len = FEATURE_MASK_LEN;
	}

	driver->feature[peripheral].rcvd_feature_mask = 1;

	for (i = 0; i < feature_mask_len && read_len < len; i++) {
		feature_mask = *(uint8_t *)ptr;
		driver->feature[peripheral].feature_mask[i] = feature_mask;
		ptr += sizeof(uint8_t);
		read_len += sizeof(uint8_t);

		if (FEATURE_SUPPORTED(F_DIAG_LOG_ON_DEMAND_APPS))
			driver->feature[peripheral].log_on_demand = 1;
		if (FEATURE_SUPPORTED(F_DIAG_REQ_RSP_SUPPORT))
			driver->feature[peripheral].separate_cmd_rsp = 1;
		if (FEATURE_SUPPORTED(F_DIAG_APPS_HDLC_ENCODE))
			process_hdlc_encoding_feature(peripheral);
		if (FEATURE_SUPPORTED(F_DIAG_STM))
			enable_stm_feature(peripheral);
		if (FEATURE_SUPPORTED(F_DIAG_MASK_CENTRALIZATION))
			driver->feature[peripheral].mask_centralization = 1;
		if (FEATURE_SUPPORTED(F_DIAG_PERIPHERAL_BUFFERING))
			driver->feature[peripheral].peripheral_buffering = 1;
		if (FEATURE_SUPPORTED(F_DIAG_SOCKETS_ENABLED))
			enable_socket_feature(peripheral);
	}

	process_socket_feature(peripheral);
	process_log_on_demand_feature(peripheral);
}