Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
UDPSocket.cpp
00001 /* Copyright (C) 2012 mbed.org, MIT License 00002 * 00003 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 00004 * and associated documentation files (the "Software"), to deal in the Software without restriction, 00005 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 00006 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 00007 * furnished to do so, subject to the following conditions: 00008 * 00009 * The above copyright notice and this permission notice shall be included in all copies or 00010 * substantial portions of the Software. 00011 * 00012 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 00013 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00014 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00015 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00016 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00017 */ 00018 /* Copyright (C) 2014 Murata Manufacturing Co.,Ltd., MIT License 00019 * port to the muRata, SWITCH SCIENCE Wi-FI module TypeYD SNIC-UART. 00020 */ 00021 #include "Socket/UDPSocket.h" 00022 #include <cstring> 00023 00024 UDPSocket::UDPSocket() { 00025 } 00026 00027 UDPSocket::~UDPSocket() 00028 { 00029 } 00030 00031 int UDPSocket::init(void) 00032 { 00033 return 0; 00034 } 00035 00036 // Server initialization 00037 int UDPSocket::bind(short port) 00038 { 00039 int ret; 00040 C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance(); 00041 C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand(); 00042 00043 FUNC_IN(); 00044 // Get local ip address. 00045 // Get buffer for response payload from MemoryPool 00046 tagMEMPOOL_BLOCK_T *payload_buf_p = snic_core_p->allocCmdBuf(); 00047 if( payload_buf_p == NULL ) 00048 { 00049 DEBUG_PRINT("UDP bind payload_buf_p NULL\r\n"); 00050 FUNC_OUT(); 00051 return -1; 00052 } 00053 00054 C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T req; 00055 // Make request 00056 req.cmd_sid = UART_CMD_SID_SNIC_GET_DHCP_INFO_REQ; 00057 req.seq = mUartRequestSeq++; 00058 req.interface = 0; 00059 00060 unsigned char *command_array_p = snic_core_p->getCommandBuf(); 00061 unsigned int command_len; 00062 // Preparation of command 00063 command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req 00064 , sizeof(C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T), payload_buf_p->buf, command_array_p ); 00065 // Send uart command request 00066 snic_core_p->sendUart( command_len, command_array_p ); 00067 // Wait UART response 00068 ret = uartCmdMgr_p->wait(); 00069 if( ret != 0 ) 00070 { 00071 DEBUG_PRINT( "UDP bind failed\r\n" ); 00072 snic_core_p->freeCmdBuf( payload_buf_p ); 00073 FUNC_OUT(); 00074 return -1; 00075 } 00076 00077 if( uartCmdMgr_p->getCommandStatus() != UART_CMD_RES_SNIC_SUCCESS ) 00078 { 00079 DEBUG_PRINT("UDP bind status:%02x\r\n", uartCmdMgr_p->getCommandStatus()); 00080 snic_core_p->freeCmdBuf( payload_buf_p ); 00081 FUNC_OUT(); 00082 return -1; 00083 } 00084 00085 unsigned int local_addr = (payload_buf_p->buf[9] << 24) 00086 | (payload_buf_p->buf[10] << 16) 00087 | (payload_buf_p->buf[11] << 8) 00088 | (payload_buf_p->buf[12]); 00089 00090 00091 C_SNIC_Core::tagSNIC_UDP_CREATE_SOCKET_REQ_T create_req; 00092 00093 // Make request 00094 create_req.cmd_sid = UART_CMD_SID_SNIC_UDP_CREATE_SOCKET_REQ; 00095 create_req.seq = mUartRequestSeq++; 00096 create_req.bind = 1; 00097 // set ip addr ( byte order ) 00098 C_SNIC_UartMsgUtil::convertIntToByteAdday( local_addr, (char *)create_req.local_addr ); 00099 create_req.local_port[0] = ( (port & 0xFF00) >> 8 ); 00100 create_req.local_port[1] = (port & 0xFF); 00101 00102 // Preparation of command 00103 command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, create_req.cmd_sid, (unsigned char *)&create_req 00104 , sizeof(C_SNIC_Core::tagSNIC_UDP_CREATE_SOCKET_REQ_T), payload_buf_p->buf, command_array_p ); 00105 // Send uart command request 00106 snic_core_p->sendUart( command_len, command_array_p ); 00107 00108 // Wait UART response 00109 ret = uartCmdMgr_p->wait(); 00110 if( ret != 0 ) 00111 { 00112 DEBUG_PRINT( "UDP bind failed\r\n" ); 00113 snic_core_p->freeCmdBuf( payload_buf_p ); 00114 FUNC_OUT(); 00115 return -1; 00116 } 00117 00118 if( uartCmdMgr_p->getCommandStatus() != 0 ) 00119 { 00120 DEBUG_PRINT("UDP bind status:%02x\r\n", uartCmdMgr_p->getCommandStatus()); 00121 snic_core_p->freeCmdBuf( payload_buf_p ); 00122 FUNC_OUT(); 00123 return -1; 00124 } 00125 mSocketID = payload_buf_p->buf[3]; 00126 00127 // Initialize connection information 00128 C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = snic_core_p->getConnectInfo( mSocketID ); 00129 if( con_info_p->recvbuf_p == NULL ) 00130 { 00131 DEBUG_PRINT( "create recv buffer[socket:%d]\r\n", mSocketID); 00132 con_info_p->recvbuf_p = new CircBuffer<char>(SNIC_UART_RECVBUF_SIZE); 00133 } 00134 con_info_p->is_connected = true; 00135 con_info_p->is_received = false; 00136 00137 C_SNIC_Core::tagSNIC_UDP_START_RECV_REQ_T recv_start_req; 00138 00139 // Make request 00140 recv_start_req.cmd_sid = UART_CMD_SID_SNIC_UDP_START_RECV_REQ; 00141 recv_start_req.seq = mUartRequestSeq++; 00142 recv_start_req.socket_id = mSocketID; 00143 recv_start_req.recv_bufsize[0] = ( (SNIC_UART_RECVBUF_SIZE & 0xFF00) >> 8 ); 00144 recv_start_req.recv_bufsize[1] = (SNIC_UART_RECVBUF_SIZE & 0xFF); 00145 00146 // Preparation of command 00147 command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, recv_start_req.cmd_sid, (unsigned char *)&recv_start_req 00148 , sizeof(C_SNIC_Core::tagSNIC_UDP_START_RECV_REQ_T), payload_buf_p->buf, command_array_p ); 00149 // Send uart command request 00150 snic_core_p->sendUart( command_len, command_array_p ); 00151 00152 // Wait UART response 00153 ret = uartCmdMgr_p->wait(); 00154 if( ret != 0 ) 00155 { 00156 DEBUG_PRINT( "UDP recv start failed\r\n" ); 00157 snic_core_p->freeCmdBuf( payload_buf_p ); 00158 FUNC_OUT(); 00159 return -1; 00160 } 00161 00162 if( uartCmdMgr_p->getCommandStatus() != 0 ) 00163 { 00164 DEBUG_PRINT("UDP recv start status:%02x\r\n", uartCmdMgr_p->getCommandStatus()); 00165 snic_core_p->freeCmdBuf( payload_buf_p ); 00166 FUNC_OUT(); 00167 return -1; 00168 } 00169 00170 snic_core_p->freeCmdBuf( payload_buf_p ); 00171 FUNC_OUT(); 00172 return 0; 00173 } 00174 00175 // -1 if unsuccessful, else number of bytes written 00176 int UDPSocket::sendTo(Endpoint &remote, char *packet, int length) 00177 { 00178 C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance(); 00179 C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand(); 00180 00181 osThreadId tid = Thread::gettid(); 00182 00183 // pc.printf("send[%08x] len:%d(%04x)\r\n", tid, length, length); 00184 00185 #if 0 // TODO: Not wait for command response(Tentative) 00186 snic_core_p->lockAPI(); 00187 #endif 00188 FUNC_IN(); 00189 00190 #if 0 // TODO: Not wait for command response(Tentative) 00191 // Get buffer for response payload from MemoryPool 00192 tagMEMPOOL_BLOCK_T *payload_buf_p = snic_core_p->allocCmdBuf(); 00193 if( payload_buf_p == NULL ) 00194 { 00195 DEBUG_PRINT("connect payload_buf_p NULL\r\n"); 00196 FUNC_OUT(); 00197 snic_core_p->unlockAPI(); 00198 return -1; 00199 } 00200 #endif 00201 00202 C_SNIC_Core::tagSNIC_UDP_SEND_FROM_SOCKET_REQ_T req; 00203 // Make request 00204 req.cmd_sid = UART_CMD_SID_SNIC_UDP_SEND_FROM_SOCKET_REQ; 00205 req.seq = mUartRequestSeq++; 00206 00207 int addr_temp; 00208 addr_temp = C_SNIC_UartMsgUtil::addrToInteger( remote.get_address() ); 00209 C_SNIC_UartMsgUtil::convertIntToByteAdday( addr_temp, (char *)req.remote_ip ); 00210 req.remote_port[0] = ( (remote.get_port() & 0xFF00) >> 8 ); 00211 req.remote_port[1] = (remote.get_port() & 0xFF); 00212 req.payload_len[0] = ( (length & 0xFF00) >> 8 ); 00213 req.payload_len[1] = (length & 0xFF); 00214 req.socket_id = mSocketID; 00215 req.connection_mode = 1; 00216 00217 // Initialize connection information 00218 C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = snic_core_p->getConnectInfo( mSocketID ); 00219 if( con_info_p != NULL ) 00220 { 00221 con_info_p->from_ip = addr_temp; 00222 con_info_p->from_port = remote.get_port(); 00223 } 00224 00225 int req_size = sizeof(C_SNIC_Core::tagSNIC_UDP_SEND_FROM_SOCKET_REQ_T); 00226 00227 char *send_buf_p = getSocketSendBuf(); 00228 memcpy( send_buf_p, &req, req_size ); 00229 memcpy( &send_buf_p[req_size], packet, length ); 00230 00231 unsigned char *command_array_p = snic_core_p->getCommandBuf(); 00232 unsigned int command_len; 00233 00234 // Make all command request 00235 command_len = C_SNIC_UartMsgUtil::makeRequest( UART_CMD_ID_SNIC, (unsigned char *)send_buf_p, req_size + length, command_array_p ); 00236 00237 // Send uart command request 00238 snic_core_p->sendUart( command_len, command_array_p ); 00239 00240 #if 0 // TODO: Not wait for command response(Tentative) 00241 // Wait UART response 00242 int ret = uartCmdMgr_p->wait(); 00243 if( ret != 0 ) 00244 { 00245 DEBUG_PRINT( "send failed\r\n" ); 00246 snic_core_p->freeCmdBuf( payload_buf_p ); 00247 FUNC_OUT(); 00248 snic_core_p->unlockAPI(); 00249 return -1; 00250 } 00251 00252 if( uartCmdMgr_p->getCommandStatus() != UART_CMD_RES_SNIC_SUCCESS ) 00253 { 00254 DEBUG_PRINT("send status:%02x\r\n", uartCmdMgr_p->getCommandStatus()); 00255 snic_core_p->freeCmdBuf( payload_buf_p ); 00256 FUNC_OUT(); 00257 snic_core_p->unlockAPI(); 00258 return -1; 00259 } 00260 snic_core_p->freeCmdBuf( payload_buf_p ); 00261 #endif 00262 00263 FUNC_OUT(); 00264 #if 0 // TODO: Not wait for command response(Tentative) 00265 snic_core_p->unlockAPI(); 00266 #endif 00267 // SNIC_SEND_FROM_SOCKET_REQ 00268 wait(0.05); 00269 00270 return length; 00271 // return 0; 00272 } 00273 00274 // -1 if unsuccessful, else number of bytes received 00275 int UDPSocket::receiveFrom(Endpoint &remote, char *data_p, int length) 00276 { 00277 FUNC_IN(); 00278 if( (data_p == NULL) || (length < 1) ) 00279 { 00280 DEBUG_PRINT("UDPSocket::receiveFrom parameter error\r\n"); 00281 FUNC_OUT(); 00282 return -1; 00283 } 00284 00285 C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance(); 00286 // Initialize connection information 00287 C_SNIC_Core::tagCONNECT_INFO_T *con_info_p = snic_core_p->getConnectInfo( mSocketID ); 00288 if( con_info_p->recvbuf_p == NULL ) 00289 { 00290 DEBUG_PRINT("UDPSocket::receiveFrom Conncection info error\r\n"); 00291 FUNC_OUT(); 00292 return -1; 00293 } 00294 00295 char remote_ip[20] = {'\0'}; 00296 sprintf( remote_ip, "%d.%d.%d.%d" 00297 , (con_info_p->from_ip >>24) & 0x000000ff 00298 , (con_info_p->from_ip >>16) & 0x000000ff 00299 , (con_info_p->from_ip >>8) & 0x000000ff 00300 , (con_info_p->from_ip) & 0x000000ff ); 00301 remote.set_address( remote_ip, con_info_p->from_port ); 00302 00303 con_info_p->mutex.lock(); 00304 con_info_p->is_receive_complete = true; 00305 con_info_p->mutex.unlock(); 00306 if( con_info_p->is_received == false ) 00307 { 00308 // Try receive 00309 Thread::yield(); 00310 00311 if( con_info_p->is_received == false ) 00312 { 00313 // No data received. 00314 FUNC_OUT(); 00315 return 0; 00316 } 00317 } 00318 // Get packet data from buffer for receive. 00319 int i; 00320 for (i = 0; i < length; i ++) 00321 { 00322 if (con_info_p->recvbuf_p->dequeue(&data_p[i]) == false) 00323 { 00324 break; 00325 } 00326 } 00327 if( con_info_p->recvbuf_p->isEmpty() ) 00328 { 00329 con_info_p->mutex.lock(); 00330 con_info_p->is_received = false; 00331 con_info_p->mutex.unlock(); 00332 } 00333 FUNC_OUT(); 00334 return i; 00335 }
Generated on Thu Jul 14 2022 20:28:29 by
1.7.2