Пример #1
0
void sap_connect_req(void *sap_device, uint16_t maxmsgsize)
{
	DBG("status: %d", sim_card_conn_status);

	if (sim_card_conn_status != SIM_DISCONNECTED) {
		sap_connect_rsp(sap_device, SAP_STATUS_CONNECTION_FAILED);
		return;
	}

	if (max_msg_size_supported > maxmsgsize) {
		sap_connect_rsp(sap_device, SAP_STATUS_MAX_MSG_SIZE_TOO_SMALL);
		return;
	}

	if (max_msg_size_supported < maxmsgsize) {
		sap_connect_rsp(sap_device,
					SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED);
		return;
	}

	if (ongoing_call_status) {
		sap_connect_rsp(sap_device, SAP_STATUS_OK_ONGOING_CALL);
		return;
	}

	sim_card_conn_status = SIM_CONNECTED;
	sap_data = sap_device;

	sap_connect_rsp(sap_device, SAP_STATUS_OK);
	sap_status_ind(sap_device, SAP_STATUS_CHANGE_CARD_RESET);
}
Пример #2
0
static void connect_req(struct sap_connection *conn,
				struct sap_parameter *param)
{
	uint16_t maxmsgsize, *val;

	DBG("conn %p state %d", conn, conn->state);

	if (!param)
		goto error_rsp;

	if (conn->state != SAP_STATE_DISCONNECTED)
		goto error_rsp;

	stop_guard_timer(conn);

	val = (uint16_t *) &param->val;
	maxmsgsize = ntohs(*val);

	DBG("Connect MaxMsgSize: 0x%04x", maxmsgsize);

	conn->state = SAP_STATE_CONNECT_IN_PROGRESS;

	if (maxmsgsize <= SAP_BUF_SIZE) {
		conn->processing_req = SAP_CONNECT_REQ;
		sap_connect_req(conn, maxmsgsize);
	} else {
		sap_connect_rsp(conn, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED,
								SAP_BUF_SIZE);
	}

	return;

error_rsp:
	sap_error_rsp(conn);
}
static void connect_req(struct sap_server *server,
				struct sap_parameter *param)
{
	struct sap_connection *conn = server->conn;
	uint16_t maxmsgsize;

	DBG("conn %p state %d", conn, conn->state);

	if (!param)
		goto error_rsp;

	if (conn->state != SAP_STATE_DISCONNECTED)
		goto error_rsp;

	stop_guard_timer(server);

	maxmsgsize = get_be16(&param->val);

	DBG("Connect MaxMsgSize: 0x%04x", maxmsgsize);

	conn->state = SAP_STATE_CONNECT_IN_PROGRESS;

	if (maxmsgsize <= SAP_BUF_SIZE) {
		conn->processing_req = SAP_CONNECT_REQ;
		sap_connect_req(server, maxmsgsize);
	} else {
		sap_connect_rsp(server, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED);
	}

	return;

error_rsp:
	sap_error_rsp(conn);
}
Пример #4
0
void sap_connect_req(void *sap_device, uint16_t maxmsgsize)
{
    DBG("sap_device %p maxmsgsize %u", sap_device, maxmsgsize);

    sap_info("connect request");

    if (simd_connect(sap_device) < 0) {
        sap_connect_rsp(sap_device, SAP_STATUS_CONNECTION_FAILED, 0);
        return;
    }

    if (send_request(u8500.io, STE_START_SAP_REQ, NULL) < 0) {
        sap_connect_rsp(sap_device, SAP_STATUS_CONNECTION_FAILED,
                        SAP_BUF_SIZE);
        simd_close();
    }
}
static void connect_req(struct sap_connection *conn,
				struct sap_parameter *param)
{
	uint16_t maxmsgsize, *val;

	DBG("conn %p state %d", conn, conn->state);

	if (!param)
		goto error_rsp;

	if (conn->state != SAP_STATE_DISCONNECTED)
		goto error_rsp;

	stop_guard_timer(conn);

	val = (uint16_t *) &param->val;
	maxmsgsize = ntohs(*val);

	DBG("Connect MaxMsgSize: 0x%04x", maxmsgsize);

	conn->state = SAP_STATE_CONNECT_IN_PROGRESS;

	if (maxmsgsize <= SAP_BUF_SIZE) {
		// open RIL Client
		if (!isRilConnected)
			isRilConnected = sap_open_ril();

		if (isRilConnected) {
			conn->processing_req = SAP_CONNECT_REQ;
			sap_connect_req(conn, maxmsgsize);
		} else {
			sap_connect_rsp(conn, SAP_STATUS_CONNECTION_FAILED,
								maxmsgsize);
		}
	} else {
		sap_connect_rsp(conn, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED,
								SAP_BUF_SIZE);
	}

