_i16 sl_NetUtilCmd(const _u16 Cmd, const _u8 *pAttrib, const _u16 AttribLen, const _u8 *pInputValues, const _u16 InputLen, _u8 *pOutputValues, _u16 *pOutputLen) { _i16 RetVal=0; SlNetUtilCmdMsg_u Msg; _i16 ObjIdx = MAX_CONCURRENT_ACTIONS; _SlCmdExt_t CmdExt; _SlNetUtilCmdData_t OutData; /* prepare the Cmd (control structure and data-buffer) */ Msg.Cmd.Cmd = Cmd; Msg.Cmd.AttribLen = AttribLen; Msg.Cmd.InputLen = InputLen; Msg.Cmd.OutputLen = *pOutputLen; _SlDrvResetCmdExt(&CmdExt); _SlDrvMemZero(&OutData, sizeof(_SlNetUtilCmdData_t)); if(AttribLen > 0) { CmdExt.pTxPayload1 = (_u8*)pAttrib; CmdExt.TxPayload1Len = AttribLen; } if (InputLen > 0) { CmdExt.pTxPayload2 = (_u8*)pInputValues; CmdExt.TxPayload2Len = InputLen; } /* Set the pointers to be filled upon the async event reception */ OutData.pOutputValues = pOutputValues; OutData.pOutputLen = pOutputLen; ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&OutData, NETUTIL_CMD_ID, SL_MAX_SOCKETS); if (MAX_CONCURRENT_ACTIONS == ObjIdx) { return SL_POOL_IS_EMPTY; } /* send the command */ VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetUtilCmdCtrl, &Msg, &CmdExt)); if(SL_OS_RET_CODE_OK == (_i16)Msg.Rsp.status) { /* after the async event is signaled, the data will be copied to the pOutputValues buffer */ SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj); /* the response header status */ RetVal = OutData.Status; } else { RetVal = Msg.Rsp.status; } _SlDrvReleasePoolObj((_u8)ObjIdx); return RetVal; }
_i16 sl_Connect(_i16 sd, const SlSockAddr_t *addr, _i16 addrlen) { _SlSockConnectMsg_u Msg; _SlReturnVal_t RetVal; _SlCmdCtrl_t CmdCtrl = {0, (_SlArgSize_t)0, (_SlArgSize_t)sizeof(_SocketResponse_t)}; _SocketResponse_t AsyncRsp; _u8 ObjIdx = MAX_CONCURRENT_ACTIONS; /* verify no erorr handling in progress. if in progress than ignore the API execution and return immediately with an error */ VERIFY_NO_ERROR_HANDLING_IN_PROGRESS(); switch(addr->sa_family) { case SL_AF_INET : CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT; CmdCtrl.TxDescLen = (_SlArgSize_t)sizeof(_SocketAddrIPv4Command_t); /* Do nothing - cmd already initialized to this type */ break; case SL_AF_INET6_EUI_48: CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6; CmdCtrl.TxDescLen = (_SlArgSize_t)sizeof(_SocketAddrIPv6EUI48Command_t); break; #ifdef SL_SUPPORT_IPV6 case AF_INET6: CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6; CmdCtrl.TxDescLen = (_SlArgSize_t)sizeof(_SocketAddrIPv6Command_t); break; #endif case SL_AF_RF: default: return SL_RET_CODE_INVALID_INPUT; } Msg.Cmd.IpV4.lenOrPadding = 0; Msg.Cmd.IpV4.sd = (_u8)sd; _sl_BuildAddress(addr, &Msg.Cmd); ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&AsyncRsp, CONNECT_ID, (_u8)(sd & BSD_SOCKET_ID_MASK)); if (MAX_CONCURRENT_ACTIONS == ObjIdx) { return SL_POOL_IS_EMPTY; } /* send the command */ VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL)); VERIFY_PROTOCOL(Msg.Rsp.sd == (_u8)sd) RetVal = Msg.Rsp.statusOrLen; if(SL_RET_CODE_OK == RetVal) { #ifndef SL_TINY_EXT /*In case socket is non-blocking one, the async event should be received immediately */ if( g_pCB->SocketNonBlocking >> (sd & BSD_SOCKET_ID_MASK)) { SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj, SL_DRIVER_TIMEOUT_SHORT, SL_DRIVER_API_SOCKET_CONNECT ); } else #endif { /* wait for async and get Data Read parameters */ SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj); } VERIFY_PROTOCOL(AsyncRsp.sd == (_u8)sd); RetVal = AsyncRsp.statusOrLen; }