mirror of https://github.com/ARMmbed/mbed-os.git
Code/bug after testing
1. Fixing astyle and docs 2. Extra mutex lock was removed 3. Bytes are updated when send/recv > 0 and not in case of -ve error 4. Review comments 5. Guard statistics implementation in test with MBED_NW_STATS_ENABLEDpull/8592/head
parent
eec54a0fc9
commit
a851df66e3
|
@ -119,14 +119,12 @@ int split2half_rmng_tcp_test_time()
|
|||
return (tcp_global::TESTS_TIMEOUT - tc_bucket.read()) / 2;
|
||||
}
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int fetch_stats()
|
||||
{
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
return SocketStats::mbed_stats_socket_get_each(&tcp_stats[0], MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
// Test setup
|
||||
utest::v1::status_t greentea_setup(const size_t number_of_cases)
|
||||
|
|
|
@ -23,10 +23,10 @@ void drop_bad_packets(TCPSocket &sock, int orig_timeout);
|
|||
void fill_tx_buffer_ascii(char *buff, size_t len);
|
||||
nsapi_error_t tcpsocket_connect_to_echo_srv(TCPSocket &sock);
|
||||
nsapi_error_t tcpsocket_connect_to_discard_srv(TCPSocket &sock);
|
||||
int fetch_stats(void);
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
extern mbed_stats_socket_t tcp_stats[MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT];
|
||||
int fetch_stats(void);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
@ -114,12 +114,13 @@ void tcpsocket_echotest_nonblock_receiver(void *receive_bytes)
|
|||
|
||||
void TCPSOCKET_ECHOTEST_NONBLOCK()
|
||||
{
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int j = 0;
|
||||
int count = fetch_stats();
|
||||
for (; j < count; j++) {
|
||||
TEST_ASSERT_EQUAL(SOCK_CLOSED, tcp_stats[j].state);
|
||||
}
|
||||
|
||||
#endif
|
||||
tc_exec_time.start();
|
||||
time_allotted = split2half_rmng_tcp_test_time(); // [s]
|
||||
|
||||
|
@ -166,6 +167,7 @@ void TCPSOCKET_ECHOTEST_NONBLOCK()
|
|||
bytes2send -= sent;
|
||||
}
|
||||
printf("[Sender#%02d] bytes sent: %d\n", s_idx, pkt_s);
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
count = fetch_stats();
|
||||
for (j = 0; j < count; j++) {
|
||||
if ((tcp_stats[j].state == SOCK_OPEN) && (tcp_stats[j].proto == NSAPI_TCP)) {
|
||||
|
@ -173,7 +175,7 @@ void TCPSOCKET_ECHOTEST_NONBLOCK()
|
|||
}
|
||||
}
|
||||
TEST_ASSERT_EQUAL(bytes2send, tcp_stats[j].sent_bytes);
|
||||
|
||||
#endif
|
||||
tx_sem.wait(split2half_rmng_tcp_test_time());
|
||||
thread->join();
|
||||
delete thread;
|
||||
|
|
|
@ -26,11 +26,12 @@ using namespace utest::v1;
|
|||
|
||||
void TCPSOCKET_OPEN_CLOSE_REPEAT()
|
||||
{
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int count = fetch_stats();
|
||||
for (int j = 0; j < count; j++) {
|
||||
TEST_ASSERT_EQUAL(SOCK_CLOSED, tcp_stats[j].state);
|
||||
}
|
||||
|
||||
#endif
|
||||
TCPSocket *sock = new TCPSocket;
|
||||
if (!sock) {
|
||||
TEST_FAIL();
|
||||
|
@ -41,9 +42,10 @@ void TCPSOCKET_OPEN_CLOSE_REPEAT()
|
|||
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->close());
|
||||
}
|
||||
delete sock;
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
count = fetch_stats();
|
||||
for (int j = 0; j < count; j++) {
|
||||
TEST_ASSERT_EQUAL(SOCK_CLOSED, tcp_stats[j].state);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -70,6 +70,7 @@ void TCPSOCKET_OPEN_LIMIT()
|
|||
break;
|
||||
}
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int count = fetch_stats();
|
||||
int open_count = 0;
|
||||
for (int j = 0; j < count; j++) {
|
||||
|
@ -78,6 +79,7 @@ void TCPSOCKET_OPEN_LIMIT()
|
|||
}
|
||||
}
|
||||
TEST_ASSERT(open_count >= 4);
|
||||
#endif
|
||||
|
||||
TCPSocketItem *tmp;
|
||||
for (TCPSocketItem *it = socket_list_head; it;) {
|
||||
|
|
|
@ -80,14 +80,12 @@ void fill_tx_buffer_ascii(char *buff, size_t len)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int fetch_stats()
|
||||
{
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
return SocketStats::mbed_stats_socket_get_each(&udp_stats[0], MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
// Test setup
|
||||
utest::v1::status_t greentea_setup(const size_t number_of_cases)
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
NetworkInterface *get_interface();
|
||||
void drop_bad_packets(UDPSocket &sock, int orig_timeout);
|
||||
void fill_tx_buffer_ascii(char *buff, size_t len);
|
||||
int fetch_stats(void);
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
extern mbed_stats_socket_t udp_stats[MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT];
|
||||
int fetch_stats(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -26,11 +26,12 @@ using namespace utest::v1;
|
|||
|
||||
void UDPSOCKET_OPEN_CLOSE_REPEAT()
|
||||
{
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int count = fetch_stats();
|
||||
for (int j = 0; j < count; j++) {
|
||||
TEST_ASSERT_EQUAL(SOCK_CLOSED, udp_stats[j].state);
|
||||
}
|
||||
|
||||
#endif
|
||||
UDPSocket *sock = new UDPSocket;
|
||||
if (!sock) {
|
||||
TEST_FAIL();
|
||||
|
@ -41,9 +42,10 @@ void UDPSOCKET_OPEN_CLOSE_REPEAT()
|
|||
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->close());
|
||||
}
|
||||
delete sock;
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
count = fetch_stats();
|
||||
for (int j = 0; j < count; j++) {
|
||||
TEST_ASSERT_EQUAL(SOCK_CLOSED, udp_stats[j].state);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ void UDPSOCKET_OPEN_LIMIT()
|
|||
if (!socket_list_head) {
|
||||
break;
|
||||
}
|
||||
|
||||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
int count = fetch_stats();
|
||||
int open_count = 0;
|
||||
for (int j = 0; j < count; j++) {
|
||||
|
@ -79,7 +79,7 @@ void UDPSOCKET_OPEN_LIMIT()
|
|||
}
|
||||
}
|
||||
TEST_ASSERT(open_count >= 3);
|
||||
|
||||
#endif
|
||||
UDPSocketItem *tmp;
|
||||
for (UDPSocketItem *it = socket_list_head; it;) {
|
||||
++open_sockets[i];
|
||||
|
|
|
@ -31,7 +31,6 @@ uint32_t SocketStats::_size = 0;
|
|||
|
||||
int SocketStats::get_entry_position(const Socket *const reference_id)
|
||||
{
|
||||
_mutex->lock();
|
||||
for (uint32_t j = 0; j < _size; j++) {
|
||||
if (_stats[j].reference_id == reference_id) {
|
||||
return j;
|
||||
|
@ -70,7 +69,7 @@ void SocketStats::stats_new_socket_entry(const Socket *const reference_id)
|
|||
if (get_entry_position(reference_id) >= 0) {
|
||||
// Duplicate entry
|
||||
MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STATS, MBED_ERROR_CODE_INVALID_INDEX), "Duplicate socket Reference ID ", reference_id);
|
||||
} else if (_size <= MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT) {
|
||||
} else if (_size < MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT) {
|
||||
// Add new entry
|
||||
_stats[_size].reference_id = (Socket *)reference_id;
|
||||
_size++;
|
||||
|
@ -87,7 +86,7 @@ void SocketStats::stats_new_socket_entry(const Socket *const reference_id)
|
|||
}
|
||||
}
|
||||
if (-1 == position) {
|
||||
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STATS, MBED_ERROR_CODE_OUT_OF_RESOURCES), "List full with all open sockets");
|
||||
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STATS, MBED_ERROR_CODE_OUT_OF_RESOURCES), "List full with all open sockets");
|
||||
}
|
||||
memset(&_stats[position], 0, sizeof(mbed_stats_socket_t));
|
||||
_stats[position].reference_id = (Socket *)reference_id;
|
||||
|
@ -117,10 +116,8 @@ void SocketStats::stats_update_peer(const Socket *const reference_id, const Sock
|
|||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
_mutex->lock();
|
||||
int position = get_entry_position(reference_id);
|
||||
if (position >= 0) {
|
||||
if (!_stats[position].peer) {
|
||||
_stats[position].peer = peer;
|
||||
}
|
||||
if ((position >= 0) && (!_stats[position].peer)) {
|
||||
_stats[position].peer = peer;
|
||||
}
|
||||
_mutex->unlock();
|
||||
#endif
|
||||
|
@ -143,7 +140,7 @@ void SocketStats::stats_update_sent_bytes(const Socket *const reference_id, size
|
|||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
_mutex->lock();
|
||||
int position = get_entry_position(reference_id);
|
||||
if (position >= 0) {
|
||||
if ((position >= 0) && (sent_bytes > 0)) {
|
||||
_stats[position].sent_bytes += sent_bytes;
|
||||
}
|
||||
_mutex->unlock();
|
||||
|
@ -155,7 +152,7 @@ void SocketStats::stats_update_recv_bytes(const Socket *const reference_id, size
|
|||
#if defined(MBED_NW_STATS_ENABLED)
|
||||
_mutex->lock();
|
||||
int position = get_entry_position(reference_id);
|
||||
if (position >= 0) {
|
||||
if ((position >= 0) && (recv_bytes > 0)) {
|
||||
_stats[position].recv_bytes += recv_bytes;
|
||||
}
|
||||
_mutex->unlock();
|
||||
|
|
|
@ -33,7 +33,7 @@ typedef enum {
|
|||
SOCK_OPEN, /**< Socket is open, but not associated to any peer address */
|
||||
SOCK_CONNECTED, /**< Socket is associated to peer address, either by connect() or sendto()/recvfrom() calls */
|
||||
SOCK_LISTEN, /**< Socket is listening for incoming connections */
|
||||
}socket_state;
|
||||
} socket_state;
|
||||
|
||||
typedef struct {
|
||||
Socket *reference_id; /**< Used for identifying socket */
|
||||
|
@ -47,11 +47,18 @@ typedef struct {
|
|||
|
||||
/** SocketStats class
|
||||
*
|
||||
*
|
||||
* Class to get the network socket statistics
|
||||
*/
|
||||
class SocketStats
|
||||
{
|
||||
public:
|
||||
class SocketStats {
|
||||
public:
|
||||
|
||||
/** Create an socket statictics object
|
||||
*
|
||||
* Application users must not create class objects.
|
||||
* The class object will be created by entities reporting network statistics.
|
||||
* Application can fetch network statistics using static `mbed_stats_socket_get_each` API
|
||||
* without creating an object.
|
||||
*/
|
||||
SocketStats();
|
||||
virtual ~SocketStats()
|
||||
{
|
||||
|
@ -63,29 +70,29 @@ public:
|
|||
* @param stats A pointer to an array of mbed_stats_socket_t structures to fill
|
||||
* @param count The number of mbed_stats_socket_t structures in the provided array
|
||||
* @return The number of mbed_stats_socket_t structures that have been filled.
|
||||
* If the number of sockets on the system is less than or equal to count,
|
||||
* If the number of sockets on the system is less than or equal to count,
|
||||
* it will equal the number of sockets created (active / closed).
|
||||
* If the number of sockets on the system is greater than count,
|
||||
* If the number of sockets on the system is greater than count,
|
||||
* it will equal count.
|
||||
*/
|
||||
static size_t mbed_stats_socket_get_each(mbed_stats_socket_t *stats, size_t count);
|
||||
|
||||
/** Add entry of newly created socket in statistics array.
|
||||
@Note: Entry in the array will be maintained even after socket is closed.
|
||||
It will be over-written for closed sockets when socket entries in
|
||||
`MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT` exceed.
|
||||
@Note: Entry in the array will be maintained even after socket is closed.
|
||||
Entry will be over-written for sockets which were closed first, in case
|
||||
we socket creation count exceeds `MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT`.
|
||||
*/
|
||||
void stats_new_socket_entry(const Socket *const reference_id);
|
||||
|
||||
|
||||
/** Updates the state of socket and along with that records tick_last_change */
|
||||
void stats_update_socket_state(const Socket *const reference_id, socket_state state);
|
||||
|
||||
|
||||
/** Update the peer information of the socket */
|
||||
void stats_update_peer(const Socket *const reference_id, const SocketAddress &peer);
|
||||
|
||||
|
||||
/** Update socket protocol */
|
||||
void stats_update_proto(const Socket *const reference_id, nsapi_protocol_t proto);
|
||||
|
||||
|
||||
/** Update bytes sent on socket, which is cumulative count per socket */
|
||||
void stats_update_sent_bytes(const Socket *const reference_id, size_t sent_bytes);
|
||||
|
||||
|
@ -99,7 +106,7 @@ private:
|
|||
static uint32_t _size;
|
||||
|
||||
/** Internal function to scan the array and get position of element in the list.
|
||||
This API locks the mutex and next API updating the entry in array
|
||||
This API locks the mutex and the next API call updating the entry in the array
|
||||
should release the lock */
|
||||
int get_entry_position(const Socket *const reference_id);
|
||||
#endif
|
||||
|
|
|
@ -106,7 +106,7 @@ nsapi_error_t TCPSocket::connect(const SocketAddress &address)
|
|||
|
||||
if (ret == NSAPI_ERROR_OK || ret == NSAPI_ERROR_IN_PROGRESS) {
|
||||
_remote_peer = address;
|
||||
_socket_stats.stats_update_peer(this, _remote_peer);
|
||||
_socket_stats.stats_update_peer(this, _remote_peer);
|
||||
}
|
||||
|
||||
_lock.unlock();
|
||||
|
|
|
@ -141,18 +141,17 @@ nsapi_size_or_error_t UDPSocket::recvfrom(SocketAddress *address, void *buffer,
|
|||
|
||||
_pending = 0;
|
||||
nsapi_size_or_error_t recv = _stack->socket_recvfrom(_socket, address, buffer, size);
|
||||
|
||||
|
||||
// Filter incomming packets using connected peer address
|
||||
if (recv >= 0 && _remote_peer && _remote_peer != *address) {
|
||||
continue;
|
||||
}
|
||||
if (recv > 0) {
|
||||
_socket_stats.stats_update_recv_bytes(this, recv);
|
||||
}
|
||||
|
||||
_socket_stats.stats_update_peer(this, _remote_peer);
|
||||
// Non-blocking sockets always return. Blocking only returns when success or errors other than WOULD_BLOCK
|
||||
if ((0 == _timeout) || (NSAPI_ERROR_WOULD_BLOCK != recv)) {
|
||||
ret = recv;
|
||||
_socket_stats.stats_update_recv_bytes(this, recv);
|
||||
break;
|
||||
} else {
|
||||
uint32_t flag;
|
||||
|
|
Loading…
Reference in New Issue