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
Child:
1:9db0e321a9f4
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* Socket
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2015 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 "SocketAddress.h"
kenjiArai 0:5b88d5760320 18 #include "NetworkInterface.h"
kenjiArai 0:5b88d5760320 19 #include "NetworkStack.h"
kenjiArai 0:5b88d5760320 20 #include <string.h>
kenjiArai 0:5b88d5760320 21 #include <stdio.h>
kenjiArai 0:5b88d5760320 22 #include "ip4string.h"
kenjiArai 0:5b88d5760320 23 #include "ip6string.h"
kenjiArai 0:5b88d5760320 24
kenjiArai 0:5b88d5760320 25
kenjiArai 0:5b88d5760320 26
kenjiArai 0:5b88d5760320 27 SocketAddress::SocketAddress(nsapi_addr_t addr, uint16_t port)
kenjiArai 0:5b88d5760320 28 {
kenjiArai 0:5b88d5760320 29 mem_init();
kenjiArai 0:5b88d5760320 30 _ip_address = NULL;
kenjiArai 0:5b88d5760320 31 set_addr(addr);
kenjiArai 0:5b88d5760320 32 set_port(port);
kenjiArai 0:5b88d5760320 33 }
kenjiArai 0:5b88d5760320 34
kenjiArai 0:5b88d5760320 35 SocketAddress::SocketAddress(const char *addr, uint16_t port)
kenjiArai 0:5b88d5760320 36 {
kenjiArai 0:5b88d5760320 37 mem_init();
kenjiArai 0:5b88d5760320 38 _ip_address = NULL;
kenjiArai 0:5b88d5760320 39 set_ip_address(addr);
kenjiArai 0:5b88d5760320 40 set_port(port);
kenjiArai 0:5b88d5760320 41 }
kenjiArai 0:5b88d5760320 42
kenjiArai 0:5b88d5760320 43 SocketAddress::SocketAddress(const void *bytes, nsapi_version_t version, uint16_t port)
kenjiArai 0:5b88d5760320 44 {
kenjiArai 0:5b88d5760320 45 mem_init();
kenjiArai 0:5b88d5760320 46 _ip_address = NULL;
kenjiArai 0:5b88d5760320 47 set_ip_bytes(bytes, version);
kenjiArai 0:5b88d5760320 48 set_port(port);
kenjiArai 0:5b88d5760320 49 }
kenjiArai 0:5b88d5760320 50
kenjiArai 0:5b88d5760320 51 SocketAddress::SocketAddress(const SocketAddress &addr)
kenjiArai 0:5b88d5760320 52 {
kenjiArai 0:5b88d5760320 53 mem_init();
kenjiArai 0:5b88d5760320 54 _ip_address = NULL;
kenjiArai 0:5b88d5760320 55 set_addr(addr.get_addr());
kenjiArai 0:5b88d5760320 56 set_port(addr.get_port());
kenjiArai 0:5b88d5760320 57 }
kenjiArai 0:5b88d5760320 58
kenjiArai 0:5b88d5760320 59 void SocketAddress::mem_init(void)
kenjiArai 0:5b88d5760320 60 {
kenjiArai 0:5b88d5760320 61 _addr.version = NSAPI_UNSPEC;
kenjiArai 0:5b88d5760320 62 memset(_addr.bytes, 0, NSAPI_IP_BYTES);
kenjiArai 0:5b88d5760320 63 _port = 0;
kenjiArai 0:5b88d5760320 64 }
kenjiArai 0:5b88d5760320 65
kenjiArai 0:5b88d5760320 66 bool SocketAddress::set_ip_address(const char *addr)
kenjiArai 0:5b88d5760320 67 {
kenjiArai 0:5b88d5760320 68 delete[] _ip_address;
kenjiArai 0:5b88d5760320 69 _ip_address = NULL;
kenjiArai 0:5b88d5760320 70
kenjiArai 0:5b88d5760320 71 if (addr && stoip4(addr, strlen(addr), _addr.bytes)) {
kenjiArai 0:5b88d5760320 72 _addr.version = NSAPI_IPv4;
kenjiArai 0:5b88d5760320 73 return true;
kenjiArai 0:5b88d5760320 74 } else if (addr && stoip6(addr, strlen(addr), _addr.bytes)) {
kenjiArai 0:5b88d5760320 75 _addr.version = NSAPI_IPv6;
kenjiArai 0:5b88d5760320 76 return true;
kenjiArai 0:5b88d5760320 77 } else {
kenjiArai 0:5b88d5760320 78 _addr = nsapi_addr_t();
kenjiArai 0:5b88d5760320 79 return false;
kenjiArai 0:5b88d5760320 80 }
kenjiArai 0:5b88d5760320 81 }
kenjiArai 0:5b88d5760320 82
kenjiArai 0:5b88d5760320 83 void SocketAddress::set_ip_bytes(const void *bytes, nsapi_version_t version)
kenjiArai 0:5b88d5760320 84 {
kenjiArai 0:5b88d5760320 85 nsapi_addr_t addr;
kenjiArai 0:5b88d5760320 86
kenjiArai 0:5b88d5760320 87 addr = nsapi_addr_t();
kenjiArai 0:5b88d5760320 88 addr.version = version;
kenjiArai 0:5b88d5760320 89 if (version == NSAPI_IPv6) {
kenjiArai 0:5b88d5760320 90 memcpy(addr.bytes, bytes, NSAPI_IPv6_BYTES);
kenjiArai 0:5b88d5760320 91 } else if (version == NSAPI_IPv4) {
kenjiArai 0:5b88d5760320 92 memcpy(addr.bytes, bytes, NSAPI_IPv4_BYTES);
kenjiArai 0:5b88d5760320 93 }
kenjiArai 0:5b88d5760320 94 set_addr(addr);
kenjiArai 0:5b88d5760320 95 }
kenjiArai 0:5b88d5760320 96
kenjiArai 0:5b88d5760320 97 void SocketAddress::set_addr(nsapi_addr_t addr)
kenjiArai 0:5b88d5760320 98 {
kenjiArai 0:5b88d5760320 99 delete[] _ip_address;
kenjiArai 0:5b88d5760320 100 _ip_address = NULL;
kenjiArai 0:5b88d5760320 101 _addr = addr;
kenjiArai 0:5b88d5760320 102 }
kenjiArai 0:5b88d5760320 103
kenjiArai 0:5b88d5760320 104 void SocketAddress::set_port(uint16_t port)
kenjiArai 0:5b88d5760320 105 {
kenjiArai 0:5b88d5760320 106 _port = port;
kenjiArai 0:5b88d5760320 107 }
kenjiArai 0:5b88d5760320 108
kenjiArai 0:5b88d5760320 109 const char *SocketAddress::get_ip_address() const
kenjiArai 0:5b88d5760320 110 {
kenjiArai 0:5b88d5760320 111 if (_addr.version == NSAPI_UNSPEC) {
kenjiArai 0:5b88d5760320 112 return NULL;
kenjiArai 0:5b88d5760320 113 }
kenjiArai 0:5b88d5760320 114
kenjiArai 0:5b88d5760320 115 if (!_ip_address) {
kenjiArai 0:5b88d5760320 116 _ip_address = new char[NSAPI_IP_SIZE];
kenjiArai 0:5b88d5760320 117 if (_addr.version == NSAPI_IPv4) {
kenjiArai 0:5b88d5760320 118 ip4tos(_addr.bytes, _ip_address);
kenjiArai 0:5b88d5760320 119 } else if (_addr.version == NSAPI_IPv6) {
kenjiArai 0:5b88d5760320 120 ip6tos(_addr.bytes, _ip_address);
kenjiArai 0:5b88d5760320 121 }
kenjiArai 0:5b88d5760320 122 }
kenjiArai 0:5b88d5760320 123
kenjiArai 0:5b88d5760320 124 return _ip_address;
kenjiArai 0:5b88d5760320 125 }
kenjiArai 0:5b88d5760320 126
kenjiArai 0:5b88d5760320 127 const void *SocketAddress::get_ip_bytes() const
kenjiArai 0:5b88d5760320 128 {
kenjiArai 0:5b88d5760320 129 return _addr.bytes;
kenjiArai 0:5b88d5760320 130 }
kenjiArai 0:5b88d5760320 131
kenjiArai 0:5b88d5760320 132 nsapi_version_t SocketAddress::get_ip_version() const
kenjiArai 0:5b88d5760320 133 {
kenjiArai 0:5b88d5760320 134 return _addr.version;
kenjiArai 0:5b88d5760320 135 }
kenjiArai 0:5b88d5760320 136
kenjiArai 0:5b88d5760320 137 nsapi_addr_t SocketAddress::get_addr() const
kenjiArai 0:5b88d5760320 138 {
kenjiArai 0:5b88d5760320 139 return _addr;
kenjiArai 0:5b88d5760320 140 }
kenjiArai 0:5b88d5760320 141
kenjiArai 0:5b88d5760320 142 uint16_t SocketAddress::get_port() const
kenjiArai 0:5b88d5760320 143 {
kenjiArai 0:5b88d5760320 144 return _port;
kenjiArai 0:5b88d5760320 145 }
kenjiArai 0:5b88d5760320 146
kenjiArai 0:5b88d5760320 147 SocketAddress::operator bool() const
kenjiArai 0:5b88d5760320 148 {
kenjiArai 0:5b88d5760320 149 if (_addr.version == NSAPI_IPv4) {
kenjiArai 0:5b88d5760320 150 for (int i = 0; i < NSAPI_IPv4_BYTES; i++) {
kenjiArai 0:5b88d5760320 151 if (_addr.bytes[i]) {
kenjiArai 0:5b88d5760320 152 return true;
kenjiArai 0:5b88d5760320 153 }
kenjiArai 0:5b88d5760320 154 }
kenjiArai 0:5b88d5760320 155
kenjiArai 0:5b88d5760320 156 return false;
kenjiArai 0:5b88d5760320 157 } else if (_addr.version == NSAPI_IPv6) {
kenjiArai 0:5b88d5760320 158 for (int i = 0; i < NSAPI_IPv6_BYTES; i++) {
kenjiArai 0:5b88d5760320 159 if (_addr.bytes[i]) {
kenjiArai 0:5b88d5760320 160 return true;
kenjiArai 0:5b88d5760320 161 }
kenjiArai 0:5b88d5760320 162 }
kenjiArai 0:5b88d5760320 163
kenjiArai 0:5b88d5760320 164 return false;
kenjiArai 0:5b88d5760320 165 } else {
kenjiArai 0:5b88d5760320 166 return false;
kenjiArai 0:5b88d5760320 167 }
kenjiArai 0:5b88d5760320 168 }
kenjiArai 0:5b88d5760320 169
kenjiArai 0:5b88d5760320 170 SocketAddress &SocketAddress::operator=(const SocketAddress &addr)
kenjiArai 0:5b88d5760320 171 {
kenjiArai 0:5b88d5760320 172 delete[] _ip_address;
kenjiArai 0:5b88d5760320 173 _ip_address = NULL;
kenjiArai 0:5b88d5760320 174 set_addr(addr.get_addr());
kenjiArai 0:5b88d5760320 175 set_port(addr.get_port());
kenjiArai 0:5b88d5760320 176 return *this;
kenjiArai 0:5b88d5760320 177 }
kenjiArai 0:5b88d5760320 178
kenjiArai 0:5b88d5760320 179 bool operator==(const SocketAddress &a, const SocketAddress &b)
kenjiArai 0:5b88d5760320 180 {
kenjiArai 0:5b88d5760320 181 if (!a && !b) {
kenjiArai 0:5b88d5760320 182 return true;
kenjiArai 0:5b88d5760320 183 } else if (a._addr.version != b._addr.version) {
kenjiArai 0:5b88d5760320 184 return false;
kenjiArai 0:5b88d5760320 185 } else if (a._addr.version == NSAPI_IPv4) {
kenjiArai 0:5b88d5760320 186 return memcmp(a._addr.bytes, b._addr.bytes, NSAPI_IPv4_BYTES) == 0;
kenjiArai 0:5b88d5760320 187 } else if (a._addr.version == NSAPI_IPv6) {
kenjiArai 0:5b88d5760320 188 return memcmp(a._addr.bytes, b._addr.bytes, NSAPI_IPv6_BYTES) == 0;
kenjiArai 0:5b88d5760320 189 }
kenjiArai 0:5b88d5760320 190
kenjiArai 0:5b88d5760320 191 MBED_UNREACHABLE;
kenjiArai 0:5b88d5760320 192 }
kenjiArai 0:5b88d5760320 193
kenjiArai 0:5b88d5760320 194 bool operator!=(const SocketAddress &a, const SocketAddress &b)
kenjiArai 0:5b88d5760320 195 {
kenjiArai 0:5b88d5760320 196 return !(a == b);
kenjiArai 0:5b88d5760320 197 }
kenjiArai 0:5b88d5760320 198
kenjiArai 0:5b88d5760320 199 void SocketAddress::_SocketAddress(NetworkStack *iface, const char *host, uint16_t port)
kenjiArai 0:5b88d5760320 200 {
kenjiArai 0:5b88d5760320 201 _ip_address = NULL;
kenjiArai 0:5b88d5760320 202
kenjiArai 0:5b88d5760320 203 // gethostbyname must check for literals, so can call it directly
kenjiArai 0:5b88d5760320 204 int err = iface->gethostbyname(host, this);
kenjiArai 0:5b88d5760320 205 _port = port;
kenjiArai 0:5b88d5760320 206 if (err) {
kenjiArai 0:5b88d5760320 207 _addr = nsapi_addr_t();
kenjiArai 0:5b88d5760320 208 _port = 0;
kenjiArai 0:5b88d5760320 209 }
kenjiArai 0:5b88d5760320 210 }
kenjiArai 0:5b88d5760320 211
kenjiArai 0:5b88d5760320 212 SocketAddress::~SocketAddress()
kenjiArai 0:5b88d5760320 213 {
kenjiArai 0:5b88d5760320 214 delete[] _ip_address;
kenjiArai 0:5b88d5760320 215 }