mirror of git://git.sysmocom.de/ofono
isimodem: implement Suspended property
This commit is contained in:
parent
1e139eb1ce
commit
74e4f9ee51
|
@ -979,6 +979,31 @@ const char *gpds_isi_cause_name(enum gpds_isi_cause value)
|
|||
return "GPDS_<UNKNOWN>";
|
||||
}
|
||||
|
||||
const char *gpds_transfer_status_name(enum gpds_transfer_status value)
|
||||
{
|
||||
switch (value) {
|
||||
_(GPDS_TRANSFER_NOT_AVAIL);
|
||||
_(GPDS_TRANSFER_AVAIL);
|
||||
}
|
||||
return "GPDS_<UNKNOWN>";
|
||||
}
|
||||
|
||||
const char *gpds_transfer_cause_name(enum gpds_transfer_cause value)
|
||||
{
|
||||
switch (value) {
|
||||
_(GPDS_TRANSFER_CAUSE_ATTACHED);
|
||||
_(GPDS_TRANSFER_CAUSE_DETACHED);
|
||||
_(GPDS_TRANSFER_CAUSE_RESUMED);
|
||||
_(GPDS_TRANSFER_CAUSE_SUSPENDED_NO_COVERAGE);
|
||||
_(GPDS_TRANSFER_CAUSE_SUSPENDED_CALL_SMS);
|
||||
_(GPDS_TRANSFER_CAUSE_SUSPENDED_CALL);
|
||||
_(GPDS_TRANSFER_CAUSE_SUSPENDED_RAU);
|
||||
_(GPDS_TRANSFER_CAUSE_SUSPENDED_LU);
|
||||
_(GPDS_TRANSFER_CAUSE_DSAC_RESTRICTION);
|
||||
}
|
||||
return "GPDS_<UNKNOWN>";
|
||||
}
|
||||
|
||||
#undef _
|
||||
|
||||
static void hex_dump(const char *name, const uint8_t m[], size_t len)
|
||||
|
|
|
@ -70,6 +70,8 @@ const char *gpds_message_id_name(enum gpds_message_id value);
|
|||
const char *gpds_subblock_name(enum gpds_subblock value);
|
||||
const char *gpds_status_name(enum gpds_status value);
|
||||
const char *gpds_isi_cause_name(enum gpds_isi_cause value);
|
||||
const char *gpds_transfer_status_name(enum gpds_transfer_status value);
|
||||
const char *gpds_transfer_cause_name(enum gpds_transfer_cause value);
|
||||
|
||||
void ss_debug(const void *restrict buf, size_t len, void *data);
|
||||
void mtc_debug(const void *restrict buf, size_t len, void *data);
|
||||
|
|
|
@ -202,6 +202,23 @@ enum gpds_isi_cause {
|
|||
GPDS_CAUSE_AUT_FAILURE = 0xFF,
|
||||
};
|
||||
|
||||
enum gpds_transfer_status {
|
||||
GPDS_TRANSFER_NOT_AVAIL = 0x00,
|
||||
GPDS_TRANSFER_AVAIL = 0x01,
|
||||
};
|
||||
|
||||
enum gpds_transfer_cause {
|
||||
GPDS_TRANSFER_CAUSE_ATTACHED = 0x02,
|
||||
GPDS_TRANSFER_CAUSE_DETACHED = 0x03,
|
||||
GPDS_TRANSFER_CAUSE_RESUMED = 0x04,
|
||||
GPDS_TRANSFER_CAUSE_SUSPENDED_NO_COVERAGE = 0x05,
|
||||
GPDS_TRANSFER_CAUSE_SUSPENDED_CALL_SMS = 0x07,
|
||||
GPDS_TRANSFER_CAUSE_SUSPENDED_CALL = 0x08,
|
||||
GPDS_TRANSFER_CAUSE_SUSPENDED_RAU = 0x09,
|
||||
GPDS_TRANSFER_CAUSE_SUSPENDED_LU = 0x0A,
|
||||
GPDS_TRANSFER_CAUSE_DSAC_RESTRICTION = 0x0B,
|
||||
};
|
||||
|
||||
enum gpds_context_type {
|
||||
GPDS_CONT_TYPE_NORMAL = 0x00,
|
||||
GPDS_CONT_TYPE_NWI = 0x01,
|
||||
|
|
|
@ -72,6 +72,55 @@ static void detach_ind_cb(GIsiClient *client,
|
|||
/*ofono_gprs_detached_notify(gprs);*/
|
||||
}
|
||||
|
||||
static void suspend_notify(struct ofono_gprs *gprs, uint8_t suspend_status,
|
||||
uint8_t suspend_cause)
|
||||
{
|
||||
int cause;
|
||||
|
||||
DBG("transfer status: %s (0x%02"PRIx8") cause %s (0x%02"PRIx8")",
|
||||
gpds_transfer_status_name(suspend_status), suspend_status,
|
||||
gpds_transfer_cause_name(suspend_cause), suspend_cause);
|
||||
|
||||
if (suspend_status == GPDS_TRANSFER_AVAIL) {
|
||||
ofono_gprs_resume_notify(gprs);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (suspend_cause) {
|
||||
case GPDS_TRANSFER_CAUSE_SUSPENDED_NO_COVERAGE:
|
||||
cause = GPRS_SUSPENDED_NO_COVERAGE;
|
||||
break;
|
||||
|
||||
case GPDS_TRANSFER_CAUSE_SUSPENDED_CALL:
|
||||
cause = GPRS_SUSPENDED_CALL;
|
||||
break;
|
||||
|
||||
case GPDS_TRANSFER_CAUSE_SUSPENDED_CALL_SMS:
|
||||
case GPDS_TRANSFER_CAUSE_SUSPENDED_RAU:
|
||||
case GPDS_TRANSFER_CAUSE_SUSPENDED_LU:
|
||||
cause = GPRS_SUSPENDED_SIGNALLING;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
ofono_gprs_suspend_notify(gprs, cause);
|
||||
}
|
||||
|
||||
static void transfer_status_ind_cb(GIsiClient *client,
|
||||
const void *restrict data, size_t len,
|
||||
uint16_t object, void *opaque)
|
||||
{
|
||||
struct ofono_gprs *gprs = opaque;
|
||||
const unsigned char *msg = data;
|
||||
|
||||
if (!msg || len < 3 || msg[0] != GPDS_TRANSFER_STATUS_IND)
|
||||
return;
|
||||
|
||||
suspend_notify(gprs, msg[1], msg[2]);
|
||||
}
|
||||
|
||||
static gboolean isi_gprs_register(gpointer user)
|
||||
{
|
||||
struct ofono_gprs *gprs = user;
|
||||
|
@ -83,6 +132,8 @@ static gboolean isi_gprs_register(gpointer user)
|
|||
g_isi_client_set_debug(gd->client, gpds_debug, NULL);
|
||||
|
||||
g_isi_subscribe(gd->client, GPDS_DETACH_IND, detach_ind_cb, gprs);
|
||||
g_isi_subscribe(gd->client, GPDS_TRANSFER_STATUS_IND,
|
||||
transfer_status_ind_cb, gprs);
|
||||
|
||||
ofono_gprs_register(user);
|
||||
|
||||
|
@ -258,6 +309,7 @@ static gboolean status_resp_cb(GIsiClient *client,
|
|||
const unsigned char *msg = data;
|
||||
struct isi_cb_data *cbd = opaque;
|
||||
ofono_gprs_status_cb_t cb = cbd->cb;
|
||||
struct ofono_gprs *gprs = cbd->data;
|
||||
int status;
|
||||
|
||||
if (!msg) {
|
||||
|
@ -265,7 +317,7 @@ static gboolean status_resp_cb(GIsiClient *client,
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (len < 2 || msg[0] != GPDS_STATUS_RESP)
|
||||
if (len < 13 || msg[0] != GPDS_STATUS_RESP)
|
||||
return FALSE;
|
||||
|
||||
/* FIXME: the core still expects reg status, and not a boolean
|
||||
|
@ -281,6 +333,8 @@ static gboolean status_resp_cb(GIsiClient *client,
|
|||
status = GPRS_STAT_UNKNOWN;
|
||||
}
|
||||
|
||||
suspend_notify(gprs, msg[11], msg[12]);
|
||||
|
||||
CALLBACK_WITH_SUCCESS(cb, status, cbd->data);
|
||||
|
||||
return TRUE;
|
||||
|
|
Loading…
Reference in New Issue