mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* mbed Microcontroller Library
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2018 ARM Limited
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 5 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 6 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 7 *
kenjiArai 0:5b88d5760320 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 9 *
kenjiArai 0:5b88d5760320 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 13 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 14 * limitations under the License.
kenjiArai 0:5b88d5760320 15 */
kenjiArai 0:5b88d5760320 16
kenjiArai 0:5b88d5760320 17 #include "SocketStats.h"
kenjiArai 0:5b88d5760320 18 #include "platform/mbed_error.h"
kenjiArai 0:5b88d5760320 19 #include "platform/mbed_assert.h"
kenjiArai 0:5b88d5760320 20 #ifdef MBED_CONF_RTOS_PRESENT
kenjiArai 0:5b88d5760320 21 #include "rtos/Kernel.h"
kenjiArai 0:5b88d5760320 22 #endif
kenjiArai 0:5b88d5760320 23
kenjiArai 0:5b88d5760320 24 #include <string.h>
kenjiArai 0:5b88d5760320 25 #include <stdlib.h>
kenjiArai 0:5b88d5760320 26
kenjiArai 0:5b88d5760320 27 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 28 SingletonPtr<PlatformMutex> SocketStats::_mutex;
kenjiArai 0:5b88d5760320 29 mbed_stats_socket_t SocketStats::_stats[MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT];
kenjiArai 0:5b88d5760320 30 uint32_t SocketStats::_size = 0;
kenjiArai 0:5b88d5760320 31
kenjiArai 0:5b88d5760320 32 int SocketStats::get_entry_position(const Socket *const reference_id)
kenjiArai 0:5b88d5760320 33 {
kenjiArai 0:5b88d5760320 34 for (uint32_t j = 0; j < _size; j++) {
kenjiArai 0:5b88d5760320 35 if (_stats[j].reference_id == reference_id) {
kenjiArai 0:5b88d5760320 36 return j;
kenjiArai 0:5b88d5760320 37 }
kenjiArai 0:5b88d5760320 38 }
kenjiArai 0:5b88d5760320 39 return -1;
kenjiArai 0:5b88d5760320 40 }
kenjiArai 0:5b88d5760320 41 #endif
kenjiArai 0:5b88d5760320 42
kenjiArai 0:5b88d5760320 43 size_t SocketStats::mbed_stats_socket_get_each(mbed_stats_socket_t *stats, size_t count)
kenjiArai 0:5b88d5760320 44 {
kenjiArai 0:5b88d5760320 45 MBED_ASSERT(stats != NULL);
kenjiArai 0:5b88d5760320 46 size_t i = 0;
kenjiArai 0:5b88d5760320 47 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 48 memset(stats, 0, count * sizeof(mbed_stats_socket_t));
kenjiArai 0:5b88d5760320 49 _mutex->lock();
kenjiArai 0:5b88d5760320 50 for (uint32_t j = 0; j < count; j++) {
kenjiArai 0:5b88d5760320 51 if (_stats[j].reference_id) {
kenjiArai 0:5b88d5760320 52 memcpy(&stats[i], &_stats[j], sizeof(mbed_stats_socket_t));
kenjiArai 0:5b88d5760320 53 i++;
kenjiArai 0:5b88d5760320 54 }
kenjiArai 0:5b88d5760320 55 }
kenjiArai 0:5b88d5760320 56 _mutex->unlock();
kenjiArai 0:5b88d5760320 57 #endif
kenjiArai 0:5b88d5760320 58 return i;
kenjiArai 0:5b88d5760320 59 }
kenjiArai 0:5b88d5760320 60
kenjiArai 0:5b88d5760320 61 SocketStats::SocketStats()
kenjiArai 0:5b88d5760320 62 {
kenjiArai 0:5b88d5760320 63 }
kenjiArai 0:5b88d5760320 64
kenjiArai 0:5b88d5760320 65 void SocketStats::stats_new_socket_entry(const Socket *const reference_id)
kenjiArai 0:5b88d5760320 66 {
kenjiArai 0:5b88d5760320 67 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 68 _mutex->lock();
kenjiArai 0:5b88d5760320 69 if (get_entry_position(reference_id) >= 0) {
kenjiArai 0:5b88d5760320 70 // Duplicate entry
kenjiArai 0:5b88d5760320 71 MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STATS, MBED_ERROR_CODE_INVALID_INDEX), "Duplicate socket Reference ID ", reference_id);
kenjiArai 0:5b88d5760320 72 } else if (_size < MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT) {
kenjiArai 0:5b88d5760320 73 // Add new entry
kenjiArai 0:5b88d5760320 74 _stats[_size].reference_id = (Socket *)reference_id;
kenjiArai 0:5b88d5760320 75 _size++;
kenjiArai 0:5b88d5760320 76 } else {
kenjiArai 0:5b88d5760320 77 int position = -1;
kenjiArai 0:5b88d5760320 78 uint64_t oldest_time = 0;
kenjiArai 0:5b88d5760320 79 // Determine which entry in the list shall be over-written
kenjiArai 0:5b88d5760320 80 for (uint32_t j = 0; j < MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT; j++) {
kenjiArai 0:5b88d5760320 81 if (SOCK_CLOSED == _stats[j].state) {
kenjiArai 0:5b88d5760320 82 if ((0 == oldest_time) || (oldest_time < _stats[j].last_change_tick)) {
kenjiArai 0:5b88d5760320 83 oldest_time = _stats[j].last_change_tick;
kenjiArai 0:5b88d5760320 84 position = j;
kenjiArai 0:5b88d5760320 85 }
kenjiArai 0:5b88d5760320 86 }
kenjiArai 0:5b88d5760320 87 }
kenjiArai 0:5b88d5760320 88 if (-1 == position) {
kenjiArai 0:5b88d5760320 89 MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STATS, MBED_ERROR_CODE_OUT_OF_RESOURCES), "List full with all open sockets");
kenjiArai 0:5b88d5760320 90 }
kenjiArai 0:5b88d5760320 91 memset(&_stats[position], 0, sizeof(mbed_stats_socket_t));
kenjiArai 0:5b88d5760320 92 _stats[position].reference_id = (Socket *)reference_id;
kenjiArai 0:5b88d5760320 93 }
kenjiArai 0:5b88d5760320 94 _mutex->unlock();
kenjiArai 0:5b88d5760320 95 #endif
kenjiArai 0:5b88d5760320 96 return;
kenjiArai 0:5b88d5760320 97 }
kenjiArai 0:5b88d5760320 98
kenjiArai 0:5b88d5760320 99 void SocketStats::stats_update_socket_state(const Socket *const reference_id, socket_state state)
kenjiArai 0:5b88d5760320 100 {
kenjiArai 0:5b88d5760320 101 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 102 _mutex->lock();
kenjiArai 0:5b88d5760320 103 int position = get_entry_position(reference_id);
kenjiArai 0:5b88d5760320 104 if (position >= 0) {
kenjiArai 0:5b88d5760320 105 _stats[position].state = state;
kenjiArai 0:5b88d5760320 106 #ifdef MBED_CONF_RTOS_PRESENT
kenjiArai 0:5b88d5760320 107 _stats[position].last_change_tick = rtos::Kernel::get_ms_count();
kenjiArai 0:5b88d5760320 108 #endif
kenjiArai 0:5b88d5760320 109 }
kenjiArai 0:5b88d5760320 110 _mutex->unlock();
kenjiArai 0:5b88d5760320 111 #endif
kenjiArai 0:5b88d5760320 112 }
kenjiArai 0:5b88d5760320 113
kenjiArai 0:5b88d5760320 114 void SocketStats::stats_update_peer(const Socket *const reference_id, const SocketAddress &peer)
kenjiArai 0:5b88d5760320 115 {
kenjiArai 0:5b88d5760320 116 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 117 _mutex->lock();
kenjiArai 0:5b88d5760320 118 int position = get_entry_position(reference_id);
kenjiArai 0:5b88d5760320 119 if ((position >= 0) && (!_stats[position].peer)) {
kenjiArai 0:5b88d5760320 120 _stats[position].peer = peer;
kenjiArai 0:5b88d5760320 121 }
kenjiArai 0:5b88d5760320 122 _mutex->unlock();
kenjiArai 0:5b88d5760320 123 #endif
kenjiArai 0:5b88d5760320 124 }
kenjiArai 0:5b88d5760320 125
kenjiArai 0:5b88d5760320 126 void SocketStats::stats_update_proto(const Socket *const reference_id, nsapi_protocol_t proto)
kenjiArai 0:5b88d5760320 127 {
kenjiArai 0:5b88d5760320 128 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 129 _mutex->lock();
kenjiArai 0:5b88d5760320 130 int position = get_entry_position(reference_id);
kenjiArai 0:5b88d5760320 131 if (position >= 0) {
kenjiArai 0:5b88d5760320 132 _stats[position].proto = proto;
kenjiArai 0:5b88d5760320 133 }
kenjiArai 0:5b88d5760320 134 _mutex->unlock();
kenjiArai 0:5b88d5760320 135 #endif
kenjiArai 0:5b88d5760320 136 }
kenjiArai 0:5b88d5760320 137
kenjiArai 0:5b88d5760320 138 void SocketStats::stats_update_sent_bytes(const Socket *const reference_id, size_t sent_bytes)
kenjiArai 0:5b88d5760320 139 {
kenjiArai 0:5b88d5760320 140 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 141 _mutex->lock();
kenjiArai 0:5b88d5760320 142 int position = get_entry_position(reference_id);
kenjiArai 0:5b88d5760320 143 if ((position >= 0) && ((int32_t)sent_bytes > 0)) {
kenjiArai 0:5b88d5760320 144 _stats[position].sent_bytes += sent_bytes;
kenjiArai 0:5b88d5760320 145 }
kenjiArai 0:5b88d5760320 146 _mutex->unlock();
kenjiArai 0:5b88d5760320 147 #endif
kenjiArai 0:5b88d5760320 148 }
kenjiArai 0:5b88d5760320 149
kenjiArai 0:5b88d5760320 150 void SocketStats::stats_update_recv_bytes(const Socket *const reference_id, size_t recv_bytes)
kenjiArai 0:5b88d5760320 151 {
kenjiArai 0:5b88d5760320 152 #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLED
kenjiArai 0:5b88d5760320 153 _mutex->lock();
kenjiArai 0:5b88d5760320 154 int position = get_entry_position(reference_id);
kenjiArai 0:5b88d5760320 155 if ((position >= 0) && ((int32_t)recv_bytes > 0)) {
kenjiArai 0:5b88d5760320 156 _stats[position].recv_bytes += recv_bytes;
kenjiArai 0:5b88d5760320 157 }
kenjiArai 0:5b88d5760320 158 _mutex->unlock();
kenjiArai 0:5b88d5760320 159 #endif
kenjiArai 0:5b88d5760320 160 }