mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 10:32:44 +01:00
Merge pull request #20564 from benpicco/go-coap_workaround
gnrc, nanocoap: add optional work-arounds for buggy CoAP servers
This commit is contained in:
commit
9761456363
@ -175,6 +175,18 @@ extern "C" {
|
|||||||
#define CONFIG_NANOCOAP_SERVER_STACK_SIZE THREAD_STACKSIZE_DEFAULT
|
#define CONFIG_NANOCOAP_SERVER_STACK_SIZE THREAD_STACKSIZE_DEFAULT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Include a random token with block-wise transfers.
|
||||||
|
*
|
||||||
|
* This is a workaround for buggy CoPA implementations (e.g. go-coap) that expect
|
||||||
|
* to identify block-wise transfers based on the token.
|
||||||
|
*
|
||||||
|
* See https://github.com/plgd-dev/go-coap/issues/512
|
||||||
|
*/
|
||||||
|
#ifndef CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN
|
||||||
|
#define CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief NanoCoAP socket types
|
* @brief NanoCoAP socket types
|
||||||
*/
|
*/
|
||||||
|
@ -60,6 +60,9 @@ typedef struct {
|
|||||||
coap_blockwise_cb_t callback;
|
coap_blockwise_cb_t callback;
|
||||||
void *arg;
|
void *arg;
|
||||||
bool more;
|
bool more;
|
||||||
|
#if CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN
|
||||||
|
uint8_t token[4];
|
||||||
|
#endif
|
||||||
} _block_ctx_t;
|
} _block_ctx_t;
|
||||||
|
|
||||||
int nanocoap_sock_dtls_connect(nanocoap_sock_t *sock, sock_udp_ep_t *local,
|
int nanocoap_sock_dtls_connect(nanocoap_sock_t *sock, sock_udp_ep_t *local,
|
||||||
@ -601,7 +604,17 @@ static int _fetch_block(nanocoap_sock_t *sock, uint8_t *buf, size_t len,
|
|||||||
};
|
};
|
||||||
uint16_t lastonum = 0;
|
uint16_t lastonum = 0;
|
||||||
|
|
||||||
buf += coap_build_hdr(pkt.hdr, COAP_TYPE_CON, NULL, 0, COAP_METHOD_GET,
|
void *token = NULL;
|
||||||
|
size_t token_len = 0;
|
||||||
|
|
||||||
|
#if CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN
|
||||||
|
/* HACK: go-coap always expects a token */
|
||||||
|
/* see https://github.com/plgd-dev/go-coap/issues/512 */
|
||||||
|
token = ctx->token;
|
||||||
|
token_len = sizeof(ctx->token);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buf += coap_build_hdr(pkt.hdr, COAP_TYPE_CON, token, token_len, COAP_METHOD_GET,
|
||||||
nanocoap_sock_next_msg_id(sock));
|
nanocoap_sock_next_msg_id(sock));
|
||||||
buf += coap_opt_put_uri_pathquery(buf, &lastonum, path);
|
buf += coap_opt_put_uri_pathquery(buf, &lastonum, path);
|
||||||
buf += coap_opt_put_uint(buf, lastonum, COAP_OPT_BLOCK2, (num << 4) | blksize);
|
buf += coap_opt_put_uint(buf, lastonum, COAP_OPT_BLOCK2, (num << 4) | blksize);
|
||||||
@ -674,6 +687,10 @@ int nanocoap_sock_get_blockwise(nanocoap_sock_t *sock, const char *path,
|
|||||||
.more = true,
|
.more = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if CONFIG_NANOCOAP_SOCK_BLOCK_TOKEN
|
||||||
|
random_bytes(ctx.token, sizeof(ctx.token));
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned num = 0;
|
unsigned num = 0;
|
||||||
while (ctx.more) {
|
while (ctx.more) {
|
||||||
DEBUG("nanocoap: fetching block %u\n", num);
|
DEBUG("nanocoap: fetching block %u\n", num);
|
||||||
|
@ -55,6 +55,14 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define GNRC_SOCK_DYN_PORTRANGE_ERR (0)
|
#define GNRC_SOCK_DYN_PORTRANGE_ERR (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if remote address of a UDP packet matches the address the socket
|
||||||
|
* is bound to.
|
||||||
|
*/
|
||||||
|
#ifndef CONFIG_GNRC_SOCK_UDP_CHECK_REMOTE_ADDR
|
||||||
|
#define CONFIG_GNRC_SOCK_UDP_CHECK_REMOTE_ADDR (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Structure to retrieve auxiliary data from @ref gnrc_sock_recv
|
* @brief Structure to retrieve auxiliary data from @ref gnrc_sock_recv
|
||||||
*
|
*
|
||||||
|
@ -231,7 +231,9 @@ static bool _accept_remote(const sock_udp_t *sock, const udp_hdr_t *hdr,
|
|||||||
ipv6_addr_to_str(addr_str, (ipv6_addr_t *)&sock->remote.addr, sizeof(addr_str)));
|
ipv6_addr_to_str(addr_str, (ipv6_addr_t *)&sock->remote.addr, sizeof(addr_str)));
|
||||||
DEBUG(", source (%s) does not match\n",
|
DEBUG(", source (%s) does not match\n",
|
||||||
ipv6_addr_to_str(addr_str, (ipv6_addr_t *)&remote->addr, sizeof(addr_str)));
|
ipv6_addr_to_str(addr_str, (ipv6_addr_t *)&remote->addr, sizeof(addr_str)));
|
||||||
return false;
|
if (CONFIG_GNRC_SOCK_UDP_CHECK_REMOTE_ADDR) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user