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
This commit is contained in:
David Čermák 2021-01-12 20:50:55 +08:00
commit 5d92cdc5d9
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 name[MODEM_MAX_NAME_LENGTH]; /*!< Module name */
char oper[MODEM_MAX_OPERATOR_LENGTH]; /*!< Operator name */
uint8_t act; /*!< Access technology */
modem_state_t state; /*!< Modem working state */
modem_mode_t mode; /*!< Working mode */
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_battery_status)(modem_dce_t *dce, uint32_t *bcs,
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,
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 */

View File

@ -172,9 +172,9 @@ static esp_err_t bg96_handle_cops(modem_dce_t *dce, const char *line)
size_t len = strlen(line);
char *line_copy = malloc(len + 1);
strcpy(line_copy, line);
/* +COPS: <mode>[, <format>[, <oper>]] */
/* +COPS: <mode>[, <format>[, <oper>[, <Act>]]] */
char *str_ptr = NULL;
char *p[3];
char *p[5];
uint8_t i = 0;
/* strtok will broke string by replacing delimiter with '\0' */
p[i] = strtok_r(line_copy, ",", &str_ptr);
@ -189,6 +189,9 @@ static esp_err_t bg96_handle_cops(modem_dce_t *dce, const char *line)
err = ESP_OK;
}
}
if (i >= 4) {
dce->act = (uint8_t)strtol(p[3], NULL, 0);
}
free(line_copy);
}
return err;
@ -395,14 +398,15 @@ err:
/**
* @brief Get Operator's name
*
* @param bg96_dce bg96 object
* @param dce Modem DCE object
* @return esp_err_t
* - ESP_OK on success
* - 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;
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);
@ -449,6 +453,7 @@ modem_dce_t *bg96_init(modem_dte_t *dte)
bg96_dce->parent.hang_up = esp_modem_dce_hang_up;
bg96_dce->parent.get_signal_quality = bg96_get_signal_quality;
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.power_down = bg96_power_down;
bg96_dce->parent.deinit = bg96_deinit;
@ -463,7 +468,7 @@ modem_dce_t *bg96_init(modem_dte_t *dte)
/* Get IMSI number */
DCE_CHECK(bg96_get_imsi_number(bg96_dce) == ESP_OK, "get imsi failed", err_io);
/* 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);
err_io:
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);
char *line_copy = malloc(len + 1);
strcpy(line_copy, line);
/* +COPS: <mode>[, <format>[, <oper>]] */
/* +COPS: <mode>[, <format>[, <oper>[, <Act>]]] */
char *str_ptr = NULL;
char *p[3];
char *p[5];
uint8_t i = 0;
/* strtok will broke string by replacing delimiter with '\0' */
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;
}
}
if (i >= 4) {
dce->act = (uint8_t)strtol(p[3], NULL, 0);
}
free(line_copy);
}
return err;
@ -415,14 +418,15 @@ err:
/**
* @brief Get Operator's name
*
* @param sim800_dce sim800 object
* @param dce Modem DCE object
* @return esp_err_t
* - ESP_OK on success
* - 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;
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);
@ -469,6 +473,7 @@ modem_dce_t *sim800_init(modem_dte_t *dte)
sim800_dce->parent.hang_up = esp_modem_dce_hang_up;
sim800_dce->parent.get_signal_quality = sim800_get_signal_quality;
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.power_down = sim800_power_down;
sim800_dce->parent.deinit = sim800_deinit;
@ -483,7 +488,7 @@ modem_dce_t *sim800_init(modem_dte_t *dte)
/* Get IMSI number */
DCE_CHECK(sim800_get_imsi_number(sim800_dce) == ESP_OK, "get imsi failed", err_io);
/* 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);
err_io:
free(sim800_dce);

View File

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