Skip to content

Commit 6ed2e6b

Browse files
Merge branch 'espressif:master' into master
2 parents 0c69c68 + 1bf6843 commit 6ed2e6b

File tree

14 files changed

+278
-22
lines changed

14 files changed

+278
-22
lines changed

components/console_cmd_ping/.cz.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ commitizen:
33
bump_message: 'bump(console): $current_version -> $new_version'
44
pre_bump_hooks: python ../../ci/changelog.py console_cmd_ping
55
tag_format: console_cmd_ping-v$version
6-
version: 0.0.9
6+
version: 1.0.0
77
version_files:
88
- idf_component.yml
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Changelog
2+
3+
## [1.0.0](https://github.com/espressif/esp-protocols/commits/console_cmd_ping-v1.0.0)
4+
5+
### Features
6+
7+
- Added ping command to console component ([7babdeb9](https://github.com/espressif/esp-protocols/commit/7babdeb9))

components/console_cmd_ping/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: 0.0.9
1+
version: 1.0.0
22
url: https://github.com/espressif/esp-protocols/tree/master/components/console_cmd_ping
33
description: The component provides a console where the 'ping' command can be executed.
44
dependencies:

components/esp_modem/examples/modem_console/main/modem_console_main.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,9 @@ extern "C" void app_main(void)
235235
if (c->get_count_of(&SetModeArgs::mode)) {
236236
auto mode = c->get_string_of(&SetModeArgs::mode);
237237
modem_mode dev_mode;
238-
if (mode == "CMUX1") {
238+
if (mode == "UNDEF") {
239+
dev_mode = esp_modem::modem_mode::UNDEF;
240+
} else if (mode == "CMUX1") {
239241
dev_mode = esp_modem::modem_mode::CMUX_MANUAL_MODE;
240242
} else if (mode == "CMUX2") {
241243
dev_mode = esp_modem::modem_mode::CMUX_MANUAL_EXIT;

components/esp_modem/examples/modem_tcp_client/components/extra_tcp_transports/include/mbedtls_wrap.hpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#pragma once
77

88
#include <utility>
9+
#include <memory>
910
#include <span>
1011
#include "mbedtls/ssl.h"
1112
#include "mbedtls/entropy.h"
@@ -22,6 +23,7 @@ class Tls {
2223
Tls();
2324
virtual ~Tls();
2425
bool init(is_server server, do_verify verify);
26+
bool deinit();
2527
int handshake();
2628
int write(const unsigned char *buf, size_t len);
2729
int read(unsigned char *buf, size_t len);
@@ -41,12 +43,33 @@ class Tls {
4143
mbedtls_entropy_context entropy_{};
4244
virtual void delay() {}
4345

46+
bool set_session();
47+
bool get_session();
48+
void reset_session();
49+
bool is_session_loaded();
50+
4451
private:
4552
static void print_error(const char *function, int error_code);
4653
static int bio_write(void *ctx, const unsigned char *buf, size_t len);
4754
static int bio_read(void *ctx, unsigned char *buf, size_t len);
4855
int mbedtls_pk_parse_key( mbedtls_pk_context *ctx,
4956
const unsigned char *key, size_t keylen,
5057
const unsigned char *pwd, size_t pwdlen);
58+
struct unique_session {
59+
unique_session()
60+
{
61+
::mbedtls_ssl_session_init(&s);
62+
}
63+
~unique_session()
64+
{
65+
::mbedtls_ssl_session_free(&s);
66+
}
67+
mbedtls_ssl_session *ptr()
68+
{
69+
return &s;
70+
}
71+
mbedtls_ssl_session s;
72+
};
73+
std::unique_ptr<unique_session> session_;
5174

5275
};

components/esp_modem/examples/modem_tcp_client/components/extra_tcp_transports/mbedtls_wrap.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ bool Tls::init(is_server server, do_verify verify)
3535
return true;
3636
}
3737

38+
bool Tls::deinit()
39+
{
40+
::mbedtls_ssl_config_free(&conf_);
41+
::mbedtls_ssl_free(&ssl_);
42+
::mbedtls_pk_free(&pk_key_);
43+
::mbedtls_x509_crt_free(&public_cert_);
44+
::mbedtls_x509_crt_free(&ca_cert_);
45+
return true;
46+
}
47+
3848
void Tls::print_error(const char *function, int error_code)
3949
{
4050
static char error_buf[100];
@@ -132,3 +142,39 @@ Tls::~Tls()
132142
::mbedtls_x509_crt_free(&public_cert_);
133143
::mbedtls_x509_crt_free(&ca_cert_);
134144
}
145+
146+
bool Tls::get_session()
147+
{
148+
if (session_ == nullptr) {
149+
session_ = std::make_unique<unique_session>();
150+
}
151+
int ret = ::mbedtls_ssl_get_session(&ssl_, session_->ptr());
152+
if (ret != 0) {
153+
print_error("mbedtls_ssl_get_session() failed", ret);
154+
return false;
155+
}
156+
return true;
157+
}
158+
159+
bool Tls::set_session()
160+
{
161+
if (session_ == nullptr) {
162+
printf("session hasn't been initialized");
163+
return false;
164+
}
165+
int ret = mbedtls_ssl_set_session(&ssl_, session_->ptr());
166+
if (ret != 0) {
167+
print_error("mbedtls_ssl_set_session() failed", ret);
168+
return false;
169+
}
170+
return true;
171+
}
172+
173+
void Tls::reset_session()
174+
{
175+
session_.reset(nullptr);
176+
}
177+
bool Tls::is_session_loaded()
178+
{
179+
return session_ != nullptr;
180+
}

components/esp_modem/src/esp_modem_dce.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -96,6 +96,11 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
9696
{
9797
switch (m) {
9898
case modem_mode::UNDEF:
99+
if (!dte->set_mode(m)) {
100+
return false;
101+
}
102+
mode = m;
103+
return true;
99104
case modem_mode::DUAL_MODE: // Only DTE can be in Dual mode
100105
break;
101106
case modem_mode::COMMAND_MODE:
@@ -151,7 +156,7 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
151156
mode = modem_mode::CMUX_MANUAL_MODE;
152157
return true;
153158
case modem_mode::CMUX_MANUAL_EXIT:
154-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
159+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
155160
return false;
156161
}
157162
if (!dte->set_mode(m)) {
@@ -160,20 +165,20 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
160165
mode = modem_mode::COMMAND_MODE;
161166
return true;
162167
case modem_mode::CMUX_MANUAL_SWAP:
163-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
168+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
164169
return false;
165170
}
166171
if (!dte->set_mode(m)) {
167172
return false;
168173
}
169174
return true;
170175
case modem_mode::CMUX_MANUAL_DATA:
171-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
176+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
172177
return false;
173178
}
174179
return transitions::enter_data(*dte, *device, netif);
175180
case modem_mode::CMUX_MANUAL_COMMAND:
176-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
181+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
177182
return false;
178183
}
179184
return transitions::exit_data(*dte, *device, netif);

components/esp_modem/src/esp_modem_dte.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,14 @@ command_result DTE::command(const std::string &cmd, got_line_cb got_line, uint32
151151

152152
bool DTE::exit_cmux()
153153
{
154+
if (!cmux_term) {
155+
return false;
156+
}
154157
if (!cmux_term->deinit()) {
155158
return false;
156159
}
157160
exit_cmux_internal();
161+
cmux_term.reset();
158162
return true;
159163
}
160164

@@ -174,6 +178,10 @@ void DTE::exit_cmux_internal()
174178

175179
bool DTE::setup_cmux()
176180
{
181+
if (cmux_term) {
182+
ESP_LOGE("esp_modem_dte", "Cannot setup_cmux(), cmux_term already exists");
183+
return false;
184+
}
177185
cmux_term = std::make_shared<CMux>(primary_term, std::move(buffer));
178186
if (cmux_term == nullptr) {
179187
return false;
@@ -198,6 +206,11 @@ bool DTE::setup_cmux()
198206

199207
bool DTE::set_mode(modem_mode m)
200208
{
209+
// transitions (any) -> UNDEF
210+
if (m == modem_mode::UNDEF) {
211+
mode = m;
212+
return true;
213+
}
201214
// transitions (COMMAND|UNDEF) -> CMUX
202215
if (m == modem_mode::CMUX_MODE) {
203216
if (mode == modem_mode::UNDEF || mode == modem_mode::COMMAND_MODE) {
@@ -246,7 +259,7 @@ bool DTE::set_mode(modem_mode m)
246259
return false;
247260
}
248261
// manual CMUX transitions: Exit CMUX
249-
if (m == modem_mode::CMUX_MANUAL_EXIT && mode == modem_mode::CMUX_MANUAL_MODE) {
262+
if (m == modem_mode::CMUX_MANUAL_EXIT && (mode == modem_mode::CMUX_MANUAL_MODE || mode == modem_mode::UNDEF)) {
250263
if (exit_cmux()) {
251264
mode = modem_mode::COMMAND_MODE;
252265
return true;
@@ -255,7 +268,7 @@ bool DTE::set_mode(modem_mode m)
255268
return false;
256269
}
257270
// manual CMUX transitions: Swap terminals
258-
if (m == modem_mode::CMUX_MANUAL_SWAP && mode == modem_mode::CMUX_MANUAL_MODE) {
271+
if (m == modem_mode::CMUX_MANUAL_SWAP && (mode == modem_mode::CMUX_MANUAL_MODE || mode == modem_mode::UNDEF)) {
259272
secondary_term.swap(primary_term);
260273
set_command_callbacks();
261274
return true;

components/esp_modem/test/host_test/main/test_modem.cpp

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Unlicense OR CC0-1.0
55
*/
@@ -247,3 +247,88 @@ TEST_CASE("Test CMUX protocol by injecting payloads", "[esp_modem]")
247247
CHECK(ret == command_result::OK);
248248
}
249249
}
250+
251+
TEST_CASE("Command and Data mode transitions", "[esp_modem][transitions]")
252+
{
253+
auto term = std::make_unique<LoopbackTerm>();
254+
auto loopback = term.get();
255+
auto dte = std::make_shared<DTE>(std::move(term));
256+
CHECK(term == nullptr);
257+
258+
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG("APN");
259+
esp_netif_t netif{};
260+
auto dce = create_SIM7600_dce(&dce_config, dte, &netif);
261+
CHECK(dce != nullptr);
262+
263+
// UNDEF -> CMD (OK)
264+
uint8_t resp[] = "DISCONNECTED\n";
265+
loopback->inject(&resp[0], sizeof(resp), sizeof(resp), /* 10ms before injecting reply */100, 0);
266+
loopback->write(nullptr, 0); /* this triggers sending the injected response */
267+
CHECK(dce->set_mode(esp_modem::modem_mode::COMMAND_MODE) == true);
268+
loopback->inject(nullptr, 0, 0, 0, 0); /* reset injection, use synchronous replies now */
269+
// CMD -> CMD (Fail)
270+
CHECK(dce->set_mode(esp_modem::modem_mode::COMMAND_MODE) == false);
271+
272+
// Forcing transition to CMD (via UNDEF)
273+
// CMD -> UNDEF (OK)
274+
CHECK(dce->set_mode(esp_modem::modem_mode::UNDEF) == true);
275+
// UNDEF -> CMD (OK)
276+
CHECK(dce->set_mode(esp_modem::modem_mode::COMMAND_MODE) == true);
277+
278+
// CMD -> DATA (OK)
279+
CHECK(dce->set_mode(esp_modem::modem_mode::DATA_MODE) == true);
280+
// DATA -> CMD (OK)
281+
CHECK(dce->set_mode(esp_modem::modem_mode::COMMAND_MODE) == true);
282+
}
283+
284+
TEST_CASE("CMUX mode transitions", "[esp_modem][transitions]")
285+
{
286+
auto term = std::make_unique<LoopbackTerm>();
287+
auto dte = std::make_shared<DTE>(std::move(term));
288+
CHECK(term == nullptr);
289+
290+
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG("APN");
291+
esp_netif_t netif{};
292+
auto dce = create_SIM7600_dce(&dce_config, dte, &netif);
293+
CHECK(dce != nullptr);
294+
// UNDEF -> CMUX (OK)
295+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MODE) == true);
296+
// CMUX -> DATA (Fail)
297+
CHECK(dce->set_mode(esp_modem::modem_mode::DATA_MODE) == false);
298+
// CMUX back -> CMD (OK)
299+
CHECK(dce->set_mode(esp_modem::modem_mode::COMMAND_MODE) == true);
300+
}
301+
302+
TEST_CASE("CMUX manual mode transitions", "[esp_modem][transitions]")
303+
{
304+
auto term = std::make_unique<LoopbackTerm>();
305+
auto dte = std::make_shared<DTE>(std::move(term));
306+
CHECK(term == nullptr);
307+
308+
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG("APN");
309+
esp_netif_t netif{};
310+
auto dce = create_SIM7600_dce(&dce_config, dte, &netif);
311+
CHECK(dce != nullptr);
312+
313+
// Happy flow transitions of Manual CMUX transitions
314+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_MODE) == true);
315+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_EXIT) == true);
316+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_MODE) == true);
317+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_SWAP) == true);
318+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_DATA) == true);
319+
// Cannot test CMUX_MANUAL_DATA -> CMUX_MANUAL_COMMAND with our mocked terminal for now
320+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_EXIT) == true);
321+
322+
// Check some out of order manual transitions, most of them are allowed,
323+
// but some fail as modem layers report issues with specific steps
324+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_SWAP) == false); // cannot go directly to SWAP
325+
CHECK(dce->set_mode(esp_modem::modem_mode::UNDEF) == true);
326+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_SWAP) == true); // can go via UNDEF
327+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_EXIT) == false); // EXIT is allowed, but CMUX terms don't exist
328+
CHECK(dce->set_mode(esp_modem::modem_mode::UNDEF) == true);
329+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_MODE) == true); // Enter CMUX (via UNDEF)
330+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_DATA) == true); // Go directly to DATA mode
331+
CHECK(dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_EXIT) == true); // Exit CMUX
332+
CHECK(dce->set_mode(esp_modem::modem_mode::UNDEF) == true); // Succeeds from any state
333+
334+
}

components/esp_websocket_client/.cz.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ commitizen:
33
bump_message: 'bump(websocket): $current_version -> $new_version'
44
pre_bump_hooks: python ../../ci/changelog.py esp_websocket_client
55
tag_format: websocket-v$version
6-
version: 1.1.0
6+
version: 1.2.1
77
version_files:
88
- idf_component.yml

0 commit comments

Comments
 (0)