Skip to content

Commit fab5980

Browse files
authored
Merge branch 'master' into docs/docker
2 parents 5f5f1d4 + ea27a98 commit fab5980

File tree

8 files changed

+49
-32
lines changed

8 files changed

+49
-32
lines changed

Diff for: cores/esp32/USBMSC.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern "C" uint16_t tusb_msc_load_descriptor(uint8_t *dst, uint8_t *itf) {
3333

3434
typedef struct {
3535
bool media_present;
36+
bool is_writable;
3637
uint8_t vendor_id[8];
3738
uint8_t product_id[16];
3839
uint8_t product_rev[4];
@@ -179,11 +180,17 @@ int32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, u
179180
return resplen;
180181
}
181182

183+
bool tud_msc_is_writable_cb(uint8_t lun) {
184+
log_v("[%u]: %u", lun, msc_luns[lun].is_writable);
185+
return msc_luns[lun].is_writable; // RAM disk is always ready
186+
}
187+
182188
USBMSC::USBMSC() {
183189
if (MSC_ACTIVE_LUN < MSC_MAX_LUN) {
184190
_lun = MSC_ACTIVE_LUN;
185191
MSC_ACTIVE_LUN++;
186192
msc_luns[_lun].media_present = false;
193+
msc_luns[_lun].is_writable = true;
187194
msc_luns[_lun].vendor_id[0] = 0;
188195
msc_luns[_lun].product_id[0] = 0;
189196
msc_luns[_lun].product_rev[0] = 0;
@@ -213,6 +220,7 @@ bool USBMSC::begin(uint32_t block_count, uint16_t block_size) {
213220

214221
void USBMSC::end() {
215222
msc_luns[_lun].media_present = false;
223+
msc_luns[_lun].is_writable = false;
216224
msc_luns[_lun].vendor_id[0] = 0;
217225
msc_luns[_lun].product_id[0] = 0;
218226
msc_luns[_lun].product_rev[0] = 0;
@@ -247,6 +255,10 @@ void USBMSC::onWrite(msc_write_cb cb) {
247255
msc_luns[_lun].write = cb;
248256
}
249257

258+
void USBMSC::isWritable(bool is_writable) {
259+
msc_luns[_lun].is_writable = is_writable;
260+
}
261+
250262
void USBMSC::mediaPresent(bool media_present) {
251263
msc_luns[_lun].media_present = media_present;
252264
}

Diff for: cores/esp32/USBMSC.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class USBMSC {
4444
void productID(const char *pid); //max 16 chars
4545
void productRevision(const char *ver); //max 4 chars
4646
void mediaPresent(bool media_present);
47+
void isWritable(bool is_writable);
4748
void onStartStop(msc_start_stop_cb cb);
4849
void onRead(msc_read_cb cb);
4950
void onWrite(msc_write_cb cb);

Diff for: cores/esp32/esp32-hal-tinyusb.c

+4
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ __attribute__((weak)) int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint
390390
__attribute__((weak)) int32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize) {
391391
return -1;
392392
}
393+
__attribute__((weak)) bool tud_msc_is_writable_cb(uint8_t lun) {
394+
return false;
395+
}
396+
393397
#endif
394398

395399
/*

Diff for: libraries/NetworkClientSecure/src/NetworkClientSecure.cpp

+23-27
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ NetworkClientSecure::NetworkClientSecure() {
3232
_connected = false;
3333
_timeout = 30000; // Same default as ssl_client
3434

35-
sslclient = new sslclient_context;
36-
ssl_init(sslclient);
35+
sslclient.reset(new sslclient_context, [](struct sslclient_context *sslclient) {
36+
stop_ssl_socket(sslclient);
37+
delete sslclient;
38+
});
39+
ssl_init(sslclient.get());
3740
sslclient->socket = -1;
3841
sslclient->handshake_timeout = 120000;
3942
_use_insecure = false;
@@ -53,8 +56,11 @@ NetworkClientSecure::NetworkClientSecure(int sock) {
5356
_lastReadTimeout = 0;
5457
_lastWriteTimeout = 0;
5558

56-
sslclient = new sslclient_context;
57-
ssl_init(sslclient);
59+
sslclient.reset(new sslclient_context, [](struct sslclient_context *sslclient) {
60+
stop_ssl_socket(sslclient);
61+
delete sslclient;
62+
});
63+
ssl_init(sslclient.get());
5864
sslclient->socket = sock;
5965
sslclient->handshake_timeout = 120000;
6066

@@ -71,20 +77,10 @@ NetworkClientSecure::NetworkClientSecure(int sock) {
7177
_alpn_protos = NULL;
7278
}
7379

74-
NetworkClientSecure::~NetworkClientSecure() {
75-
stop();
76-
delete sslclient;
77-
}
78-
79-
NetworkClientSecure &NetworkClientSecure::operator=(const NetworkClientSecure &other) {
80-
stop();
81-
sslclient->socket = other.sslclient->socket;
82-
_connected = other._connected;
83-
return *this;
84-
}
80+
NetworkClientSecure::~NetworkClientSecure() {}
8581

8682
void NetworkClientSecure::stop() {
87-
stop_ssl_socket(sslclient, _CA_cert, _cert, _private_key);
83+
stop_ssl_socket(sslclient.get());
8884

8985
_connected = false;
9086
_peek = -1;
@@ -130,10 +126,10 @@ int NetworkClientSecure::connect(const char *host, uint16_t port, const char *CA
130126
}
131127

132128
int NetworkClientSecure::connect(IPAddress ip, uint16_t port, const char *host, const char *CA_cert, const char *cert, const char *private_key) {
133-
int ret = start_ssl_client(sslclient, ip, port, host, _timeout, CA_cert, _use_ca_bundle, cert, private_key, NULL, NULL, _use_insecure, _alpn_protos);
129+
int ret = start_ssl_client(sslclient.get(), ip, port, host, _timeout, CA_cert, _use_ca_bundle, cert, private_key, NULL, NULL, _use_insecure, _alpn_protos);
134130

135131
if (ret >= 0 && !_stillinPlainStart) {
136-
ret = ssl_starttls_handshake(sslclient);
132+
ret = ssl_starttls_handshake(sslclient.get());
137133
} else {
138134
log_i("Actual TLS start postponed.");
139135
}
@@ -153,7 +149,7 @@ int NetworkClientSecure::startTLS() {
153149
int ret = 1;
154150
if (_stillinPlainStart) {
155151
log_i("startTLS: starting TLS/SSL on this dplain connection");
156-
ret = ssl_starttls_handshake(sslclient);
152+
ret = ssl_starttls_handshake(sslclient.get());
157153
if (ret < 0) {
158154
log_e("startTLS: %d", ret);
159155
stop();
@@ -178,7 +174,7 @@ int NetworkClientSecure::connect(const char *host, uint16_t port, const char *ps
178174
return 0;
179175
}
180176

181-
int ret = start_ssl_client(sslclient, address, port, host, _timeout, NULL, false, NULL, NULL, pskIdent, psKey, _use_insecure, _alpn_protos);
177+
int ret = start_ssl_client(sslclient.get(), address, port, host, _timeout, NULL, false, NULL, NULL, pskIdent, psKey, _use_insecure, _alpn_protos);
182178
_lastError = ret;
183179
if (ret < 0) {
184180
log_e("start_ssl_client: connect failed %d", ret);
@@ -213,7 +209,7 @@ size_t NetworkClientSecure::write(const uint8_t *buf, size_t size) {
213209
}
214210

215211
if (_stillinPlainStart) {
216-
return send_net_data(sslclient, buf, size);
212+
return send_net_data(sslclient.get(), buf, size);
217213
}
218214

219215
if (_lastWriteTimeout != _timeout) {
@@ -224,7 +220,7 @@ size_t NetworkClientSecure::write(const uint8_t *buf, size_t size) {
224220
_lastWriteTimeout = _timeout;
225221
}
226222
}
227-
int res = send_ssl_data(sslclient, buf, size);
223+
int res = send_ssl_data(sslclient.get(), buf, size);
228224
if (res < 0) {
229225
log_e("Closing connection on failed write");
230226
stop();
@@ -235,7 +231,7 @@ size_t NetworkClientSecure::write(const uint8_t *buf, size_t size) {
235231

236232
int NetworkClientSecure::read(uint8_t *buf, size_t size) {
237233
if (_stillinPlainStart) {
238-
return get_net_receive(sslclient, buf, size);
234+
return get_net_receive(sslclient.get(), buf, size);
239235
}
240236

241237
if (_lastReadTimeout != _timeout) {
@@ -268,7 +264,7 @@ int NetworkClientSecure::read(uint8_t *buf, size_t size) {
268264
buf++;
269265
peeked = 1;
270266
}
271-
res = get_ssl_receive(sslclient, buf, size);
267+
res = get_ssl_receive(sslclient.get(), buf, size);
272268

273269
if (res < 0) {
274270
log_e("Closing connection on failed read");
@@ -280,14 +276,14 @@ int NetworkClientSecure::read(uint8_t *buf, size_t size) {
280276

281277
int NetworkClientSecure::available() {
282278
if (_stillinPlainStart) {
283-
return peek_net_receive(sslclient, 0);
279+
return peek_net_receive(sslclient.get(), 0);
284280
}
285281

286282
int peeked = (_peek >= 0), res = -1;
287283
if (!_connected) {
288284
return peeked;
289285
}
290-
res = data_to_read(sslclient);
286+
res = data_to_read(sslclient.get());
291287

292288
if (res < 0 && !_stillinPlainStart) {
293289
log_e("Closing connection on failed available check");
@@ -346,7 +342,7 @@ bool NetworkClientSecure::verify(const char *fp, const char *domain_name) {
346342
return false;
347343
}
348344

349-
return verify_ssl_fingerprint(sslclient, fp, domain_name);
345+
return verify_ssl_fingerprint(sslclient.get(), fp, domain_name);
350346
}
351347

352348
char *NetworkClientSecure::_streamLoad(Stream &stream, size_t size) {

Diff for: libraries/NetworkClientSecure/src/NetworkClientSecure.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
#include "IPAddress.h"
2525
#include "Network.h"
2626
#include "ssl_client.h"
27+
#include <memory>
2728

2829
class NetworkClientSecure : public NetworkClient {
2930
protected:
30-
sslclient_context *sslclient;
31+
std::shared_ptr<sslclient_context> sslclient;
3132

3233
int _lastError = 0;
3334
int _peek = -1;
@@ -97,14 +98,14 @@ class NetworkClientSecure : public NetworkClient {
9798
return mbedtls_ssl_get_peer_cert(&sslclient->ssl_ctx);
9899
};
99100
bool getFingerprintSHA256(uint8_t sha256_result[32]) {
100-
return get_peer_fingerprint(sslclient, sha256_result);
101+
return get_peer_fingerprint(sslclient.get(), sha256_result);
101102
};
102103
int fd() const;
103104

104105
operator bool() {
105106
return connected();
106107
}
107-
NetworkClientSecure &operator=(const NetworkClientSecure &other);
108+
108109
bool operator==(const bool value) {
109110
return bool() == value;
110111
}

Diff for: libraries/NetworkClientSecure/src/ssl_client.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ int ssl_starttls_handshake(sslclient_context *ssl_client) {
344344
return ssl_client->socket;
345345
}
346346

347-
void stop_ssl_socket(sslclient_context *ssl_client, const char *rootCABuff, const char *cli_cert, const char *cli_key) {
347+
void stop_ssl_socket(sslclient_context *ssl_client) {
348348
log_v("Cleaning SSL connection.");
349349

350350
if (ssl_client->socket >= 0) {

Diff for: libraries/NetworkClientSecure/src/ssl_client.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ int start_ssl_client(
3434
const char *cli_cert, const char *cli_key, const char *pskIdent, const char *psKey, bool insecure, const char **alpn_protos
3535
);
3636
int ssl_starttls_handshake(sslclient_context *ssl_client);
37-
void stop_ssl_socket(sslclient_context *ssl_client, const char *rootCABuff, const char *cli_cert, const char *cli_key);
37+
void stop_ssl_socket(sslclient_context *ssl_client);
3838
int data_to_read(sslclient_context *ssl_client);
3939
int send_ssl_data(sslclient_context *ssl_client, const uint8_t *data, size_t len);
4040
int get_ssl_receive(sslclient_context *ssl_client, uint8_t *data, int length);

Diff for: libraries/USB/examples/USBMSC/USBMSC.ino

+3
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ void setup() {
152152
MSC.onStartStop(onStartStop);
153153
MSC.onRead(onRead);
154154
MSC.onWrite(onWrite);
155+
155156
MSC.mediaPresent(true);
157+
MSC.isWritable(true); // true if writable, false if read-only
158+
156159
MSC.begin(DISK_SECTOR_COUNT, DISK_SECTOR_SIZE);
157160
USB.begin();
158161
}

0 commit comments

Comments
 (0)