Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* LWIP common helpers
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2017 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 <stdbool.h>
kenjiArai 0:5b88d5760320 18 #include <string.h>
kenjiArai 0:5b88d5760320 19
kenjiArai 0:5b88d5760320 20 #include "lwip/opt.h"
kenjiArai 0:5b88d5760320 21 #include "lwip/netif.h"
kenjiArai 0:5b88d5760320 22 #include "lwip/ip.h"
kenjiArai 0:5b88d5760320 23 #include "lwip/api.h"
kenjiArai 0:5b88d5760320 24
kenjiArai 0:5b88d5760320 25 #include "LWIPStack.h"
kenjiArai 0:5b88d5760320 26
kenjiArai 0:5b88d5760320 27 #include "netsocket/nsapi_types.h"
kenjiArai 0:5b88d5760320 28
kenjiArai 0:5b88d5760320 29 /* LWIP error remapping */
kenjiArai 0:5b88d5760320 30 nsapi_error_t LWIP::err_remap(err_t err)
kenjiArai 0:5b88d5760320 31 {
kenjiArai 0:5b88d5760320 32 switch (err) {
kenjiArai 0:5b88d5760320 33 case ERR_OK:
kenjiArai 0:5b88d5760320 34 case ERR_CLSD:
kenjiArai 0:5b88d5760320 35 return 0;
kenjiArai 0:5b88d5760320 36 case ERR_MEM:
kenjiArai 0:5b88d5760320 37 case ERR_BUF:
kenjiArai 0:5b88d5760320 38 return NSAPI_ERROR_NO_MEMORY;
kenjiArai 0:5b88d5760320 39 case ERR_CONN:
kenjiArai 0:5b88d5760320 40 case ERR_RST:
kenjiArai 0:5b88d5760320 41 case ERR_ABRT:
kenjiArai 0:5b88d5760320 42 return NSAPI_ERROR_NO_CONNECTION;
kenjiArai 0:5b88d5760320 43 case ERR_TIMEOUT:
kenjiArai 0:5b88d5760320 44 case ERR_RTE:
kenjiArai 0:5b88d5760320 45 case ERR_WOULDBLOCK:
kenjiArai 0:5b88d5760320 46 return NSAPI_ERROR_WOULD_BLOCK;
kenjiArai 0:5b88d5760320 47 case ERR_VAL:
kenjiArai 0:5b88d5760320 48 case ERR_USE:
kenjiArai 0:5b88d5760320 49 case ERR_ARG:
kenjiArai 0:5b88d5760320 50 return NSAPI_ERROR_PARAMETER;
kenjiArai 0:5b88d5760320 51 case ERR_INPROGRESS:
kenjiArai 0:5b88d5760320 52 return NSAPI_ERROR_IN_PROGRESS;
kenjiArai 0:5b88d5760320 53 case ERR_ALREADY:
kenjiArai 0:5b88d5760320 54 return NSAPI_ERROR_ALREADY;
kenjiArai 0:5b88d5760320 55 case ERR_ISCONN:
kenjiArai 0:5b88d5760320 56 return NSAPI_ERROR_IS_CONNECTED;
kenjiArai 0:5b88d5760320 57 default:
kenjiArai 0:5b88d5760320 58 return NSAPI_ERROR_DEVICE_ERROR;
kenjiArai 0:5b88d5760320 59 }
kenjiArai 0:5b88d5760320 60 }
kenjiArai 0:5b88d5760320 61
kenjiArai 0:5b88d5760320 62
kenjiArai 0:5b88d5760320 63 const ip_addr_t *LWIP::get_ipv4_addr(const struct netif *netif)
kenjiArai 0:5b88d5760320 64 {
kenjiArai 0:5b88d5760320 65 #if LWIP_IPV4
kenjiArai 0:5b88d5760320 66 if (!netif_is_up(netif)) {
kenjiArai 0:5b88d5760320 67 return NULL;
kenjiArai 0:5b88d5760320 68 }
kenjiArai 0:5b88d5760320 69
kenjiArai 0:5b88d5760320 70 if (!ip4_addr_isany(netif_ip4_addr(netif))) {
kenjiArai 0:5b88d5760320 71 return netif_ip_addr4(netif);
kenjiArai 0:5b88d5760320 72 }
kenjiArai 0:5b88d5760320 73 #endif
kenjiArai 0:5b88d5760320 74 return NULL;
kenjiArai 0:5b88d5760320 75 }
kenjiArai 0:5b88d5760320 76
kenjiArai 0:5b88d5760320 77 const ip_addr_t *LWIP::get_ipv6_addr(const struct netif *netif)
kenjiArai 0:5b88d5760320 78 {
kenjiArai 0:5b88d5760320 79 #if LWIP_IPV6
kenjiArai 0:5b88d5760320 80 if (!netif_is_up(netif)) {
kenjiArai 0:5b88d5760320 81 return NULL;
kenjiArai 0:5b88d5760320 82 }
kenjiArai 0:5b88d5760320 83
kenjiArai 0:5b88d5760320 84 for (int i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
kenjiArai 0:5b88d5760320 85 if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
kenjiArai 0:5b88d5760320 86 !ip6_addr_islinklocal(netif_ip6_addr(netif, i))) {
kenjiArai 0:5b88d5760320 87 return netif_ip_addr6(netif, i);
kenjiArai 0:5b88d5760320 88 }
kenjiArai 0:5b88d5760320 89 }
kenjiArai 0:5b88d5760320 90 #endif
kenjiArai 0:5b88d5760320 91 return NULL;
kenjiArai 0:5b88d5760320 92 }
kenjiArai 0:5b88d5760320 93
kenjiArai 0:5b88d5760320 94 bool LWIP::is_local_addr(const ip_addr_t *ip_addr)
kenjiArai 0:5b88d5760320 95 {
kenjiArai 0:5b88d5760320 96 struct netif *netif;
kenjiArai 0:5b88d5760320 97
kenjiArai 0:5b88d5760320 98 for (netif = netif_list; netif != NULL; netif = netif->next) {
kenjiArai 0:5b88d5760320 99 if (!netif_is_up(netif)) {
kenjiArai 0:5b88d5760320 100 continue;
kenjiArai 0:5b88d5760320 101 }
kenjiArai 0:5b88d5760320 102 #if LWIP_IPV6
kenjiArai 0:5b88d5760320 103 if (IP_IS_V6(ip_addr)) {
kenjiArai 0:5b88d5760320 104 for (int i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
kenjiArai 0:5b88d5760320 105 if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
kenjiArai 0:5b88d5760320 106 ip6_addr_cmp(netif_ip6_addr(netif, i), ip_2_ip6(ip_addr))) {
kenjiArai 0:5b88d5760320 107 return true;
kenjiArai 0:5b88d5760320 108 }
kenjiArai 0:5b88d5760320 109 }
kenjiArai 0:5b88d5760320 110 }
kenjiArai 0:5b88d5760320 111 #endif
kenjiArai 0:5b88d5760320 112
kenjiArai 0:5b88d5760320 113 #if LWIP_IPV4
kenjiArai 0:5b88d5760320 114 if (IP_IS_V4(ip_addr)) {
kenjiArai 0:5b88d5760320 115 if (!ip4_addr_isany(netif_ip4_addr(netif)) &&
kenjiArai 0:5b88d5760320 116 ip4_addr_cmp(netif_ip4_addr(netif), ip_2_ip4(ip_addr))) {
kenjiArai 0:5b88d5760320 117 return true;
kenjiArai 0:5b88d5760320 118 }
kenjiArai 0:5b88d5760320 119 }
kenjiArai 0:5b88d5760320 120 #endif
kenjiArai 0:5b88d5760320 121 }
kenjiArai 0:5b88d5760320 122 return false;
kenjiArai 0:5b88d5760320 123 }
kenjiArai 0:5b88d5760320 124
kenjiArai 0:5b88d5760320 125 const ip_addr_t *LWIP::get_ip_addr(bool any_addr, const struct netif *netif)
kenjiArai 0:5b88d5760320 126 {
kenjiArai 0:5b88d5760320 127 const ip_addr_t *pref_ip_addr = 0;
kenjiArai 0:5b88d5760320 128 const ip_addr_t *npref_ip_addr = 0;
kenjiArai 0:5b88d5760320 129
kenjiArai 0:5b88d5760320 130 #if LWIP_IPV4 && LWIP_IPV6
kenjiArai 0:5b88d5760320 131 #if IP_VERSION_PREF == PREF_IPV4
kenjiArai 0:5b88d5760320 132 pref_ip_addr = get_ipv4_addr(netif);
kenjiArai 0:5b88d5760320 133 npref_ip_addr = get_ipv6_addr(netif);
kenjiArai 0:5b88d5760320 134 #else
kenjiArai 0:5b88d5760320 135 pref_ip_addr = get_ipv6_addr(netif);
kenjiArai 0:5b88d5760320 136 npref_ip_addr = get_ipv4_addr(netif);
kenjiArai 0:5b88d5760320 137 #endif
kenjiArai 0:5b88d5760320 138 #elif LWIP_IPV6
kenjiArai 0:5b88d5760320 139 pref_ip_addr = get_ipv6_addr(netif);
kenjiArai 0:5b88d5760320 140 #elif LWIP_IPV4
kenjiArai 0:5b88d5760320 141 pref_ip_addr = get_ipv4_addr(netif);
kenjiArai 0:5b88d5760320 142 #endif
kenjiArai 0:5b88d5760320 143
kenjiArai 0:5b88d5760320 144 if (pref_ip_addr) {
kenjiArai 0:5b88d5760320 145 return pref_ip_addr;
kenjiArai 0:5b88d5760320 146 } else if (npref_ip_addr && any_addr) {
kenjiArai 0:5b88d5760320 147 return npref_ip_addr;
kenjiArai 0:5b88d5760320 148 }
kenjiArai 0:5b88d5760320 149
kenjiArai 0:5b88d5760320 150 return NULL;
kenjiArai 0:5b88d5760320 151 }
kenjiArai 0:5b88d5760320 152
kenjiArai 0:5b88d5760320 153 void LWIP::arena_init(void)
kenjiArai 0:5b88d5760320 154 {
kenjiArai 0:5b88d5760320 155 memset(arena, 0, sizeof(arena));
kenjiArai 0:5b88d5760320 156 }
kenjiArai 0:5b88d5760320 157
kenjiArai 0:5b88d5760320 158 struct LWIP::mbed_lwip_socket *LWIP::arena_alloc()
kenjiArai 0:5b88d5760320 159 {
kenjiArai 0:5b88d5760320 160 LWIP &lwip = LWIP::get_instance();
kenjiArai 0:5b88d5760320 161
kenjiArai 0:5b88d5760320 162 lwip.adaptation.lock();
kenjiArai 0:5b88d5760320 163
kenjiArai 0:5b88d5760320 164 for (int i = 0; i < MEMP_NUM_NETCONN; i++) {
kenjiArai 0:5b88d5760320 165 if (!arena[i].in_use) {
kenjiArai 0:5b88d5760320 166 struct mbed_lwip_socket *s = &arena[i];
kenjiArai 0:5b88d5760320 167 memset(s, 0, sizeof(*s));
kenjiArai 0:5b88d5760320 168 s->in_use = true;
kenjiArai 0:5b88d5760320 169 lwip.adaptation.unlock();
kenjiArai 0:5b88d5760320 170 return s;
kenjiArai 0:5b88d5760320 171 }
kenjiArai 0:5b88d5760320 172 }
kenjiArai 0:5b88d5760320 173
kenjiArai 0:5b88d5760320 174 lwip.adaptation.unlock();
kenjiArai 0:5b88d5760320 175
kenjiArai 0:5b88d5760320 176 return 0;
kenjiArai 0:5b88d5760320 177 }
kenjiArai 0:5b88d5760320 178
kenjiArai 0:5b88d5760320 179 void LWIP::arena_dealloc(struct mbed_lwip_socket *s)
kenjiArai 0:5b88d5760320 180 {
kenjiArai 0:5b88d5760320 181 s->in_use = false;
kenjiArai 0:5b88d5760320 182
kenjiArai 0:5b88d5760320 183 while (s->multicast_memberships_count > 0) {
kenjiArai 0:5b88d5760320 184 uint32_t index = 0;
kenjiArai 0:5b88d5760320 185 index = next_registered_multicast_member(s, index);
kenjiArai 0:5b88d5760320 186
kenjiArai 0:5b88d5760320 187 setsockopt(s, NSAPI_SOCKET, NSAPI_DROP_MEMBERSHIP, &s->multicast_memberships[index],
kenjiArai 0:5b88d5760320 188 sizeof(s->multicast_memberships[index]));
kenjiArai 0:5b88d5760320 189 index++;
kenjiArai 0:5b88d5760320 190 }
kenjiArai 0:5b88d5760320 191
kenjiArai 0:5b88d5760320 192 free(s->multicast_memberships);
kenjiArai 0:5b88d5760320 193 s->multicast_memberships = NULL;
kenjiArai 0:5b88d5760320 194 }