diff --git a/drivers/qmimodem/nas.h b/drivers/qmimodem/nas.h index c3e7546b..9f67707e 100644 --- a/drivers/qmimodem/nas.h +++ b/drivers/qmimodem/nas.h @@ -152,6 +152,18 @@ struct qmi_nas_current_plmn { #define QMI_NAS_REGISTRATION_STATE_DENIED 0x03 #define QMI_NAS_REGISTRATION_STATE_UNKNOWN 0x04 +#define QMI_NAS_RESULT_3GGP_DST 0x1b +#define QMI_NAS_RESULT_3GPP_TIME 0x1c +struct qmi_nas_3gpp_time { + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t timezone; +} __attribute__((__packed__)); + /* cs_state/ps_state */ #define QMI_NAS_ATTACH_STATE_INVALID 0x00 #define QMI_NAS_ATTACH_STATE_ATTACHED 0x01 diff --git a/drivers/qmimodem/network-registration.c b/drivers/qmimodem/network-registration.c index 41caa414..c88e80bd 100644 --- a/drivers/qmimodem/network-registration.c +++ b/drivers/qmimodem/network-registration.c @@ -23,6 +23,7 @@ #include #endif +#include #include #include #include @@ -43,6 +44,38 @@ struct netreg_data { uint8_t current_rat; }; +static bool extract_ss_info_time( + struct qmi_result *result, + struct ofono_network_time *time) +{ + const struct qmi_nas_3gpp_time *time_3gpp = NULL; + uint8_t dst_3gpp; + bool dst_3gpp_valid; + uint16_t len; + + /* parse 3gpp time & dst */ + dst_3gpp_valid = qmi_result_get_uint8(result, QMI_NAS_RESULT_3GGP_DST, + &dst_3gpp); + + time_3gpp = qmi_result_get(result, QMI_NAS_RESULT_3GPP_TIME, &len); + if (time_3gpp && len == sizeof(struct qmi_nas_3gpp_time) && + dst_3gpp_valid) { + time->year = le16toh(time_3gpp->year); + time->mon = time_3gpp->month; + time->mday = time_3gpp->day; + time->hour = time_3gpp->hour; + time->min = time_3gpp->minute; + time->sec = time_3gpp->second; + time->utcoff = time_3gpp->timezone * 15 * 60; + time->dst = dst_3gpp; + return true; + } + + /* TODO: 3gpp2 */ + + return false; +} + static bool extract_ss_info(struct qmi_result *result, int *status, int *lac, int *cellid, int *tech, struct ofono_network_operator *operator) @@ -124,11 +157,15 @@ static bool extract_ss_info(struct qmi_result *result, int *status, static void ss_info_notify(struct qmi_result *result, void *user_data) { struct ofono_netreg *netreg = user_data; + struct ofono_network_time net_time; struct netreg_data *data = ofono_netreg_get_data(netreg); int status, lac, cellid, tech; DBG(""); + if (extract_ss_info_time(result, &net_time)) + ofono_netreg_time_notify(netreg, &net_time); + if (!extract_ss_info(result, &status, &lac, &cellid, &tech, &data->operator)) return;