blob: ccc3f1d4aaf3155954338d9834c9728f6a21a7de [file] [log] [blame]
/*
* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* qmidms: QMI calls on the DMS (Device Management Service) interface
*
* Sources used in writing this file (see README for links):
* [GobiNet]/QMI.c
* [GobiNet]/QMIDevice.c
* [cros-kerne]/drivers/net/usb/gobi/qmi.c
* [cros-kerne]/drivers/net/usb/gobi/qmidevice.c
*/
#include <assert.h>
#include <errno.h>
#include <glib.h>
#include <libqmi.h>
#include "qmi.h"
#include "qmidev.h"
#include "qmimsg.h"
enum {
QMIDMS_MSG_GET_IDS = 37
};
enum {
QMIDMS_TLV_GET_IDS_ESN = 0x10,
QMIDMS_TLV_GET_IDS_IMEI,
QMIDMS_TLV_GET_IDS_MEID
};
struct get_ids_context {
qmidev_get_ids_response_fn caller_callback;
void *caller_context;
};
static void got_ids(struct qmidev *qmidev,
void *data,
int status,
struct qmimsg *message)
{
assert(qmidev);
assert(data);
assert(message);
struct get_ids_context *context = data;
int result;
char *esn = NULL, *imei = NULL, *meid = NULL;
if (status) {
result = status;
goto out;
}
qmi_tlv_strdup(message, QMIDMS_TLV_GET_IDS_ESN, NULL, &esn);
qmi_tlv_strdup(message, QMIDMS_TLV_GET_IDS_IMEI, NULL, &imei);
qmi_tlv_strdup(message, QMIDMS_TLV_GET_IDS_MEID, NULL, &meid);
result = 0;
out:
context->caller_callback(qmidev, context->caller_context, result,
esn, imei, meid);
g_free(esn);
g_free(imei);
g_free(meid);
g_slice_free(struct get_ids_context, context);
}
int qmidev_get_ids(struct qmidev *qmidev,
qmidev_get_ids_response_fn caller_callback,
void *caller_context)
{
int result;
struct get_ids_context *context = g_slice_new(struct get_ids_context);
context->caller_callback = caller_callback;
context->caller_context = caller_context;
struct qmimsg *message;
result = qmidev_make_request(qmidev, QMI_SVC_DMS, QMIDMS_MSG_GET_IDS,
&message);
if (result)
goto fail;
result = qmidev_send_request(qmidev, message,
QMIDMS_MSG_GET_IDS,
&got_ids, context);
if (result)
goto fail;
return 0;
fail:
g_slice_free(struct get_ids_context, context);
return result;
}