mirror of https://github.com/ARMmbed/mbed-os.git
Adding documentation and minor code changes
Doxygen documentation for MsgHeaderIterator was added. Type used for alignment of the nsapi_msghdr_t struct was changed.pull/15040/head
parent
ec3f4379d9
commit
c3d16f733f
|
@ -311,7 +311,6 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// FIXME: Add compile time configuration and define conditionaly
|
|
||||||
#define LWIP_NETBUF_RECVINFO MBED_CONF_LWIP_NETBUF_RECVINFO_ENABLED
|
#define LWIP_NETBUF_RECVINFO MBED_CONF_LWIP_NETBUF_RECVINFO_ENABLED
|
||||||
|
|
||||||
// Make sure we default these to off, so
|
// Make sure we default these to off, so
|
||||||
|
|
|
@ -23,17 +23,88 @@
|
||||||
/**
|
/**
|
||||||
* Allows iteration through the list of message headers received in the control parameter of the
|
* Allows iteration through the list of message headers received in the control parameter of the
|
||||||
* socket_sendto_control / socket_recvfrom_control methods.
|
* socket_sendto_control / socket_recvfrom_control methods.
|
||||||
|
*
|
||||||
|
* @par Members types
|
||||||
|
*
|
||||||
|
* MsgHeaderIterator works on the list which members are of type nsapi_msghdr_t or other types
|
||||||
|
* extending this struct. For example nsapi_pktinfo:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
typedef struct nsapi_pktinfo {
|
||||||
|
nsapi_msghdr_t hdr;
|
||||||
|
nsapi_addr_t ipi_addr;
|
||||||
|
int ipi_ifindex;
|
||||||
|
void *network_interface;
|
||||||
|
} nsapi_pktinfo_t;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* There are two requirements for such structs to work well with MsgHeaderIterator:
|
||||||
|
* first element needs to of type nsapi_msghdr_t
|
||||||
|
* value of the field len of the nsapi_msghdr_t needs to bet set to the size of the whole extending type. For example:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
nsapi_pktinfo_t pkt_info;
|
||||||
|
pkt_info.hdr.len = sizeof(nsapi_pktinfo_t);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* This value is used in the MsgHeaderIterator to calculate proper addresses of the list elements.
|
||||||
|
*
|
||||||
|
* @par Example
|
||||||
|
*
|
||||||
|
* Code presenting minimal usage example.
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
*
|
||||||
|
struct default_buffer_t {
|
||||||
|
default_buffer_t()
|
||||||
|
{
|
||||||
|
el1.hdr.len = sizeof(nsapi_pktinfo_t);
|
||||||
|
el2.len = sizeof(nsapi_msghdr_t);
|
||||||
|
el3.len = sizeof(nsapi_msghdr_t);
|
||||||
|
el4.hdr.len = sizeof(nsapi_pktinfo_t);
|
||||||
|
}
|
||||||
|
nsapi_pktinfo_t el1;
|
||||||
|
nsapi_msghdr_t el2;
|
||||||
|
nsapi_msghdr_t el3;
|
||||||
|
nsapi_pktinfo_t el4;
|
||||||
|
};
|
||||||
|
|
||||||
|
default_buffer buff;
|
||||||
|
nsapi_msghdr_t *hdr_p = reinterpret_cast<nsapi_msghdr_t *>(&buff);
|
||||||
|
|
||||||
|
MsgHeaderIterator it(hdr_p, sizeof(buff));
|
||||||
|
|
||||||
|
it.has_next() // returns true
|
||||||
|
auto p1 = it.next() // returns pointer to el1
|
||||||
|
auto p2 = it.next() // returns pointer to el2
|
||||||
|
auto p3 = it.next() // returns pointer to el3
|
||||||
|
auto p4 = it.next() // returns pointer to el4
|
||||||
|
|
||||||
|
it.has_next() // returns false
|
||||||
|
auto p5 = it.next() // returns nullptr
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @note More usage examples are implemented in the `MsgHeaderIterator` unit test
|
||||||
|
* in `netsocket/tests/UNITTESTS/NetworkStack/test_MsgHeaderIterator.cpp`
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct MsgHeaderIterator {
|
struct MsgHeaderIterator {
|
||||||
// Constructor takes pointer to the first header element and size of the whole list.
|
/** Create a MsgHeaderIterator over given nsapi_msghdr_t list.
|
||||||
|
*
|
||||||
|
* @param hdr Pointer to the first list element.
|
||||||
|
* @param size Size of the whole list.
|
||||||
|
*/
|
||||||
MsgHeaderIterator(nsapi_msghdr_t *hdr, nsapi_size_t size) :
|
MsgHeaderIterator(nsapi_msghdr_t *hdr, nsapi_size_t size) :
|
||||||
start(hdr),
|
start(hdr),
|
||||||
current(nullptr),
|
current(nullptr),
|
||||||
size(size)
|
size(size)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// Checks if the next address of the iterator is a valid list member.
|
/** Checks if the next address of the iterator is a valid list member.
|
||||||
|
*
|
||||||
|
* @retval True if the next address is a valid member.
|
||||||
|
* @retval False otherwise.
|
||||||
|
*/
|
||||||
bool has_next()
|
bool has_next()
|
||||||
{
|
{
|
||||||
if (current == nullptr) {
|
if (current == nullptr) {
|
||||||
|
@ -55,8 +126,11 @@ struct MsgHeaderIterator {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns pointer to the next member of the list.
|
/** Returns next element of the list.
|
||||||
// If next member doesn't exist nullptr is returned.
|
*
|
||||||
|
* @retval nullptr if the list doesn't contain next element.
|
||||||
|
* @retval Pointer to the next element otherwise.
|
||||||
|
*/
|
||||||
nsapi_msghdr_t *next()
|
nsapi_msghdr_t *next()
|
||||||
{
|
{
|
||||||
if (!has_next()) {
|
if (!has_next()) {
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define NSAPI_TYPES_H
|
#define NSAPI_TYPES_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include "mbed_toolchain.h"
|
#include "mbed_toolchain.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -410,7 +411,7 @@ typedef struct nsapi_stagger_req {
|
||||||
|
|
||||||
/** nsapi_msghdr
|
/** nsapi_msghdr
|
||||||
*/
|
*/
|
||||||
typedef struct MBED_ALIGN(double) nsapi_msghdr {
|
typedef struct MBED_ALIGN(max_align_t) nsapi_msghdr {
|
||||||
nsapi_size_t len; /* Data byte count, including header */
|
nsapi_size_t len; /* Data byte count, including header */
|
||||||
int level; /* Originating protocol */
|
int level; /* Originating protocol */
|
||||||
int type; /* Protocol-specific type */
|
int type; /* Protocol-specific type */
|
||||||
|
|
Loading…
Reference in New Issue