	return;

error_rsp:
	error("Processing error (param %p state %d pr 0x%02x)", param,
					conn->state, conn->processing_req);
	sap_error_rsp(conn);
}
Пример #6
0
static DBusMessage *ongoing_call(DBusConnection *conn, DBusMessage *msg,
						void *data)
{
	dbus_bool_t ongoing;

	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &ongoing,
						DBUS_TYPE_INVALID))
		return invalid_args(msg);

	if (ongoing_call_status && !ongoing) {
		/* An ongoing call has finished. Continue connection.*/
		sap_connect_rsp(sap_data, SAP_STATUS_OK,
						max_msg_size_supported);
		sap_status_ind(sap_data, SAP_STATUS_CHANGE_CARD_RESET);
		ongoing_call_status = ongoing;
	} else if (!ongoing_call_status && ongoing) {
		/* An ongoing call has started.*/
		ongoing_call_status = ongoing;
	}

	DBG("OngoingCall status set to %d", ongoing_call_status);

	return dbus_message_new_method_return(msg);
}
Пример #7
0
static void recv_response(struct ste_message *msg)
{
    uint32_t status;
    uint8_t *param;

    DBG_VERBOSE("msg_id 0x%x", msg->id);

    if (msg->id == STE_END_SAP_RSP) {
        sap_disconnect_rsp(u8500.sap_data);
        simd_close();
        return;
    }

    param = msg->payload;
    status = *(uint32_t *)param;
    param += sizeof(status);

    DBG_VERBOSE("status 0x%x", status);

    switch (msg->id) {
    case STE_START_SAP_RSP:
        if (status == STE_STATUS_OK) {
            sap_connect_rsp(u8500.sap_data, SAP_STATUS_OK, 0);
        } else {
            sap_connect_rsp(u8500.sap_data,
                            SAP_STATUS_CONNECTION_FAILED, 0);
            simd_close();
        }
        break;

    case STE_SEND_APDU_RSP:
        recv_pdu(STE_SEND_APDU_MSG, msg, status, param,
                 sap_transfer_apdu_rsp);
        break;

    case STE_GET_ATR_RSP:
        recv_pdu(STE_GET_ATR_MSG, msg, status, param,
                 sap_transfer_atr_rsp);
        break;

    case STE_POWER_OFF_RSP:
        recv_state_change(STE_POWER_OFF_MSG, status, STE_POWERED_OFF,
                          sap_power_sim_off_rsp);
        break;

    case STE_POWER_ON_RSP:
        recv_state_change(STE_POWER_ON_MSG, status, STE_ENABLED,
                          sap_power_sim_on_rsp);
        break;

    case STE_RESET_RSP:
        recv_state_change(STE_RESET_MSG, status, STE_ENABLED,
                          sap_reset_sim_rsp);
        break;

    case STE_GET_STATUS_RSP:
        recv_card_status(status, param);
        break;

    case STE_STATUS_IND:
        recv_status(status);
        break;

    default:
        sap_error("unsupported message received (id 0x%x)", msg->id);
    }
}
static void connect_confirm_cb(GIOChannel *io, gpointer data)
{
	struct sap_connection *conn = server->conn;
	GError *gerr = NULL;
	bdaddr_t src, dst;
   char srcaddr[18], dstaddr[18];
	int err;

	DBG("io %p data %p ", io, data);

	if (!io)
		return;

	if (conn) {
		g_io_channel_shutdown(io, TRUE, NULL);
		return;
	}

	conn = g_try_new0(struct sap_connection, 1);
	if (!conn) {
		error("Can't allocate memory for incomming SAP connection.");
		g_io_channel_shutdown(io, TRUE, NULL);
		return;
	}

	g_io_channel_set_encoding(io, NULL, NULL);
	g_io_channel_set_buffered(io, FALSE);

	server->conn = conn;
	conn->io = g_io_channel_ref(io);
	conn->state = SAP_STATE_DISCONNECTED;

	bt_io_get(io, BT_IO_RFCOMM, &gerr,
			BT_IO_OPT_SOURCE_BDADDR, &src,
			BT_IO_OPT_DEST_BDADDR, &dst,
			BT_IO_OPT_INVALID);
	if (gerr) {
		error("%s", gerr->message);
		g_error_free(gerr);
		sap_conn_remove(conn);
		return;
	}

	//client_to_be_authorized = &dst;

	ba2str(&dst, dstaddr);
   ba2str(&src, srcaddr);

   if(sap_check_weak_linkkey(srcaddr, dstaddr) == TRUE)
   {
      DBG("SAP weak_key was detected.");
      sap_connect_rsp(conn, SAP_STATUS_CONNECTION_FAILED,
								SAP_BUF_SIZE);
      sap_conn_remove(conn);
      return;
   }

	err = btd_request_authorization(&src, &dst, SAP_UUID,
					connect_auth_cb, conn);
	if (err < 0) {
		DBG("Authorization denied: %d %s", err,  strerror(err));
		sap_conn_remove(conn);
		return;
	}

	DBG("SAP incoming connection (sock %d) authorization.",
				g_io_channel_unix_get_fd(io));
}