mirror of git://git.sysmocom.de/ofono
qmimodem: Implement data capability bearer notify
This implements data capability bearer notify to qmi modem. Since this is included in the serving system response this just adds a new data extraction for dc.
This commit is contained in:
parent
a88d1120a4
commit
4e61dc355e
|
@ -68,6 +68,28 @@ static bool extract_ss_info(struct qmi_result *result, int *status, int *tech)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool extract_dc_info(struct qmi_result *result, int *bearer_tech)
|
||||||
|
{
|
||||||
|
const struct qmi_nas_data_capability *dc;
|
||||||
|
uint16_t len;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
DBG("");
|
||||||
|
|
||||||
|
dc = qmi_result_get(result, QMI_NAS_RESULT_DATA_CAPABILITY_STATUS, &len);
|
||||||
|
if (!dc)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*bearer_tech = -1;
|
||||||
|
for (i = 0; i < dc->cap_count; i++) {
|
||||||
|
DBG("radio tech in use %d", dc->cap[i]);
|
||||||
|
|
||||||
|
*bearer_tech = qmi_nas_cap_to_bearer_tech(dc->cap[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void get_lte_attach_param_cb(struct qmi_result *result, void *user_data)
|
static void get_lte_attach_param_cb(struct qmi_result *result, void *user_data)
|
||||||
{
|
{
|
||||||
struct ofono_gprs *gprs = user_data;
|
struct ofono_gprs *gprs = user_data;
|
||||||
|
@ -188,6 +210,7 @@ static int handle_ss_info(struct qmi_result *result, struct ofono_gprs *gprs)
|
||||||
struct gprs_data *data = ofono_gprs_get_data(gprs);
|
struct gprs_data *data = ofono_gprs_get_data(gprs);
|
||||||
int status;
|
int status;
|
||||||
int tech;
|
int tech;
|
||||||
|
int bearer_tech;
|
||||||
|
|
||||||
DBG("");
|
DBG("");
|
||||||
|
|
||||||
|
@ -209,6 +232,10 @@ static int handle_ss_info(struct qmi_result *result, struct ofono_gprs *gprs)
|
||||||
data->last_auto_context_id = 0;
|
data->last_auto_context_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* DC is optional so only notify on successful extraction */
|
||||||
|
if (extract_dc_info(result, &bearer_tech))
|
||||||
|
ofono_gprs_bearer_notify(gprs, bearer_tech);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,3 +36,39 @@ int qmi_nas_rat_to_tech(uint8_t rat)
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qmi_nas_cap_to_bearer_tech(int cap_tech)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (cap_tech) {
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_GSM:
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_NONE:
|
||||||
|
return PACKET_BEARER_NONE;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_GPRS:
|
||||||
|
return PACKET_BEARER_GPRS;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_EDGE:
|
||||||
|
return PACKET_BEARER_EGPRS;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_EVDO_REV_0:
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_EVDO_REV_A:
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_EVDO_REV_B:
|
||||||
|
return PACKET_BEARER_UMTS;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_HSDPA:
|
||||||
|
return PACKET_BEARER_HSDPA;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_HSUPA:
|
||||||
|
return PACKET_BEARER_HSUPA;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS:
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS:
|
||||||
|
/*
|
||||||
|
* HSPAP is HSPA+; which ofono doesn't define;
|
||||||
|
* so, if differentiating HSPA and HSPA+ is
|
||||||
|
* important, then ofono needs to be patched,
|
||||||
|
* and we probably also need to introduce a
|
||||||
|
* new indicator icon.
|
||||||
|
*/
|
||||||
|
return PACKET_BEARER_HSUPA_HSDPA;
|
||||||
|
case QMI_NAS_DATA_CAPABILITY_LTE:
|
||||||
|
return PACKET_BEARER_EPS;
|
||||||
|
default:
|
||||||
|
return PACKET_BEARER_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -135,6 +135,28 @@ struct qmi_nas_serving_system {
|
||||||
uint8_t radio_if[0];
|
uint8_t radio_if[0];
|
||||||
} __attribute__((__packed__));
|
} __attribute__((__packed__));
|
||||||
#define QMI_NAS_RESULT_ROAMING_STATUS 0x10 /* uint8 */
|
#define QMI_NAS_RESULT_ROAMING_STATUS 0x10 /* uint8 */
|
||||||
|
|
||||||
|
#define QMI_NAS_RESULT_DATA_CAPABILITY_STATUS 0x11 /* uint8 */
|
||||||
|
struct qmi_nas_data_capability {
|
||||||
|
uint8_t cap_count;
|
||||||
|
uint8_t cap[0];
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_NONE 0x00
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_GPRS 0x01
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_EDGE 0x02
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_HSDPA 0x03
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_HSUPA 0x04
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_WCDMA 0x05
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_CDMA 0x06
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_EVDO_REV_0 0x07
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_EVDO_REV_A 0x08
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_GSM 0x09
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_EVDO_REV_B 0x0A
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_LTE 0x0B
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS 0x0C
|
||||||
|
#define QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS 0x0D
|
||||||
|
|
||||||
#define QMI_NAS_RESULT_CURRENT_PLMN 0x12
|
#define QMI_NAS_RESULT_CURRENT_PLMN 0x12
|
||||||
struct qmi_nas_current_plmn {
|
struct qmi_nas_current_plmn {
|
||||||
uint16_t mcc;
|
uint16_t mcc;
|
||||||
|
@ -188,3 +210,4 @@ struct qmi_nas_home_network {
|
||||||
#define QMI_NAS_RESULT_SYSTEM_SELECTION_PREF_MODE 0x11
|
#define QMI_NAS_RESULT_SYSTEM_SELECTION_PREF_MODE 0x11
|
||||||
|
|
||||||
int qmi_nas_rat_to_tech(uint8_t rat);
|
int qmi_nas_rat_to_tech(uint8_t rat);
|
||||||
|
int qmi_nas_cap_to_bearer_tech(int cap_tech);
|
||||||
|
|
Loading…
Reference in New Issue