Merge branch 'Bugfix/pppos_coonection_lost' into 'master'

Bugfix/PPPOS fix stack smashing, modify get operator and add access technology

Closes IDFGH-2262 and IDFGH-3844

See merge request espressif/esp-idf!11557

(cherry picked from commit 5d92cdc5d9)

d59ffd91 Expose get operator name command. Add get access tech
935edc9e rename dce parameter
7f3bcc13 esp-modem: prefix the crash issue both bg96 and sim800l in OVERALL mode
This commit is contained in:
David Čermák
2021-01-12 12:50:55 +00:00
committed by bot
parent d64bf0dfbe
commit 01b79d0df4
4 changed files with 25 additions and 13 deletions

View File

@@ -75,6 +75,7 @@ struct modem_dce {
char imsi[MODEM_IMSI_LENGTH + 1]; /*!< IMSI number */ char imsi[MODEM_IMSI_LENGTH + 1]; /*!< IMSI number */
char name[MODEM_MAX_NAME_LENGTH]; /*!< Module name */ char name[MODEM_MAX_NAME_LENGTH]; /*!< Module name */
char oper[MODEM_MAX_OPERATOR_LENGTH]; /*!< Operator name */ char oper[MODEM_MAX_OPERATOR_LENGTH]; /*!< Operator name */
uint8_t act; /*!< Access technology */
modem_state_t state; /*!< Modem working state */ modem_state_t state; /*!< Modem working state */
modem_mode_t mode; /*!< Working mode */ modem_mode_t mode; /*!< Working mode */
modem_dte_t *dte; /*!< DTE which connect to DCE */ modem_dte_t *dte; /*!< DTE which connect to DCE */
@@ -86,6 +87,7 @@ struct modem_dce {
esp_err_t (*get_signal_quality)(modem_dce_t *dce, uint32_t *rssi, uint32_t *ber); /*!< Get signal quality */ esp_err_t (*get_signal_quality)(modem_dce_t *dce, uint32_t *rssi, uint32_t *ber); /*!< Get signal quality */
esp_err_t (*get_battery_status)(modem_dce_t *dce, uint32_t *bcs, esp_err_t (*get_battery_status)(modem_dce_t *dce, uint32_t *bcs,
uint32_t *bcl, uint32_t *voltage); /*!< Get battery status */ uint32_t *bcl, uint32_t *voltage); /*!< Get battery status */
esp_err_t (*get_operator_name)(modem_dce_t *dce); /*!< Get operator name */
esp_err_t (*define_pdp_context)(modem_dce_t *dce, uint32_t cid, esp_err_t (*define_pdp_context)(modem_dce_t *dce, uint32_t cid,
const char *type, const char *apn); /*!< Set PDP Contex */ const char *type, const char *apn); /*!< Set PDP Contex */
esp_err_t (*set_working_mode)(modem_dce_t *dce, modem_mode_t mode); /*!< Set working mode */ esp_err_t (*set_working_mode)(modem_dce_t *dce, modem_mode_t mode); /*!< Set working mode */

View File

@@ -193,9 +193,9 @@ static esp_err_t bg96_handle_cops(modem_dce_t *dce, const char *line)
size_t len = strlen(line); size_t len = strlen(line);
char *line_copy = malloc(len + 1); char *line_copy = malloc(len + 1);
strcpy(line_copy, line); strcpy(line_copy, line);
/* +COPS: <mode>[, <format>[, <oper>]] */ /* +COPS: <mode>[, <format>[, <oper>[, <Act>]]] */
char *str_ptr = NULL; char *str_ptr = NULL;
char *p[3]; char *p[5];
uint8_t i = 0; uint8_t i = 0;
/* strtok will broke string by replacing delimiter with '\0' */ /* strtok will broke string by replacing delimiter with '\0' */
p[i] = strtok_r(line_copy, ",", &str_ptr); p[i] = strtok_r(line_copy, ",", &str_ptr);
@@ -210,6 +210,9 @@ static esp_err_t bg96_handle_cops(modem_dce_t *dce, const char *line)
err = ESP_OK; err = ESP_OK;
} }
} }
if (i >= 4) {
dce->act = (uint8_t)strtol(p[3], NULL, 0);
}
free(line_copy); free(line_copy);
} }
return err; return err;
@@ -400,14 +403,15 @@ err:
/** /**
* @brief Get Operator's name * @brief Get Operator's name
* *
* @param bg96_dce bg96 object * @param dce Modem DCE object
* @return esp_err_t * @return esp_err_t
* - ESP_OK on success * - ESP_OK on success
* - ESP_FAIL on error * - ESP_FAIL on error
*/ */
static esp_err_t bg96_get_operator_name(bg96_modem_dce_t *bg96_dce) static esp_err_t bg96_get_operator_name(modem_dce_t *dce)
{ {
modem_dte_t *dte = bg96_dce->parent.dte; modem_dte_t *dte = dce->dte;
bg96_modem_dce_t *bg96_dce = __containerof(dce, bg96_modem_dce_t, parent);
bg96_dce->parent.handle_line = bg96_handle_cops; bg96_dce->parent.handle_line = bg96_handle_cops;
DCE_CHECK(dte->send_cmd(dte, "AT+COPS?\r", MODEM_COMMAND_TIMEOUT_OPERATOR) == ESP_OK, "send command failed", err); DCE_CHECK(dte->send_cmd(dte, "AT+COPS?\r", MODEM_COMMAND_TIMEOUT_OPERATOR) == ESP_OK, "send command failed", err);
DCE_CHECK(bg96_dce->parent.state == MODEM_STATE_SUCCESS, "get network operator failed", err); DCE_CHECK(bg96_dce->parent.state == MODEM_STATE_SUCCESS, "get network operator failed", err);
@@ -454,6 +458,7 @@ modem_dce_t *bg96_init(modem_dte_t *dte)
bg96_dce->parent.hang_up = esp_modem_dce_hang_up; bg96_dce->parent.hang_up = esp_modem_dce_hang_up;
bg96_dce->parent.get_signal_quality = bg96_get_signal_quality; bg96_dce->parent.get_signal_quality = bg96_get_signal_quality;
bg96_dce->parent.get_battery_status = bg96_get_battery_status; bg96_dce->parent.get_battery_status = bg96_get_battery_status;
bg96_dce->parent.get_operator_name = bg96_get_operator_name;
bg96_dce->parent.set_working_mode = bg96_set_working_mode; bg96_dce->parent.set_working_mode = bg96_set_working_mode;
bg96_dce->parent.power_down = bg96_power_down; bg96_dce->parent.power_down = bg96_power_down;
bg96_dce->parent.deinit = bg96_deinit; bg96_dce->parent.deinit = bg96_deinit;
@@ -468,7 +473,7 @@ modem_dce_t *bg96_init(modem_dte_t *dte)
/* Get IMSI number */ /* Get IMSI number */
DCE_CHECK(bg96_get_imsi_number(bg96_dce) == ESP_OK, "get imsi failed", err_io); DCE_CHECK(bg96_get_imsi_number(bg96_dce) == ESP_OK, "get imsi failed", err_io);
/* Get operator name */ /* Get operator name */
DCE_CHECK(bg96_get_operator_name(bg96_dce) == ESP_OK, "get operator name failed", err_io); DCE_CHECK(bg96_get_operator_name(&(bg96_dce->parent)) == ESP_OK, "get operator name failed", err_io);
return &(bg96_dce->parent); return &(bg96_dce->parent);
err_io: err_io:
free(bg96_dce); free(bg96_dce);

View File

@@ -194,9 +194,9 @@ static esp_err_t sim800_handle_cops(modem_dce_t *dce, const char *line)
size_t len = strlen(line); size_t len = strlen(line);
char *line_copy = malloc(len + 1); char *line_copy = malloc(len + 1);
strcpy(line_copy, line); strcpy(line_copy, line);
/* +COPS: <mode>[, <format>[, <oper>]] */ /* +COPS: <mode>[, <format>[, <oper>[, <Act>]]] */
char *str_ptr = NULL; char *str_ptr = NULL;
char *p[3]; char *p[5];
uint8_t i = 0; uint8_t i = 0;
/* strtok will broke string by replacing delimiter with '\0' */ /* strtok will broke string by replacing delimiter with '\0' */
p[i] = strtok_r(line_copy, ",", &str_ptr); p[i] = strtok_r(line_copy, ",", &str_ptr);
@@ -211,6 +211,9 @@ static esp_err_t sim800_handle_cops(modem_dce_t *dce, const char *line)
err = ESP_OK; err = ESP_OK;
} }
} }
if (i >= 4) {
dce->act = (uint8_t)strtol(p[3], NULL, 0);
}
free(line_copy); free(line_copy);
} }
return err; return err;
@@ -399,14 +402,15 @@ err:
/** /**
* @brief Get Operator's name * @brief Get Operator's name
* *
* @param sim800_dce sim800 object * @param dce Modem DCE object
* @return esp_err_t * @return esp_err_t
* - ESP_OK on success * - ESP_OK on success
* - ESP_FAIL on error * - ESP_FAIL on error
*/ */
static esp_err_t sim800_get_operator_name(sim800_modem_dce_t *sim800_dce) static esp_err_t sim800_get_operator_name(modem_dce_t *dce)
{ {
modem_dte_t *dte = sim800_dce->parent.dte; modem_dte_t *dte = dce->dte;
sim800_modem_dce_t *sim800_dce = __containerof(dce, sim800_modem_dce_t, parent);
sim800_dce->parent.handle_line = sim800_handle_cops; sim800_dce->parent.handle_line = sim800_handle_cops;
DCE_CHECK(dte->send_cmd(dte, "AT+COPS?\r", MODEM_COMMAND_TIMEOUT_OPERATOR) == ESP_OK, "send command failed", err); DCE_CHECK(dte->send_cmd(dte, "AT+COPS?\r", MODEM_COMMAND_TIMEOUT_OPERATOR) == ESP_OK, "send command failed", err);
DCE_CHECK(sim800_dce->parent.state == MODEM_STATE_SUCCESS, "get network operator failed", err); DCE_CHECK(sim800_dce->parent.state == MODEM_STATE_SUCCESS, "get network operator failed", err);
@@ -453,6 +457,7 @@ modem_dce_t *sim800_init(modem_dte_t *dte)
sim800_dce->parent.hang_up = esp_modem_dce_hang_up; sim800_dce->parent.hang_up = esp_modem_dce_hang_up;
sim800_dce->parent.get_signal_quality = sim800_get_signal_quality; sim800_dce->parent.get_signal_quality = sim800_get_signal_quality;
sim800_dce->parent.get_battery_status = sim800_get_battery_status; sim800_dce->parent.get_battery_status = sim800_get_battery_status;
sim800_dce->parent.get_operator_name = sim800_get_operator_name;
sim800_dce->parent.set_working_mode = sim800_set_working_mode; sim800_dce->parent.set_working_mode = sim800_set_working_mode;
sim800_dce->parent.power_down = sim800_power_down; sim800_dce->parent.power_down = sim800_power_down;
sim800_dce->parent.deinit = sim800_deinit; sim800_dce->parent.deinit = sim800_deinit;
@@ -467,7 +472,7 @@ modem_dce_t *sim800_init(modem_dte_t *dte)
/* Get IMSI number */ /* Get IMSI number */
DCE_CHECK(sim800_get_imsi_number(sim800_dce) == ESP_OK, "get imsi failed", err_io); DCE_CHECK(sim800_get_imsi_number(sim800_dce) == ESP_OK, "get imsi failed", err_io);
/* Get operator name */ /* Get operator name */
DCE_CHECK(sim800_get_operator_name(sim800_dce) == ESP_OK, "get operator name failed", err_io); DCE_CHECK(sim800_get_operator_name(&(sim800_dce->parent)) == ESP_OK, "get operator name failed", err_io);
return &(sim800_dce->parent); return &(sim800_dce->parent);
err_io: err_io:
free(sim800_dce); free(sim800_dce);

View File

@@ -80,7 +80,7 @@ menu "Example Configuration"
config EXAMPLE_UART_EVENT_TASK_STACK_SIZE config EXAMPLE_UART_EVENT_TASK_STACK_SIZE
int "UART Event Task Stack Size" int "UART Event Task Stack Size"
range 2000 6000 range 2000 6000
default 2048 default 3072
help help
Stack size of UART event task. Stack size of UART event task.