mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 05:32:45 +01:00
sys/net/nanocoap: add and use coap_get_response_hdr_len()
Before, handlers writing blockwise transfer assumed that the response header length will match the request header length. This is true for UDP, but not for TCP: The CoAP over TCP header contains a Len field, that gets extended for larger messages. Since the reply often is indeed larger than the request, this is indeed often the case for CoAP over TCP. Note: Right now, no CoAP over TCP implementation is upstream. However, getting rid of incorrect assumptions now will make life easier later on.
This commit is contained in:
parent
afb16bb705
commit
68beb52f14
@ -53,7 +53,7 @@ static ssize_t _riot_block2_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, c
|
|||||||
(void)context;
|
(void)context;
|
||||||
coap_block_slicer_t slicer;
|
coap_block_slicer_t slicer;
|
||||||
coap_block2_init(pkt, &slicer);
|
coap_block2_init(pkt, &slicer);
|
||||||
uint8_t *payload = buf + coap_get_total_hdr_len(pkt);
|
uint8_t *payload = buf + coap_get_response_hdr_len(pkt);
|
||||||
|
|
||||||
uint8_t *bufpos = payload;
|
uint8_t *bufpos = payload;
|
||||||
|
|
||||||
|
@ -677,6 +677,22 @@ static inline unsigned coap_get_total_hdr_len(const coap_pkt_t *pkt)
|
|||||||
coap_get_token_len(pkt);
|
coap_get_token_len(pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the header length a response to the given packet will have
|
||||||
|
*
|
||||||
|
* @param[in] pkt CoAP packet to reply to
|
||||||
|
* @return Length of the response header including token excluding
|
||||||
|
* CoAP options and any payload marker
|
||||||
|
*
|
||||||
|
* @note The main use case is the use of @ref coap_block2_build_reply, which
|
||||||
|
* is building the CoAP header of the response after options and
|
||||||
|
* payload have been added.
|
||||||
|
*/
|
||||||
|
static inline unsigned coap_get_response_hdr_len(const coap_pkt_t *pkt)
|
||||||
|
{
|
||||||
|
return coap_get_total_hdr_len(pkt);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write the given raw message code to given CoAP header
|
* @brief Write the given raw message code to given CoAP header
|
||||||
*
|
*
|
||||||
@ -1939,6 +1955,9 @@ static inline size_t coap_put_option_ct(uint8_t *buf, uint16_t lastonum,
|
|||||||
* @param[in] payload_len length of payload
|
* @param[in] payload_len length of payload
|
||||||
* @param[in] slicer slicer to use
|
* @param[in] slicer slicer to use
|
||||||
*
|
*
|
||||||
|
* @warning Use @ref coap_get_response_hdr_len to determine the size of the
|
||||||
|
* header this will write.
|
||||||
|
*
|
||||||
* @returns size of reply packet on success
|
* @returns size of reply packet on success
|
||||||
* @returns <0 on error
|
* @returns <0 on error
|
||||||
*/
|
*/
|
||||||
|
@ -110,10 +110,13 @@
|
|||||||
* Start with coap_block2_init() to read the client request and initialize a
|
* Start with coap_block2_init() to read the client request and initialize a
|
||||||
* coap_slicer_t struct with the size and location for this slice of the
|
* coap_slicer_t struct with the size and location for this slice of the
|
||||||
* overall payload. Then write the block2 option in the response with
|
* overall payload. Then write the block2 option in the response with
|
||||||
* coap_opt_put_block2(). The option includes an indicator ("more") that a
|
* coap_opt_put_block2(). Use @ref coap_get_response_hdr_len to get the length
|
||||||
* slice completes the overall payload transfer. You may not know the value for
|
* of the response header: This will be the offset in the buffer where you
|
||||||
* _more_ at this point, but you must initialize the space in the packet for
|
* should start adding options. The Block2 option includes an indicator
|
||||||
* the option before writing the payload. The option is rewritten later.
|
* ("more") that a slice completes the overall payload transfer. You may not
|
||||||
|
* know the value for _more_ at this point, but you must initialize the space
|
||||||
|
* in the packet for the option before writing the payload. The option is
|
||||||
|
* rewritten later.
|
||||||
*
|
*
|
||||||
* Next, use the coap_blockwise_put_xxx() functions to write the payload
|
* Next, use the coap_blockwise_put_xxx() functions to write the payload
|
||||||
* content. These functions use the coap_block_slicer_t to enable or disable
|
* content. These functions use the coap_block_slicer_t to enable or disable
|
||||||
|
@ -1415,7 +1415,7 @@ ssize_t coap_well_known_core_default_handler(coap_pkt_t *pkt, uint8_t *buf, \
|
|||||||
(void)context;
|
(void)context;
|
||||||
coap_block_slicer_t slicer;
|
coap_block_slicer_t slicer;
|
||||||
coap_block2_init(pkt, &slicer);
|
coap_block2_init(pkt, &slicer);
|
||||||
uint8_t *payload = buf + coap_get_total_hdr_len(pkt);
|
uint8_t *payload = buf + coap_get_response_hdr_len(pkt);
|
||||||
uint8_t *bufpos = payload;
|
uint8_t *bufpos = payload;
|
||||||
bufpos += coap_put_option_ct(bufpos, 0, COAP_FORMAT_LINK);
|
bufpos += coap_put_option_ct(bufpos, 0, COAP_FORMAT_LINK);
|
||||||
bufpos += coap_opt_put_block2(bufpos, COAP_OPT_CONTENT_FORMAT, &slicer, 1);
|
bufpos += coap_opt_put_block2(bufpos, COAP_OPT_CONTENT_FORMAT, &slicer, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user