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 "Socket.h"
valeyev 0:e056ac8fecf8 18 #include "mbed.h"
valeyev 0:e056ac8fecf8 19
valeyev 0:e056ac8fecf8 20 Socket::Socket()
valeyev 0:e056ac8fecf8 21 : _stack(0)
valeyev 0:e056ac8fecf8 22 , _socket(0)
valeyev 0:e056ac8fecf8 23 , _timeout(osWaitForever)
valeyev 0:e056ac8fecf8 24 {
valeyev 0:e056ac8fecf8 25 }
valeyev 0:e056ac8fecf8 26
valeyev 0:e056ac8fecf8 27 nsapi_error_t Socket::open(NetworkStack *stack)
valeyev 0:e056ac8fecf8 28 {
valeyev 0:e056ac8fecf8 29 _lock.lock();
valeyev 0:e056ac8fecf8 30
valeyev 0:e056ac8fecf8 31 if (_stack != NULL || stack == NULL) {
valeyev 0:e056ac8fecf8 32 _lock.unlock();
valeyev 0:e056ac8fecf8 33 return NSAPI_ERROR_PARAMETER;
valeyev 0:e056ac8fecf8 34 }
valeyev 0:e056ac8fecf8 35 _stack = stack;
valeyev 0:e056ac8fecf8 36
valeyev 0:e056ac8fecf8 37 nsapi_socket_t socket;
valeyev 0:e056ac8fecf8 38 nsapi_error_t err = _stack->socket_open(&socket, get_proto());
valeyev 0:e056ac8fecf8 39 if (err) {
valeyev 0:e056ac8fecf8 40 _lock.unlock();
valeyev 0:e056ac8fecf8 41 return err;
valeyev 0:e056ac8fecf8 42 }
valeyev 0:e056ac8fecf8 43
valeyev 0:e056ac8fecf8 44 _socket = socket;
valeyev 0:e056ac8fecf8 45 _event = callback(this, &Socket::event);
valeyev 0:e056ac8fecf8 46 _stack->socket_attach(_socket, Callback<void()>::thunk, &_event);
valeyev 0:e056ac8fecf8 47
valeyev 0:e056ac8fecf8 48 _lock.unlock();
valeyev 0:e056ac8fecf8 49 return NSAPI_ERROR_OK;
valeyev 0:e056ac8fecf8 50 }
valeyev 0:e056ac8fecf8 51
valeyev 0:e056ac8fecf8 52 nsapi_error_t Socket::close()
valeyev 0:e056ac8fecf8 53 {
valeyev 0:e056ac8fecf8 54 _lock.lock();
valeyev 0:e056ac8fecf8 55
valeyev 0:e056ac8fecf8 56 nsapi_error_t ret = NSAPI_ERROR_OK;
valeyev 0:e056ac8fecf8 57 if (_socket) {
valeyev 0:e056ac8fecf8 58 _stack->socket_attach(_socket, 0, 0);
valeyev 0:e056ac8fecf8 59 nsapi_socket_t socket = _socket;
valeyev 0:e056ac8fecf8 60 _socket = 0;
valeyev 0:e056ac8fecf8 61 ret = _stack->socket_close(socket);
valeyev 0:e056ac8fecf8 62 }
valeyev 0:e056ac8fecf8 63 _stack = 0;
valeyev 0:e056ac8fecf8 64
valeyev 0:e056ac8fecf8 65 // Wakeup anything in a blocking operation
valeyev 0:e056ac8fecf8 66 // on this socket
valeyev 0:e056ac8fecf8 67 event();
valeyev 0:e056ac8fecf8 68
valeyev 0:e056ac8fecf8 69 _lock.unlock();
valeyev 0:e056ac8fecf8 70 return ret;
valeyev 0:e056ac8fecf8 71 }
valeyev 0:e056ac8fecf8 72
valeyev 0:e056ac8fecf8 73 int Socket::modify_multicast_group(const SocketAddress &address, nsapi_socket_option_t socketopt)
valeyev 0:e056ac8fecf8 74 {
valeyev 0:e056ac8fecf8 75 nsapi_ip_mreq_t mreq;
valeyev 0:e056ac8fecf8 76
valeyev 0:e056ac8fecf8 77 // Set up group address
valeyev 0:e056ac8fecf8 78 mreq.imr_multiaddr = address.get_addr();
valeyev 0:e056ac8fecf8 79 mreq.imr_interface = nsapi_addr_t(); // Default address, NSAPI_UNSPEC
valeyev 0:e056ac8fecf8 80
valeyev 0:e056ac8fecf8 81 return this->setsockopt(NSAPI_SOCKET, socketopt, &mreq, sizeof(mreq));
valeyev 0:e056ac8fecf8 82 }
valeyev 0:e056ac8fecf8 83
valeyev 0:e056ac8fecf8 84 int Socket::join_multicast_group(const SocketAddress &address)
valeyev 0:e056ac8fecf8 85 {
valeyev 0:e056ac8fecf8 86 return modify_multicast_group(address, NSAPI_ADD_MEMBERSHIP);
valeyev 0:e056ac8fecf8 87 }
valeyev 0:e056ac8fecf8 88
valeyev 0:e056ac8fecf8 89 int Socket::leave_multicast_group(const SocketAddress &address)
valeyev 0:e056ac8fecf8 90 {
valeyev 0:e056ac8fecf8 91 return modify_multicast_group(address, NSAPI_DROP_MEMBERSHIP);
valeyev 0:e056ac8fecf8 92 }
valeyev 0:e056ac8fecf8 93
valeyev 0:e056ac8fecf8 94
valeyev 0:e056ac8fecf8 95 nsapi_error_t Socket::bind(uint16_t port)
valeyev 0:e056ac8fecf8 96 {
valeyev 0:e056ac8fecf8 97 // Underlying bind is thread safe
valeyev 0:e056ac8fecf8 98 SocketAddress addr(0, port);
valeyev 0:e056ac8fecf8 99 return bind(addr);
valeyev 0:e056ac8fecf8 100 }
valeyev 0:e056ac8fecf8 101
valeyev 0:e056ac8fecf8 102 nsapi_error_t Socket::bind(const char *address, uint16_t port)
valeyev 0:e056ac8fecf8 103 {
valeyev 0:e056ac8fecf8 104 // Underlying bind is thread safe
valeyev 0:e056ac8fecf8 105 SocketAddress addr(address, port);
valeyev 0:e056ac8fecf8 106 return bind(addr);
valeyev 0:e056ac8fecf8 107 }
valeyev 0:e056ac8fecf8 108
valeyev 0:e056ac8fecf8 109 nsapi_error_t Socket::bind(const SocketAddress &address)
valeyev 0:e056ac8fecf8 110 {
valeyev 0:e056ac8fecf8 111 _lock.lock();
valeyev 0:e056ac8fecf8 112 nsapi_error_t ret;
valeyev 0:e056ac8fecf8 113
valeyev 0:e056ac8fecf8 114 if (!_socket) {
valeyev 0:e056ac8fecf8 115 ret = NSAPI_ERROR_NO_SOCKET;
valeyev 0:e056ac8fecf8 116 } else {
valeyev 0:e056ac8fecf8 117 ret = _stack->socket_bind(_socket, address);
valeyev 0:e056ac8fecf8 118 }
valeyev 0:e056ac8fecf8 119
valeyev 0:e056ac8fecf8 120 _lock.unlock();
valeyev 0:e056ac8fecf8 121 return ret;
valeyev 0:e056ac8fecf8 122 }
valeyev 0:e056ac8fecf8 123
valeyev 0:e056ac8fecf8 124 void Socket::set_blocking(bool blocking)
valeyev 0:e056ac8fecf8 125 {
valeyev 0:e056ac8fecf8 126 // Socket::set_timeout is thread safe
valeyev 0:e056ac8fecf8 127 set_timeout(blocking ? -1 : 0);
valeyev 0:e056ac8fecf8 128 }
valeyev 0:e056ac8fecf8 129
valeyev 0:e056ac8fecf8 130 void Socket::set_timeout(int timeout)
valeyev 0:e056ac8fecf8 131 {
valeyev 0:e056ac8fecf8 132 _lock.lock();
valeyev 0:e056ac8fecf8 133
valeyev 0:e056ac8fecf8 134 if (timeout >= 0) {
valeyev 0:e056ac8fecf8 135 _timeout = (uint32_t)timeout;
valeyev 0:e056ac8fecf8 136 } else {
valeyev 0:e056ac8fecf8 137 _timeout = osWaitForever;
valeyev 0:e056ac8fecf8 138 }
valeyev 0:e056ac8fecf8 139
valeyev 0:e056ac8fecf8 140 _lock.unlock();
valeyev 0:e056ac8fecf8 141 }
valeyev 0:e056ac8fecf8 142
valeyev 0:e056ac8fecf8 143 nsapi_error_t Socket::setsockopt(int level, int optname, const void *optval, unsigned optlen)
valeyev 0:e056ac8fecf8 144 {
valeyev 0:e056ac8fecf8 145 _lock.lock();
valeyev 0:e056ac8fecf8 146 nsapi_error_t ret;
valeyev 0:e056ac8fecf8 147
valeyev 0:e056ac8fecf8 148 if (!_socket) {
valeyev 0:e056ac8fecf8 149 ret = NSAPI_ERROR_NO_SOCKET;
valeyev 0:e056ac8fecf8 150 } else {
valeyev 0:e056ac8fecf8 151 ret = _stack->setsockopt(_socket, level, optname, optval, optlen);
valeyev 0:e056ac8fecf8 152 }
valeyev 0:e056ac8fecf8 153
valeyev 0:e056ac8fecf8 154 _lock.unlock();
valeyev 0:e056ac8fecf8 155 return ret;
valeyev 0:e056ac8fecf8 156 }
valeyev 0:e056ac8fecf8 157
valeyev 0:e056ac8fecf8 158 nsapi_error_t Socket::getsockopt(int level, int optname, void *optval, unsigned *optlen)
valeyev 0:e056ac8fecf8 159 {
valeyev 0:e056ac8fecf8 160 _lock.lock();
valeyev 0:e056ac8fecf8 161 nsapi_error_t ret;
valeyev 0:e056ac8fecf8 162
valeyev 0:e056ac8fecf8 163 if (!_socket) {
valeyev 0:e056ac8fecf8 164 ret = NSAPI_ERROR_NO_SOCKET;
valeyev 0:e056ac8fecf8 165 } else {
valeyev 0:e056ac8fecf8 166 ret = _stack->getsockopt(_socket, level, optname, optval, optlen);
valeyev 0:e056ac8fecf8 167 }
valeyev 0:e056ac8fecf8 168
valeyev 0:e056ac8fecf8 169 _lock.unlock();
valeyev 0:e056ac8fecf8 170 return ret;
valeyev 0:e056ac8fecf8 171
valeyev 0:e056ac8fecf8 172 }
valeyev 0:e056ac8fecf8 173
valeyev 0:e056ac8fecf8 174 void Socket::sigio(Callback<void()> callback)
valeyev 0:e056ac8fecf8 175 {
valeyev 0:e056ac8fecf8 176 _lock.lock();
valeyev 0:e056ac8fecf8 177 _callback = callback;
valeyev 0:e056ac8fecf8 178 _lock.unlock();
valeyev 0:e056ac8fecf8 179 }
valeyev 0:e056ac8fecf8 180
valeyev 0:e056ac8fecf8 181 void Socket::attach(Callback<void()> callback)
valeyev 0:e056ac8fecf8 182 {
valeyev 0:e056ac8fecf8 183 sigio(callback);
valeyev 0:e056ac8fecf8 184 }