iot/zoap: Add helpers for dealing with integer options
A good number of option values represent numbers, so add these helpers so applications can avoid repeating this. Change-Id: Ied2a844c51808dcafe751a77492d00f2063de7d6 Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
This commit is contained in:
parent
441d22a371
commit
7079a18267
2 changed files with 63 additions and 16 deletions
|
@ -557,6 +557,28 @@ int zoap_handle_request(struct zoap_packet *pkt,
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int zoap_option_value_to_int(const struct zoap_option *option)
|
||||||
|
{
|
||||||
|
switch (option->len) {
|
||||||
|
case 0:
|
||||||
|
return 0;
|
||||||
|
case 1:
|
||||||
|
return option->value[0];
|
||||||
|
case 2:
|
||||||
|
return (option->value[0] << 0) | (option->value[1] << 8);
|
||||||
|
case 3:
|
||||||
|
return (option->value[0] << 0) | (option->value[1] << 8) |
|
||||||
|
(option->value[2] << 16);
|
||||||
|
case 4:
|
||||||
|
return (option->value[0] << 0) | (option->value[1] << 8) |
|
||||||
|
(option->value[2] << 16) | (option->value[3] << 24);
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int get_observe_option(const struct zoap_packet *pkt)
|
static int get_observe_option(const struct zoap_packet *pkt)
|
||||||
{
|
{
|
||||||
struct zoap_option option = {};
|
struct zoap_option option = {};
|
||||||
|
@ -568,22 +590,7 @@ static int get_observe_option(const struct zoap_packet *pkt)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The value is in the network order, and has at max 3 bytes. */
|
return zoap_option_value_to_int(&option);
|
||||||
switch (option.len) {
|
|
||||||
case 0:
|
|
||||||
return 0;
|
|
||||||
case 1:
|
|
||||||
return option.value[0];
|
|
||||||
case 2:
|
|
||||||
return (option.value[0] << 0) | (option.value[1] << 8);
|
|
||||||
case 3:
|
|
||||||
return (option.value[0] << 0) | (option.value[1] << 8) |
|
|
||||||
(option.value[2] << 16);
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct zoap_reply *zoap_response_received(
|
struct zoap_reply *zoap_response_received(
|
||||||
|
@ -807,6 +814,32 @@ int zoap_add_option(struct zoap_packet *pkt, uint16_t code,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int zoap_add_option_int(struct zoap_packet *pkt, uint16_t code,
|
||||||
|
unsigned int val)
|
||||||
|
{
|
||||||
|
uint8_t data[4], len;
|
||||||
|
|
||||||
|
if (val == 0) {
|
||||||
|
data[0] = 0;
|
||||||
|
len = 0;
|
||||||
|
} else if (val < 0xFF) {
|
||||||
|
data[0] = (uint8_t) val;
|
||||||
|
len = 1;
|
||||||
|
} else if (val < 0xFFFF) {
|
||||||
|
sys_put_be16(val, data);
|
||||||
|
len = 2;
|
||||||
|
} else if (val < 0xFFFFFF) {
|
||||||
|
sys_put_be16(val, data);
|
||||||
|
data[2] = val >> 16;
|
||||||
|
len = 3;
|
||||||
|
} else {
|
||||||
|
sys_put_be32(val, data);
|
||||||
|
len = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zoap_add_option(pkt, code, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
int zoap_find_options(const struct zoap_packet *pkt, uint16_t code,
|
int zoap_find_options(const struct zoap_packet *pkt, uint16_t code,
|
||||||
struct zoap_option *options, uint16_t veclen)
|
struct zoap_option *options, uint16_t veclen)
|
||||||
{
|
{
|
||||||
|
|
|
@ -382,6 +382,20 @@ int zoap_packet_set_used(struct zoap_packet *pkt, uint16_t len);
|
||||||
int zoap_add_option(struct zoap_packet *pkt, uint16_t code,
|
int zoap_add_option(struct zoap_packet *pkt, uint16_t code,
|
||||||
const void *value, uint16_t len);
|
const void *value, uint16_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts an option to its integer representation. It assumes that
|
||||||
|
* the number is encoded in the network byte order in the option.
|
||||||
|
*/
|
||||||
|
unsigned int zoap_option_value_to_int(const struct zoap_option *option);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an integer value option to the packet. The option must be
|
||||||
|
* added in numeric order of their codes, and the least amount of
|
||||||
|
* bytes will be used to encode the value.
|
||||||
|
*/
|
||||||
|
int zoap_add_option_int(struct zoap_packet *pkt, uint16_t code,
|
||||||
|
unsigned int val);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the values associated with the option of value @a code.
|
* Return the values associated with the option of value @a code.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue