Rahul Dahiya / Mbed OS STM32F7 Ethernet
Committer:
rahul_dahiya
Date:
Wed Jan 15 15:57:15 2020 +0530
Revision:
0:fb8047b156bb
STM32F7 LWIP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rahul_dahiya 0:fb8047b156bb 1 /* Socket
rahul_dahiya 0:fb8047b156bb 2 * Copyright (c) 2015 ARM Limited
rahul_dahiya 0:fb8047b156bb 3 *
rahul_dahiya 0:fb8047b156bb 4 * Licensed under the Apache License, Version 2.0 (the "License");
rahul_dahiya 0:fb8047b156bb 5 * you may not use this file except in compliance with the License.
rahul_dahiya 0:fb8047b156bb 6 * You may obtain a copy of the License at
rahul_dahiya 0:fb8047b156bb 7 *
rahul_dahiya 0:fb8047b156bb 8 * http://www.apache.org/licenses/LICENSE-2.0
rahul_dahiya 0:fb8047b156bb 9 *
rahul_dahiya 0:fb8047b156bb 10 * Unless required by applicable law or agreed to in writing, software
rahul_dahiya 0:fb8047b156bb 11 * distributed under the License is distributed on an "AS IS" BASIS,
rahul_dahiya 0:fb8047b156bb 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rahul_dahiya 0:fb8047b156bb 13 * See the License for the specific language governing permissions and
rahul_dahiya 0:fb8047b156bb 14 * limitations under the License.
rahul_dahiya 0:fb8047b156bb 15 */
rahul_dahiya 0:fb8047b156bb 16
rahul_dahiya 0:fb8047b156bb 17 #include "Socket.h"
rahul_dahiya 0:fb8047b156bb 18 #include "mbed.h"
rahul_dahiya 0:fb8047b156bb 19
rahul_dahiya 0:fb8047b156bb 20 Socket::Socket()
rahul_dahiya 0:fb8047b156bb 21 : _stack(0)
rahul_dahiya 0:fb8047b156bb 22 , _socket(0)
rahul_dahiya 0:fb8047b156bb 23 , _timeout(osWaitForever)
rahul_dahiya 0:fb8047b156bb 24 {
rahul_dahiya 0:fb8047b156bb 25 }
rahul_dahiya 0:fb8047b156bb 26
rahul_dahiya 0:fb8047b156bb 27 nsapi_error_t Socket::open(NetworkStack *stack)
rahul_dahiya 0:fb8047b156bb 28 {
rahul_dahiya 0:fb8047b156bb 29 _lock.lock();
rahul_dahiya 0:fb8047b156bb 30
rahul_dahiya 0:fb8047b156bb 31 if (_stack != NULL || stack == NULL) {
rahul_dahiya 0:fb8047b156bb 32 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 33 return NSAPI_ERROR_PARAMETER;
rahul_dahiya 0:fb8047b156bb 34 }
rahul_dahiya 0:fb8047b156bb 35 _stack = stack;
rahul_dahiya 0:fb8047b156bb 36
rahul_dahiya 0:fb8047b156bb 37 nsapi_socket_t socket;
rahul_dahiya 0:fb8047b156bb 38 nsapi_error_t err = _stack->socket_open(&socket, get_proto());
rahul_dahiya 0:fb8047b156bb 39 if (err) {
rahul_dahiya 0:fb8047b156bb 40 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 41 return err;
rahul_dahiya 0:fb8047b156bb 42 }
rahul_dahiya 0:fb8047b156bb 43
rahul_dahiya 0:fb8047b156bb 44 _socket = socket;
rahul_dahiya 0:fb8047b156bb 45 _event = callback(this, &Socket::event);
rahul_dahiya 0:fb8047b156bb 46 _stack->socket_attach(_socket, Callback<void()>::thunk, &_event);
rahul_dahiya 0:fb8047b156bb 47
rahul_dahiya 0:fb8047b156bb 48 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 49 return NSAPI_ERROR_OK;
rahul_dahiya 0:fb8047b156bb 50 }
rahul_dahiya 0:fb8047b156bb 51
rahul_dahiya 0:fb8047b156bb 52 nsapi_error_t Socket::close()
rahul_dahiya 0:fb8047b156bb 53 {
rahul_dahiya 0:fb8047b156bb 54 _lock.lock();
rahul_dahiya 0:fb8047b156bb 55
rahul_dahiya 0:fb8047b156bb 56 nsapi_error_t ret = NSAPI_ERROR_OK;
rahul_dahiya 0:fb8047b156bb 57 if (_socket) {
rahul_dahiya 0:fb8047b156bb 58 _stack->socket_attach(_socket, 0, 0);
rahul_dahiya 0:fb8047b156bb 59 nsapi_socket_t socket = _socket;
rahul_dahiya 0:fb8047b156bb 60 _socket = 0;
rahul_dahiya 0:fb8047b156bb 61 ret = _stack->socket_close(socket);
rahul_dahiya 0:fb8047b156bb 62 }
rahul_dahiya 0:fb8047b156bb 63 _stack = 0;
rahul_dahiya 0:fb8047b156bb 64
rahul_dahiya 0:fb8047b156bb 65 // Wakeup anything in a blocking operation
rahul_dahiya 0:fb8047b156bb 66 // on this socket
rahul_dahiya 0:fb8047b156bb 67 event();
rahul_dahiya 0:fb8047b156bb 68
rahul_dahiya 0:fb8047b156bb 69 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 70 return ret;
rahul_dahiya 0:fb8047b156bb 71 }
rahul_dahiya 0:fb8047b156bb 72
rahul_dahiya 0:fb8047b156bb 73 int Socket::modify_multicast_group(const SocketAddress &address, nsapi_socket_option_t socketopt)
rahul_dahiya 0:fb8047b156bb 74 {
rahul_dahiya 0:fb8047b156bb 75 nsapi_ip_mreq_t mreq;
rahul_dahiya 0:fb8047b156bb 76
rahul_dahiya 0:fb8047b156bb 77 // Set up group address
rahul_dahiya 0:fb8047b156bb 78 mreq.imr_multiaddr = address.get_addr();
rahul_dahiya 0:fb8047b156bb 79 mreq.imr_interface = nsapi_addr_t(); // Default address, NSAPI_UNSPEC
rahul_dahiya 0:fb8047b156bb 80
rahul_dahiya 0:fb8047b156bb 81 return this->setsockopt(NSAPI_SOCKET, socketopt, &mreq, sizeof(mreq));
rahul_dahiya 0:fb8047b156bb 82 }
rahul_dahiya 0:fb8047b156bb 83
rahul_dahiya 0:fb8047b156bb 84 int Socket::join_multicast_group(const SocketAddress &address)
rahul_dahiya 0:fb8047b156bb 85 {
rahul_dahiya 0:fb8047b156bb 86 return modify_multicast_group(address, NSAPI_ADD_MEMBERSHIP);
rahul_dahiya 0:fb8047b156bb 87 }
rahul_dahiya 0:fb8047b156bb 88
rahul_dahiya 0:fb8047b156bb 89 int Socket::leave_multicast_group(const SocketAddress &address)
rahul_dahiya 0:fb8047b156bb 90 {
rahul_dahiya 0:fb8047b156bb 91 return modify_multicast_group(address, NSAPI_DROP_MEMBERSHIP);
rahul_dahiya 0:fb8047b156bb 92 }
rahul_dahiya 0:fb8047b156bb 93
rahul_dahiya 0:fb8047b156bb 94
rahul_dahiya 0:fb8047b156bb 95 nsapi_error_t Socket::bind(uint16_t port)
rahul_dahiya 0:fb8047b156bb 96 {
rahul_dahiya 0:fb8047b156bb 97 // Underlying bind is thread safe
rahul_dahiya 0:fb8047b156bb 98 SocketAddress addr(0, port);
rahul_dahiya 0:fb8047b156bb 99 return bind(addr);
rahul_dahiya 0:fb8047b156bb 100 }
rahul_dahiya 0:fb8047b156bb 101
rahul_dahiya 0:fb8047b156bb 102 nsapi_error_t Socket::bind(const char *address, uint16_t port)
rahul_dahiya 0:fb8047b156bb 103 {
rahul_dahiya 0:fb8047b156bb 104 // Underlying bind is thread safe
rahul_dahiya 0:fb8047b156bb 105 SocketAddress addr(address, port);
rahul_dahiya 0:fb8047b156bb 106 return bind(addr);
rahul_dahiya 0:fb8047b156bb 107 }
rahul_dahiya 0:fb8047b156bb 108
rahul_dahiya 0:fb8047b156bb 109 nsapi_error_t Socket::bind(const SocketAddress &address)
rahul_dahiya 0:fb8047b156bb 110 {
rahul_dahiya 0:fb8047b156bb 111 _lock.lock();
rahul_dahiya 0:fb8047b156bb 112 nsapi_error_t ret;
rahul_dahiya 0:fb8047b156bb 113
rahul_dahiya 0:fb8047b156bb 114 if (!_socket) {
rahul_dahiya 0:fb8047b156bb 115 ret = NSAPI_ERROR_NO_SOCKET;
rahul_dahiya 0:fb8047b156bb 116 } else {
rahul_dahiya 0:fb8047b156bb 117 ret = _stack->socket_bind(_socket, address);
rahul_dahiya 0:fb8047b156bb 118 }
rahul_dahiya 0:fb8047b156bb 119
rahul_dahiya 0:fb8047b156bb 120 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 121 return ret;
rahul_dahiya 0:fb8047b156bb 122 }
rahul_dahiya 0:fb8047b156bb 123
rahul_dahiya 0:fb8047b156bb 124 void Socket::set_blocking(bool blocking)
rahul_dahiya 0:fb8047b156bb 125 {
rahul_dahiya 0:fb8047b156bb 126 // Socket::set_timeout is thread safe
rahul_dahiya 0:fb8047b156bb 127 set_timeout(blocking ? -1 : 0);
rahul_dahiya 0:fb8047b156bb 128 }
rahul_dahiya 0:fb8047b156bb 129
rahul_dahiya 0:fb8047b156bb 130 void Socket::set_timeout(int timeout)
rahul_dahiya 0:fb8047b156bb 131 {
rahul_dahiya 0:fb8047b156bb 132 _lock.lock();
rahul_dahiya 0:fb8047b156bb 133
rahul_dahiya 0:fb8047b156bb 134 if (timeout >= 0) {
rahul_dahiya 0:fb8047b156bb 135 _timeout = (uint32_t)timeout;
rahul_dahiya 0:fb8047b156bb 136 } else {
rahul_dahiya 0:fb8047b156bb 137 _timeout = osWaitForever;
rahul_dahiya 0:fb8047b156bb 138 }
rahul_dahiya 0:fb8047b156bb 139
rahul_dahiya 0:fb8047b156bb 140 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 141 }
rahul_dahiya 0:fb8047b156bb 142
rahul_dahiya 0:fb8047b156bb 143 nsapi_error_t Socket::setsockopt(int level, int optname, const void *optval, unsigned optlen)
rahul_dahiya 0:fb8047b156bb 144 {
rahul_dahiya 0:fb8047b156bb 145 _lock.lock();
rahul_dahiya 0:fb8047b156bb 146 nsapi_error_t ret;
rahul_dahiya 0:fb8047b156bb 147
rahul_dahiya 0:fb8047b156bb 148 if (!_socket) {
rahul_dahiya 0:fb8047b156bb 149 ret = NSAPI_ERROR_NO_SOCKET;
rahul_dahiya 0:fb8047b156bb 150 } else {
rahul_dahiya 0:fb8047b156bb 151 ret = _stack->setsockopt(_socket, level, optname, optval, optlen);
rahul_dahiya 0:fb8047b156bb 152 }
rahul_dahiya 0:fb8047b156bb 153
rahul_dahiya 0:fb8047b156bb 154 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 155 return ret;
rahul_dahiya 0:fb8047b156bb 156 }
rahul_dahiya 0:fb8047b156bb 157
rahul_dahiya 0:fb8047b156bb 158 nsapi_error_t Socket::getsockopt(int level, int optname, void *optval, unsigned *optlen)
rahul_dahiya 0:fb8047b156bb 159 {
rahul_dahiya 0:fb8047b156bb 160 _lock.lock();
rahul_dahiya 0:fb8047b156bb 161 nsapi_error_t ret;
rahul_dahiya 0:fb8047b156bb 162
rahul_dahiya 0:fb8047b156bb 163 if (!_socket) {
rahul_dahiya 0:fb8047b156bb 164 ret = NSAPI_ERROR_NO_SOCKET;
rahul_dahiya 0:fb8047b156bb 165 } else {
rahul_dahiya 0:fb8047b156bb 166 ret = _stack->getsockopt(_socket, level, optname, optval, optlen);
rahul_dahiya 0:fb8047b156bb 167 }
rahul_dahiya 0:fb8047b156bb 168
rahul_dahiya 0:fb8047b156bb 169 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 170 return ret;
rahul_dahiya 0:fb8047b156bb 171
rahul_dahiya 0:fb8047b156bb 172 }
rahul_dahiya 0:fb8047b156bb 173
rahul_dahiya 0:fb8047b156bb 174 void Socket::sigio(Callback<void()> callback)
rahul_dahiya 0:fb8047b156bb 175 {
rahul_dahiya 0:fb8047b156bb 176 _lock.lock();
rahul_dahiya 0:fb8047b156bb 177 _callback = callback;
rahul_dahiya 0:fb8047b156bb 178 _lock.unlock();
rahul_dahiya 0:fb8047b156bb 179 }
rahul_dahiya 0:fb8047b156bb 180
rahul_dahiya 0:fb8047b156bb 181 void Socket::attach(Callback<void()> callback)
rahul_dahiya 0:fb8047b156bb 182 {
rahul_dahiya 0:fb8047b156bb 183 sigio(callback);
rahul_dahiya 0:fb8047b156bb 184 }