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
 | 
			
		||||
 | 
			
		||||
// FIXME: Add compile time configuration and define conditionaly
 | 
			
		||||
#define LWIP_NETBUF_RECVINFO            MBED_CONF_LWIP_NETBUF_RECVINFO_ENABLED
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
 * 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 {
 | 
			
		||||
    // 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) :
 | 
			
		||||
        start(hdr),
 | 
			
		||||
        current(nullptr),
 | 
			
		||||
        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()
 | 
			
		||||
    {
 | 
			
		||||
        if (current == nullptr) {
 | 
			
		||||
| 
						 | 
				
			
			@ -55,8 +126,11 @@ struct MsgHeaderIterator {
 | 
			
		|||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Returns pointer to the next member of the list.
 | 
			
		||||
    // If next member doesn't exist nullptr is returned.
 | 
			
		||||
    /** Returns next element of the list.
 | 
			
		||||
     *
 | 
			
		||||
     *  @retval nullptr if the list doesn't contain next element.
 | 
			
		||||
     *  @retval Pointer to the next element otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    nsapi_msghdr_t *next()
 | 
			
		||||
    {
 | 
			
		||||
        if (!has_next()) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@
 | 
			
		|||
#define NSAPI_TYPES_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include "mbed_toolchain.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
| 
						 | 
				
			
			@ -410,7 +411,7 @@ typedef struct nsapi_stagger_req {
 | 
			
		|||
 | 
			
		||||
/** 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 */
 | 
			
		||||
    int          level;  /* Originating protocol */
 | 
			
		||||
    int          type;   /* Protocol-specific type */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue