---
 drivers/qmimodem/nas.h                  | 12 +++++++++++
 drivers/qmimodem/network-registration.c | 37 +++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/drivers/qmimodem/nas.h b/drivers/qmimodem/nas.h
index c3e7546bbfa1..9f67707ea721 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 41caa414477b..c88e80bdf711 100644
--- a/drivers/qmimodem/network-registration.c
+++ b/drivers/qmimodem/network-registration.c
@@ -23,6 +23,7 @@
 #include <config.h>
 #endif
 
+#include <endian.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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;
-- 
2.14.1

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to