Denislam Valeev / Mbed OS Nucleo_rtos_basic
Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
valeyev 0:e056ac8fecf8 1 /* Socket
valeyev 0:e056ac8fecf8 2 * Copyright (c) 2015 ARM Limited
valeyev 0:e056ac8fecf8 3 *
valeyev 0:e056ac8fecf8 4 * Licensed under the Apache License, Version 2.0 (the "License");
valeyev 0:e056ac8fecf8 5 * you may not use this file except in compliance with the License.
valeyev 0:e056ac8fecf8 6 * You may obtain a copy of the License at
valeyev 0:e056ac8fecf8 7 *
valeyev 0:e056ac8fecf8 8 * http://www.apache.org/licenses/LICENSE-2.0
valeyev 0:e056ac8fecf8 9 *
valeyev 0:e056ac8fecf8 10 * Unless required by applicable law or agreed to in writing, software
valeyev 0:e056ac8fecf8 11 * distributed under the License is distributed on an "AS IS" BASIS,
valeyev 0:e056ac8fecf8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
valeyev 0:e056ac8fecf8 13 * See the License for the specific language governing permissions and
valeyev 0:e056ac8fecf8 14 * limitations under the License.
valeyev 0:e056ac8fecf8 15 */
valeyev 0:e056ac8fecf8 16
valeyev 0:e056ac8fecf8 17 #include "NetworkStack.h"
valeyev 0:e056ac8fecf8 18 #include "nsapi_dns.h"
valeyev 0:e056ac8fecf8 19 #include "mbed.h"
valeyev 0:e056ac8fecf8 20 #include "stddef.h"
valeyev 0:e056ac8fecf8 21 #include <new>
valeyev 0:e056ac8fecf8 22
valeyev 0:e056ac8fecf8 23
valeyev 0:e056ac8fecf8 24 // Default NetworkStack operations
valeyev 0:e056ac8fecf8 25 nsapi_error_t NetworkStack::gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version)
valeyev 0:e056ac8fecf8 26 {
valeyev 0:e056ac8fecf8 27 // check for simple ip addresses
valeyev 0:e056ac8fecf8 28 if (address->set_ip_address(name)) {
valeyev 0:e056ac8fecf8 29 if (version != NSAPI_UNSPEC && address->get_ip_version() != version) {
valeyev 0:e056ac8fecf8 30 return NSAPI_ERROR_DNS_FAILURE;
valeyev 0:e056ac8fecf8 31 }
valeyev 0:e056ac8fecf8 32
valeyev 0:e056ac8fecf8 33 return NSAPI_ERROR_OK;
valeyev 0:e056ac8fecf8 34 }
valeyev 0:e056ac8fecf8 35
valeyev 0:e056ac8fecf8 36 // if the version is unspecified, try to guess the version from the
valeyev 0:e056ac8fecf8 37 // ip address of the underlying stack
valeyev 0:e056ac8fecf8 38 if (version == NSAPI_UNSPEC) {
valeyev 0:e056ac8fecf8 39 SocketAddress testaddress;
valeyev 0:e056ac8fecf8 40 if (testaddress.set_ip_address(this->get_ip_address())) {
valeyev 0:e056ac8fecf8 41 version = testaddress.get_ip_version();
valeyev 0:e056ac8fecf8 42 }
valeyev 0:e056ac8fecf8 43 }
valeyev 0:e056ac8fecf8 44
valeyev 0:e056ac8fecf8 45 return nsapi_dns_query(this, name, address, version);
valeyev 0:e056ac8fecf8 46 }
valeyev 0:e056ac8fecf8 47
valeyev 0:e056ac8fecf8 48 nsapi_error_t NetworkStack::add_dns_server(const SocketAddress &address)
valeyev 0:e056ac8fecf8 49 {
valeyev 0:e056ac8fecf8 50 return nsapi_dns_add_server(address);
valeyev 0:e056ac8fecf8 51 }
valeyev 0:e056ac8fecf8 52
valeyev 0:e056ac8fecf8 53 nsapi_error_t NetworkStack::setstackopt(int level, int optname, const void *optval, unsigned optlen)
valeyev 0:e056ac8fecf8 54 {
valeyev 0:e056ac8fecf8 55 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 56 }
valeyev 0:e056ac8fecf8 57
valeyev 0:e056ac8fecf8 58 nsapi_error_t NetworkStack::getstackopt(int level, int optname, void *optval, unsigned *optlen)
valeyev 0:e056ac8fecf8 59 {
valeyev 0:e056ac8fecf8 60 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 61 }
valeyev 0:e056ac8fecf8 62
valeyev 0:e056ac8fecf8 63 nsapi_error_t NetworkStack::setsockopt(void *handle, int level, int optname, const void *optval, unsigned optlen)
valeyev 0:e056ac8fecf8 64 {
valeyev 0:e056ac8fecf8 65 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 66 }
valeyev 0:e056ac8fecf8 67
valeyev 0:e056ac8fecf8 68 nsapi_error_t NetworkStack::getsockopt(void *handle, int level, int optname, void *optval, unsigned *optlen)
valeyev 0:e056ac8fecf8 69 {
valeyev 0:e056ac8fecf8 70 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 71 }
valeyev 0:e056ac8fecf8 72
valeyev 0:e056ac8fecf8 73
valeyev 0:e056ac8fecf8 74 // NetworkStackWrapper class for encapsulating the raw nsapi_stack structure
valeyev 0:e056ac8fecf8 75 class NetworkStackWrapper : public NetworkStack
valeyev 0:e056ac8fecf8 76 {
valeyev 0:e056ac8fecf8 77 private:
valeyev 0:e056ac8fecf8 78 inline nsapi_stack_t *_stack()
valeyev 0:e056ac8fecf8 79 {
valeyev 0:e056ac8fecf8 80 return reinterpret_cast<nsapi_stack_t *>(
valeyev 0:e056ac8fecf8 81 reinterpret_cast<uint8_t *>(this)
valeyev 0:e056ac8fecf8 82 - offsetof(nsapi_stack_t, _stack_buffer));
valeyev 0:e056ac8fecf8 83 }
valeyev 0:e056ac8fecf8 84
valeyev 0:e056ac8fecf8 85 inline const nsapi_stack_api_t *_stack_api()
valeyev 0:e056ac8fecf8 86 {
valeyev 0:e056ac8fecf8 87 return _stack()->stack_api;
valeyev 0:e056ac8fecf8 88 }
valeyev 0:e056ac8fecf8 89
valeyev 0:e056ac8fecf8 90 public:
valeyev 0:e056ac8fecf8 91 virtual const char *get_ip_address()
valeyev 0:e056ac8fecf8 92 {
valeyev 0:e056ac8fecf8 93 if (!_stack_api()->get_ip_address) {
valeyev 0:e056ac8fecf8 94 return 0;
valeyev 0:e056ac8fecf8 95 }
valeyev 0:e056ac8fecf8 96
valeyev 0:e056ac8fecf8 97 static uint8_t buffer[sizeof(SocketAddress)];
valeyev 0:e056ac8fecf8 98 SocketAddress *address = new (buffer) SocketAddress(_stack_api()->get_ip_address(_stack()));
valeyev 0:e056ac8fecf8 99 return address->get_ip_address();
valeyev 0:e056ac8fecf8 100 }
valeyev 0:e056ac8fecf8 101
valeyev 0:e056ac8fecf8 102 virtual nsapi_error_t gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version)
valeyev 0:e056ac8fecf8 103 {
valeyev 0:e056ac8fecf8 104 if (!_stack_api()->gethostbyname) {
valeyev 0:e056ac8fecf8 105 return NetworkStack::gethostbyname(name, address, version);
valeyev 0:e056ac8fecf8 106 }
valeyev 0:e056ac8fecf8 107
valeyev 0:e056ac8fecf8 108 nsapi_addr_t addr = {NSAPI_UNSPEC, 0};
valeyev 0:e056ac8fecf8 109 nsapi_error_t err = _stack_api()->gethostbyname(_stack(), name, &addr, version);
valeyev 0:e056ac8fecf8 110 address->set_addr(addr);
valeyev 0:e056ac8fecf8 111 return err;
valeyev 0:e056ac8fecf8 112 }
valeyev 0:e056ac8fecf8 113
valeyev 0:e056ac8fecf8 114 virtual nsapi_error_t add_dns_server(const SocketAddress &address)
valeyev 0:e056ac8fecf8 115 {
valeyev 0:e056ac8fecf8 116 if (!_stack_api()->add_dns_server) {
valeyev 0:e056ac8fecf8 117 return NetworkStack::add_dns_server(address);
valeyev 0:e056ac8fecf8 118 }
valeyev 0:e056ac8fecf8 119
valeyev 0:e056ac8fecf8 120 return _stack_api()->add_dns_server(_stack(), address.get_addr());
valeyev 0:e056ac8fecf8 121 }
valeyev 0:e056ac8fecf8 122
valeyev 0:e056ac8fecf8 123 virtual nsapi_error_t setstackopt(int level, int optname, const void *optval, unsigned optlen)
valeyev 0:e056ac8fecf8 124 {
valeyev 0:e056ac8fecf8 125 if (!_stack_api()->setstackopt) {
valeyev 0:e056ac8fecf8 126 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 127 }
valeyev 0:e056ac8fecf8 128
valeyev 0:e056ac8fecf8 129 return _stack_api()->setstackopt(_stack(), level, optname, optval, optlen);
valeyev 0:e056ac8fecf8 130 }
valeyev 0:e056ac8fecf8 131
valeyev 0:e056ac8fecf8 132 virtual nsapi_error_t getstackopt(int level, int optname, void *optval, unsigned *optlen)
valeyev 0:e056ac8fecf8 133 {
valeyev 0:e056ac8fecf8 134 if (!_stack_api()->getstackopt) {
valeyev 0:e056ac8fecf8 135 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 136 }
valeyev 0:e056ac8fecf8 137
valeyev 0:e056ac8fecf8 138 return _stack_api()->getstackopt(_stack(), level, optname, optval, optlen);
valeyev 0:e056ac8fecf8 139 }
valeyev 0:e056ac8fecf8 140
valeyev 0:e056ac8fecf8 141 protected:
valeyev 0:e056ac8fecf8 142 virtual nsapi_error_t socket_open(nsapi_socket_t *socket, nsapi_protocol_t proto)
valeyev 0:e056ac8fecf8 143 {
valeyev 0:e056ac8fecf8 144 if (!_stack_api()->socket_open) {
valeyev 0:e056ac8fecf8 145 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 146 }
valeyev 0:e056ac8fecf8 147
valeyev 0:e056ac8fecf8 148 return _stack_api()->socket_open(_stack(), socket, proto);
valeyev 0:e056ac8fecf8 149 }
valeyev 0:e056ac8fecf8 150
valeyev 0:e056ac8fecf8 151 virtual nsapi_error_t socket_close(nsapi_socket_t socket)
valeyev 0:e056ac8fecf8 152 {
valeyev 0:e056ac8fecf8 153 if (!_stack_api()->socket_close) {
valeyev 0:e056ac8fecf8 154 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 155 }
valeyev 0:e056ac8fecf8 156
valeyev 0:e056ac8fecf8 157 return _stack_api()->socket_close(_stack(), socket);
valeyev 0:e056ac8fecf8 158 }
valeyev 0:e056ac8fecf8 159
valeyev 0:e056ac8fecf8 160 virtual nsapi_error_t socket_bind(nsapi_socket_t socket, const SocketAddress &address)
valeyev 0:e056ac8fecf8 161 {
valeyev 0:e056ac8fecf8 162 if (!_stack_api()->socket_bind) {
valeyev 0:e056ac8fecf8 163 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 164 }
valeyev 0:e056ac8fecf8 165
valeyev 0:e056ac8fecf8 166 return _stack_api()->socket_bind(_stack(), socket, address.get_addr(), address.get_port());
valeyev 0:e056ac8fecf8 167 }
valeyev 0:e056ac8fecf8 168
valeyev 0:e056ac8fecf8 169 virtual nsapi_error_t socket_listen(nsapi_socket_t socket, int backlog)
valeyev 0:e056ac8fecf8 170 {
valeyev 0:e056ac8fecf8 171 if (!_stack_api()->socket_listen) {
valeyev 0:e056ac8fecf8 172 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 173 }
valeyev 0:e056ac8fecf8 174
valeyev 0:e056ac8fecf8 175 return _stack_api()->socket_listen(_stack(), socket, backlog);
valeyev 0:e056ac8fecf8 176 }
valeyev 0:e056ac8fecf8 177
valeyev 0:e056ac8fecf8 178 virtual nsapi_error_t socket_connect(nsapi_socket_t socket, const SocketAddress &address)
valeyev 0:e056ac8fecf8 179 {
valeyev 0:e056ac8fecf8 180 if (!_stack_api()->socket_connect) {
valeyev 0:e056ac8fecf8 181 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 182 }
valeyev 0:e056ac8fecf8 183
valeyev 0:e056ac8fecf8 184 return _stack_api()->socket_connect(_stack(), socket, address.get_addr(), address.get_port());
valeyev 0:e056ac8fecf8 185 }
valeyev 0:e056ac8fecf8 186
valeyev 0:e056ac8fecf8 187 virtual nsapi_error_t socket_accept(nsapi_socket_t server, nsapi_socket_t *socket, SocketAddress *address)
valeyev 0:e056ac8fecf8 188 {
valeyev 0:e056ac8fecf8 189 if (!_stack_api()->socket_accept) {
valeyev 0:e056ac8fecf8 190 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 191 }
valeyev 0:e056ac8fecf8 192
valeyev 0:e056ac8fecf8 193 nsapi_addr_t addr = {NSAPI_IPv4, 0};
valeyev 0:e056ac8fecf8 194 uint16_t port = 0;
valeyev 0:e056ac8fecf8 195
valeyev 0:e056ac8fecf8 196 nsapi_error_t err = _stack_api()->socket_accept(_stack(), server, socket, &addr, &port);
valeyev 0:e056ac8fecf8 197
valeyev 0:e056ac8fecf8 198 if (address) {
valeyev 0:e056ac8fecf8 199 address->set_addr(addr);
valeyev 0:e056ac8fecf8 200 address->set_port(port);
valeyev 0:e056ac8fecf8 201 }
valeyev 0:e056ac8fecf8 202
valeyev 0:e056ac8fecf8 203 return err;
valeyev 0:e056ac8fecf8 204 }
valeyev 0:e056ac8fecf8 205
valeyev 0:e056ac8fecf8 206 virtual nsapi_size_or_error_t socket_send(nsapi_socket_t socket, const void *data, nsapi_size_t size)
valeyev 0:e056ac8fecf8 207 {
valeyev 0:e056ac8fecf8 208 if (!_stack_api()->socket_send) {
valeyev 0:e056ac8fecf8 209 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 210 }
valeyev 0:e056ac8fecf8 211
valeyev 0:e056ac8fecf8 212 return _stack_api()->socket_send(_stack(), socket, data, size);
valeyev 0:e056ac8fecf8 213 }
valeyev 0:e056ac8fecf8 214
valeyev 0:e056ac8fecf8 215 virtual nsapi_size_or_error_t socket_recv(nsapi_socket_t socket, void *data, nsapi_size_t size)
valeyev 0:e056ac8fecf8 216 {
valeyev 0:e056ac8fecf8 217 if (!_stack_api()->socket_recv) {
valeyev 0:e056ac8fecf8 218 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 219 }
valeyev 0:e056ac8fecf8 220
valeyev 0:e056ac8fecf8 221 return _stack_api()->socket_recv(_stack(), socket, data, size);
valeyev 0:e056ac8fecf8 222 }
valeyev 0:e056ac8fecf8 223
valeyev 0:e056ac8fecf8 224 virtual nsapi_size_or_error_t socket_sendto(nsapi_socket_t socket, const SocketAddress &address, const void *data, nsapi_size_t size)
valeyev 0:e056ac8fecf8 225 {
valeyev 0:e056ac8fecf8 226 if (!_stack_api()->socket_sendto) {
valeyev 0:e056ac8fecf8 227 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 228 }
valeyev 0:e056ac8fecf8 229
valeyev 0:e056ac8fecf8 230 return _stack_api()->socket_sendto(_stack(), socket, address.get_addr(), address.get_port(), data, size);
valeyev 0:e056ac8fecf8 231 }
valeyev 0:e056ac8fecf8 232
valeyev 0:e056ac8fecf8 233 virtual nsapi_size_or_error_t socket_recvfrom(nsapi_socket_t socket, SocketAddress *address, void *data, nsapi_size_t size)
valeyev 0:e056ac8fecf8 234 {
valeyev 0:e056ac8fecf8 235 if (!_stack_api()->socket_recvfrom) {
valeyev 0:e056ac8fecf8 236 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 237 }
valeyev 0:e056ac8fecf8 238
valeyev 0:e056ac8fecf8 239 nsapi_addr_t addr = {NSAPI_IPv4, 0};
valeyev 0:e056ac8fecf8 240 uint16_t port = 0;
valeyev 0:e056ac8fecf8 241
valeyev 0:e056ac8fecf8 242 nsapi_size_or_error_t err = _stack_api()->socket_recvfrom(_stack(), socket, &addr, &port, data, size);
valeyev 0:e056ac8fecf8 243
valeyev 0:e056ac8fecf8 244 if (address) {
valeyev 0:e056ac8fecf8 245 address->set_addr(addr);
valeyev 0:e056ac8fecf8 246 address->set_port(port);
valeyev 0:e056ac8fecf8 247 }
valeyev 0:e056ac8fecf8 248
valeyev 0:e056ac8fecf8 249 return err;
valeyev 0:e056ac8fecf8 250 }
valeyev 0:e056ac8fecf8 251
valeyev 0:e056ac8fecf8 252 virtual void socket_attach(nsapi_socket_t socket, void (*callback)(void *), void *data)
valeyev 0:e056ac8fecf8 253 {
valeyev 0:e056ac8fecf8 254 if (!_stack_api()->socket_attach) {
valeyev 0:e056ac8fecf8 255 return;
valeyev 0:e056ac8fecf8 256 }
valeyev 0:e056ac8fecf8 257
valeyev 0:e056ac8fecf8 258 return _stack_api()->socket_attach(_stack(), socket, callback, data);
valeyev 0:e056ac8fecf8 259 }
valeyev 0:e056ac8fecf8 260
valeyev 0:e056ac8fecf8 261 virtual nsapi_error_t setsockopt(nsapi_socket_t socket, int level, int optname, const void *optval, unsigned optlen)
valeyev 0:e056ac8fecf8 262 {
valeyev 0:e056ac8fecf8 263 if (!_stack_api()->setsockopt) {
valeyev 0:e056ac8fecf8 264 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 265 }
valeyev 0:e056ac8fecf8 266
valeyev 0:e056ac8fecf8 267 return _stack_api()->setsockopt(_stack(), socket, level, optname, optval, optlen);
valeyev 0:e056ac8fecf8 268 }
valeyev 0:e056ac8fecf8 269
valeyev 0:e056ac8fecf8 270 virtual nsapi_error_t getsockopt(nsapi_socket_t socket, int level, int optname, void *optval, unsigned *optlen)
valeyev 0:e056ac8fecf8 271 {
valeyev 0:e056ac8fecf8 272 if (!_stack_api()->getsockopt) {
valeyev 0:e056ac8fecf8 273 return NSAPI_ERROR_UNSUPPORTED;
valeyev 0:e056ac8fecf8 274 }
valeyev 0:e056ac8fecf8 275
valeyev 0:e056ac8fecf8 276 return _stack_api()->getsockopt(_stack(), socket, level, optname, optval, optlen);
valeyev 0:e056ac8fecf8 277 }
valeyev 0:e056ac8fecf8 278 };
valeyev 0:e056ac8fecf8 279
valeyev 0:e056ac8fecf8 280
valeyev 0:e056ac8fecf8 281 // Conversion function for network stacks
valeyev 0:e056ac8fecf8 282 NetworkStack *nsapi_create_stack(nsapi_stack_t *stack)
valeyev 0:e056ac8fecf8 283 {
valeyev 0:e056ac8fecf8 284 MBED_STATIC_ASSERT(sizeof stack->_stack_buffer >= sizeof(NetworkStackWrapper),
valeyev 0:e056ac8fecf8 285 "The nsapi_stack_t stack buffer must fit a NetworkStackWrapper");
valeyev 0:e056ac8fecf8 286 return new (stack->_stack_buffer) NetworkStackWrapper;
valeyev 0:e056ac8fecf8 287 }
valeyev 0:e056ac8fecf8 288
valeyev 0:e056ac8fecf8 289 NetworkStack *nsapi_create_stack(NetworkStack *stack)
valeyev 0:e056ac8fecf8 290 {
valeyev 0:e056ac8fecf8 291 return stack;
valeyev 0:e056ac8fecf8 292 }
valeyev 0:e056ac8fecf8 293