21 #include <ti/drivers/net/wifi/simplelink.h>
22 #include <ti/drivers/net/wifi/source/protocol.h>
23 #include <ti/drivers/net/wifi/source/driver.h>
26 _SlReturnVal_t _SlSocketHandleAsync_Connect(
void *pVoidBuf);
27 _SlReturnVal_t _SlSocketHandleAsync_Close(
void *pVoidBuf);
31 _SlReturnVal_t _SlSocketHandleAsync_Accept(
void *pVoidBuf);
32 _SlReturnVal_t _SlSocketHandleAsync_Select(
void *pVoidBuf);
52 pCmd->IpV4.FamilyAndFlags = (_u8)((addr->sa_family << 4) & 0xF0);
55 if(SL_AF_INET == addr->sa_family)
59 #ifdef SL_SUPPORT_IPV6
62 sl_Memcpy(pCmd->IpV6.Address, ((
SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u32, 16 );
78 addr->sa_family = pRsp->IpV4.Family;
83 if(SL_AF_INET == addr->sa_family)
87 #ifdef SL_SUPPORT_IPV6
90 sl_Memcpy(((
SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u32, pRsp->IpV6.Address, 16);
109 #if _SL_INCLUDE_FUNC(sl_Socket)
113 SL_OPCODE_SOCKET_SOCKET,
120 _SlSockSocketMsg_u Msg;
122 Msg.Cmd.Domain = (_u8)Domain;
123 Msg.Cmd.Type = (_u8)Type;
124 Msg.Cmd.Protocol = (_u8)Protocol;
128 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
130 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlSockSocketCmdCtrl, &Msg, NULL));
132 if( Msg.Rsp.StatusOrLen < 0 )
134 return ( Msg.Rsp.StatusOrLen);
138 return (_i16)((_u8)Msg.Rsp.Sd);
153 #if _SL_INCLUDE_FUNC(sl_Close)
157 SL_OPCODE_SOCKET_CLOSE,
164 _SlSockCloseMsg_u Msg;
165 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
167 _SlReturnVal_t RetVal;
168 _u8 bSocketInAction = FALSE;
172 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
174 Msg.Cmd.Sd = (_u8)sd;
177 bSocketInAction = !!(g_pCB->ActiveActionsBitmap & (1<<sd));
179 if (bSocketInAction == FALSE)
181 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&AsyncRsp, CLOSE_ID, (_u8)(sd & SL_BSD_SOCKET_ID_MASK));
183 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
185 return SL_POOL_IS_EMPTY;
189 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlSockCloseCmdCtrl, &Msg, NULL));
191 RetVal = Msg.Rsp.StatusOrLen;
193 if (bSocketInAction == FALSE)
195 if( SL_RET_CODE_OK == RetVal)
197 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj,
198 SL_DRIVER_TIMEOUT_LONG,
199 SL_OPCODE_SOCKET_SOCKETCLOSEASYNCEVENT
201 RetVal = AsyncRsp.StatusOrLen;
204 _SlDrvReleasePoolObj(ObjIdx);
220 #if _SL_INCLUDE_FUNC(sl_Bind)
223 _SlSockBindMsg_u Msg;
228 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
230 switch(addr->sa_family)
233 CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND;
237 #ifdef SL_SUPPORT_IPV6
239 CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6;
247 return SL_RET_CODE_INVALID_INPUT;
250 Msg.Cmd.IpV4.LenOrPadding = 0;
251 Msg.Cmd.IpV4.Sd = (_u8)sd;
253 _SlSocketBuildAddress(addr, &Msg.Cmd);
254 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
256 return Msg.Rsp.StatusOrLen;
269 #if _SL_INCLUDE_FUNC(sl_SendTo)
279 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
281 if ((sd & SL_SOCKET_PAYLOAD_TYPE_MASK) == SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER)
283 return SL_ERROR_BSD_SOC_ERROR;
294 _SlDrvResetCmdExt(&CmdExt);
295 CmdExt.TxPayload1Len = (_u16)Len;
296 CmdExt.pTxPayload1 = (_u8 *)pBuf;
298 switch(to->sa_family)
301 CmdCtrl.Opcode = SL_OPCODE_SOCKET_SENDTO;
305 #ifdef SL_SUPPORT_IPV6
307 CmdCtrl.Opcode = SL_OPCODE_SOCKET_SENDTO_V6;
314 return SL_RET_CODE_INVALID_INPUT;
317 Msg.Cmd.IpV4.LenOrPadding = Len;
318 Msg.Cmd.IpV4.Sd = (_u8)sd;
319 _SlSocketBuildAddress(to, &Msg.Cmd);
320 Msg.Cmd.IpV4.FamilyAndFlags |= flags & 0x0F;
322 RetVal = _SlDrvDataWriteOp((_SlSd_t)sd, &CmdCtrl, &Msg, &CmdExt);
323 if(SL_OS_RET_CODE_OK != RetVal)
343 SL_OPCODE_SOCKET_RECVFROM,
350 #if _SL_INCLUDE_FUNC(sl_RecvFrom)
353 _SlRecvfromMsg_u Msg;
359 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
362 if ((sd & SL_SOCKET_PAYLOAD_TYPE_MASK) == SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER)
364 return SL_ERROR_BSD_SOC_ERROR;
367 _SlDrvResetCmdExt(&CmdExt);
368 CmdExt.RxPayloadLen = Len;
369 CmdExt.pRxPayload = (_u8 *)buf;
371 Msg.Cmd.Sd = (_u8)sd;
372 Msg.Cmd.StatusOrLen = (_u16)Len;
375 CmdExt.RxPayloadLen = (_i16)Msg.Cmd.StatusOrLen;
377 Msg.Cmd.FamilyAndFlags = (_u8)(flags & 0x0F);
381 Msg.Cmd.FamilyAndFlags |= (SL_AF_INET << 4);
385 Msg.Cmd.FamilyAndFlags |= (SL_AF_INET6 << 4);
389 return SL_RET_CODE_INVALID_INPUT;
392 RetVal = _SlDrvDataReadOp((_SlSd_t)sd, (
_SlCmdCtrl_t *)&_SlRecvfomCmdCtrl, &Msg, &CmdExt);
393 if( RetVal != SL_OS_RET_CODE_OK )
398 RetVal = Msg.Rsp.IpV4.StatusOrLen;
402 VERIFY_PROTOCOL(sd == (_i16)Msg.Rsp.IpV4.Sd);
404 _SlSocketParseAddress(&Msg.Rsp, from, fromlen);
406 from->sa_family = Msg.Rsp.IpV4.Family;
407 if(SL_AF_INET == from->sa_family)
413 #ifdef SL_SUPPORT_IPV6
414 else if(SL_AF_INET6 == from->sa_family)
419 sl_Memcpy(((
SlSockAddrIn6_t *)from)->sin6_addr._S6_un._S6_u32, Msg.Rsp.IpV6.Address, 16);
437 }_SlSockConnectMsg_u;
439 #if _SL_INCLUDE_FUNC(sl_Connect)
442 _SlSockConnectMsg_u Msg;
443 _SlReturnVal_t RetVal;
446 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
450 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
452 switch(addr->sa_family)
455 CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT;
459 #ifdef SL_SUPPORT_IPV6
461 CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6;
467 return SL_RET_CODE_INVALID_INPUT;
470 Msg.Cmd.IpV4.LenOrPadding = 0;
471 Msg.Cmd.IpV4.Sd = (_u8)sd;
473 _SlSocketBuildAddress(addr, &Msg.Cmd);
475 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&AsyncRsp, CONNECT_ID, (_u8)(sd & SL_BSD_SOCKET_ID_MASK));
477 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
479 return SL_POOL_IS_EMPTY;
483 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
484 VERIFY_PROTOCOL(Msg.Rsp.Sd == (_u8)sd);
486 RetVal = Msg.Rsp.StatusOrLen;
488 if(SL_RET_CODE_OK == RetVal)
492 if( g_pCB->SocketNonBlocking & (1<<(sd & SL_BSD_SOCKET_ID_MASK) ))
494 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj,
495 SL_DRIVER_TIMEOUT_SHORT,
496 SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE
504 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);
507 VERIFY_PROTOCOL(AsyncRsp.Sd == (_u8)sd);
508 RetVal = AsyncRsp.StatusOrLen;
511 _SlDrvReleasePoolObj(ObjIdx);
521 _SlReturnVal_t _SlSocketHandleAsync_Connect(
void *pVoidBuf)
525 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
527 VERIFY_PROTOCOL((pMsgArgs->Sd & SL_BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
528 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
531 ((
SlSocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->Sd = pMsgArgs->Sd;
532 ((
SlSocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->StatusOrLen = pMsgArgs->StatusOrLen;
535 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
536 SL_DRV_PROTECTION_OBJ_UNLOCK();
538 return SL_OS_RET_CODE_OK;
544 _SlReturnVal_t _SlSocketHandleAsync_Close(
void *pVoidBuf)
548 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
550 VERIFY_PROTOCOL((pMsgArgs->Sd & SL_BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
551 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
554 ((
SlSocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->Sd = pMsgArgs->Sd;
555 ((
SlSocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->StatusOrLen = pMsgArgs->StatusOrLen;
558 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
559 SL_DRV_PROTECTION_OBJ_UNLOCK();
561 return SL_OS_RET_CODE_OK;
575 SL_OPCODE_SOCKET_SEND,
580 #if _SL_INCLUDE_FUNC(sl_Send)
581 _i16
sl_Send(_i16 sd,
const void *pBuf, _i16 Len, _i16 flags)
590 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
592 _SlDrvResetCmdExt(&CmdExt);
593 CmdExt.TxPayload1Len = (_u16)Len;
594 CmdExt.pTxPayload1 = (_u8 *)pBuf;
597 if ((sd & SL_SOCKET_PAYLOAD_TYPE_MASK) == SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER)
599 tempVal = (_u32)flags;
600 CmdExt.pRxPayload = (_u8 *)&tempVal;
601 CmdExt.RxPayloadLen = -4;
605 CmdExt.pRxPayload = NULL;
613 Msg.Cmd.StatusOrLen = Len;
614 Msg.Cmd.Sd = (_u8)sd;
615 Msg.Cmd.FamilyAndFlags |= flags & 0x0F;
617 RetVal = _SlDrvDataWriteOp((_u8)sd, (
_SlCmdCtrl_t *)&_SlSendCmdCtrl, &Msg, &CmdExt);
618 if(SL_OS_RET_CODE_OK != RetVal)
638 #if _SL_INCLUDE_FUNC(sl_Listen)
642 SL_OPCODE_SOCKET_LISTEN,
653 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
655 Msg.Cmd.Sd = (_u8)sd;
656 Msg.Cmd.Backlog = (_u8)backlog;
658 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlListenCmdCtrl, &Msg, NULL));
659 return (_i16)Msg.Rsp.status;
674 #if _SL_INCLUDE_FUNC(sl_Accept)
678 SL_OPCODE_SOCKET_ACCEPT,
685 _SlSockAcceptMsg_u Msg;
686 _SlReturnVal_t RetVal;
689 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
693 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
695 Msg.Cmd.Sd = (_u8)sd;
696 Msg.Cmd.Family = (_u8)((
sizeof(
SlSockAddrIn_t) == *addrlen) ? SL_AF_INET : SL_AF_INET6);
698 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&AsyncRsp, ACCEPT_ID, (_u8)sd & SL_BSD_SOCKET_ID_MASK);
700 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
702 return SL_POOL_IS_EMPTY;
706 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlAcceptCmdCtrl, &Msg, NULL));
707 VERIFY_PROTOCOL(Msg.Rsp.Sd == (_u8)sd);
709 RetVal = Msg.Rsp.StatusOrLen;
711 if(SL_OS_RET_CODE_OK == RetVal)
715 if( g_pCB->SocketNonBlocking & (1<<(sd & SL_BSD_SOCKET_ID_MASK) ))
717 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj,
718 SL_DRIVER_TIMEOUT_SHORT,
719 SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE
726 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);
729 VERIFY_PROTOCOL(AsyncRsp.IpV4.Sd == (_u8)sd);
731 RetVal = AsyncRsp.IpV4.StatusOrLen;
732 if( (NULL != addr) && (NULL != addrlen) )
735 _SlSocketParseAddress(&AsyncRsp, addr, addrlen);
737 addr->sa_family = AsyncRsp.IpV4.Family;
739 if(SL_AF_INET == addr->sa_family)
744 ((
SlSockAddrIn_t *)addr)->sin_addr.s_addr = AsyncRsp.IpV4.Address;
751 #ifdef SL_SUPPORT_IPV6
757 sl_Memcpy(((
SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u32, AsyncRsp.IpV6.Address, 16);
769 _SlDrvReleasePoolObj(ObjIdx);
784 p[0] = ((_i8* )&val)[3];
785 p[1] = ((_i8* )&val)[2];
786 p[2] = ((_i8* )&val)[1];
787 p[3] = ((_i8* )&val)[0];
805 p[0] = ((_i8* )&val)[1];
806 p[1] = ((_i8* )&val)[0];
819 _SlReturnVal_t _SlSocketHandleAsync_Accept(
void *pVoidBuf)
823 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
825 VERIFY_PROTOCOL(( pMsgArgs->IpV4.Sd & SL_BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
826 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
828 sl_Memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,
sizeof(
SlSocketAddrResponse_u));
829 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
831 SL_DRV_PROTECTION_OBJ_UNLOCK();
833 return SL_OS_RET_CODE_OK;
839 _SlReturnVal_t _SlSocketHandleAsync_Select(
void *pVoidBuf)
842 #if ((defined(SL_RUNTIME_EVENT_REGISTERATION) || defined(slcb_SocketTriggerEventHandler)))
846 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
848 VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
850 sl_Memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,
sizeof(
SlSelectAsyncResponse_t));
852 #if ((defined(SL_RUNTIME_EVENT_REGISTERATION) || defined(slcb_SocketTriggerEventHandler)))
853 if(1 == _SlIsEventRegistered(SL_EVENT_HDL_SOCKET_TRIGGER))
855 if (g_pCB->SocketTriggerSelect.Info.State == SOCK_TRIGGER_WAITING_FOR_RESP)
858 SockTriggerEvent.Event = SL_SOCKET_TRIGGER_EVENT_SELECT;
859 SockTriggerEvent.EventData = 0;
862 g_pCB->SocketTriggerSelect.Info.State = SOCK_TRIGGER_RESP_RECEIVED;
864 SL_DRV_PROTECTION_OBJ_UNLOCK();
867 _SlDrvHandleSocketTriggerEvents(&SockTriggerEvent);
869 return SL_OS_RET_CODE_OK;
873 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
880 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
884 SL_DRV_PROTECTION_OBJ_UNLOCK();
886 return SL_OS_RET_CODE_OK;
901 #if _SL_INCLUDE_FUNC(sl_Recv)
905 SL_OPCODE_SOCKET_RECV,
911 _i16
sl_Recv(_i16 sd,
void *pBuf, _i16 Len, _i16 flags)
915 _SlReturnVal_t status;
919 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
921 _SlDrvResetCmdExt(&CmdExt);
922 CmdExt.RxPayloadLen = Len;
923 CmdExt.pRxPayload = (_u8 *)pBuf;
925 Msg.Cmd.Sd = (_u8)sd;
926 Msg.Cmd.StatusOrLen = (_u16)Len;
929 CmdExt.RxPayloadLen = (_i16)Msg.Cmd.StatusOrLen;
931 Msg.Cmd.FamilyAndFlags = (_u8)(flags & 0x0F);
933 status = _SlDrvDataReadOp((_SlSd_t)sd, (
_SlCmdCtrl_t *)&_SlRecvCmdCtrl, &Msg, &CmdExt);
934 if( status != SL_OS_RET_CODE_OK )
941 return (_i16)Msg.Rsp.StatusOrLen;
956 SL_OPCODE_SOCKET_SETSOCKOPT,
961 #if _SL_INCLUDE_FUNC(sl_SetSockOpt)
962 _i16
sl_SetSockOpt(_i16 sd, _i16 level, _i16 optname,
const void *optval, SlSocklen_t optlen)
964 _SlSetSockOptMsg_u Msg;
969 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
971 _SlDrvResetCmdExt(&CmdExt);
972 CmdExt.TxPayload1Len = optlen;
973 CmdExt.pTxPayload1 = (_u8 *)optval;
975 Msg.Cmd.Sd = (_u8)sd;
976 Msg.Cmd.Level = (_u8)level;
977 Msg.Cmd.OptionLen = (_u8)optlen;
978 Msg.Cmd.OptionName = (_u8)optname;
980 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlSetSockOptCmdCtrl, &Msg, &CmdExt));
982 return (_i16)Msg.Rsp.StatusOrLen;
996 #if _SL_INCLUDE_FUNC(sl_GetSockOpt)
1000 SL_OPCODE_SOCKET_GETSOCKOPT,
1005 _i16
sl_GetSockOpt(_i16 sd, _i16 level, _i16 optname,
void *optval, SlSocklen_t *optlen)
1007 _SlGetSockOptMsg_u Msg;
1012 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
1018 _SlDrvResetCmdExt(&CmdExt);
1019 CmdExt.RxPayloadLen = (_i16)(*optlen);
1020 CmdExt.pRxPayload = optval;
1022 Msg.Cmd.Sd = (_u8)sd;
1023 Msg.Cmd.Level = (_u8)level;
1024 Msg.Cmd.OptionLen = (_u8)(*optlen);
1025 Msg.Cmd.OptionName = (_u8)optname;
1027 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlGetSockOptCmdCtrl, &Msg, &CmdExt));
1029 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen)
1031 *optlen = Msg.Rsp.OptionLen;
1032 return SL_ESMALLBUF;
1036 *optlen = (_u8)CmdExt.ActualRxPayloadLen;
1038 return (_i16)Msg.Rsp.Status;
1055 void SL_SOCKET_FD_SET(_i16 fd,
SlFdSet_t *fdset)
1057 fdset->fd_array[0] |= (1<< (fd & SL_BSD_SOCKET_ID_MASK));
1062 void SL_SOCKET_FD_CLR(_i16 fd,
SlFdSet_t *fdset)
1064 fdset->fd_array[0] &= ~(1<< (fd & SL_BSD_SOCKET_ID_MASK));
1069 _i16 SL_SOCKET_FD_ISSET(_i16 fd,
SlFdSet_t *fdset)
1071 if( fdset->fd_array[0] & (1<< (fd & SL_BSD_SOCKET_ID_MASK)) )
1080 void SL_SOCKET_FD_ZERO(
SlFdSet_t *fdset)
1082 fdset->fd_array[0] = 0;
1086 #if _SL_INCLUDE_FUNC(sl_Select)
1090 SL_OPCODE_SOCKET_SELECT,
1100 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
1101 #if ((defined(SL_RUNTIME_EVENT_REGISTERATION) || defined(slcb_SocketTriggerEventHandler)))
1102 _u8 IsNonBlocking = FALSE;
1107 VERIFY_API_ALLOWED(SL_OPCODE_SILO_SOCKET);
1109 #if ((defined(SL_RUNTIME_EVENT_REGISTERATION) || defined(slcb_SocketTriggerEventHandler)))
1110 if(1 == _SlIsEventRegistered(SL_EVENT_HDL_SOCKET_TRIGGER))
1112 if( NULL != timeout )
1115 if ( (0 == timeout->tv_sec) && (0 == timeout->tv_usec) )
1117 IsNonBlocking = TRUE;
1121 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1124 if (g_pCB->SocketTriggerSelect.Info.State > SOCK_TRIGGER_READY)
1126 SL_DRV_PROTECTION_OBJ_UNLOCK();
1127 return SL_RET_CODE_SOCKET_SELECT_IN_PROGRESS_ERROR;
1130 SL_DRV_PROTECTION_OBJ_UNLOCK();
1133 if (IsNonBlocking == TRUE)
1136 if (g_pCB->SocketTriggerSelect.Info.State == SOCK_TRIGGER_WAITING_FOR_RESP)
1138 return SL_ERROR_BSD_EAGAIN;
1141 else if (g_pCB->SocketTriggerSelect.Info.State == SOCK_TRIGGER_RESP_RECEIVED)
1144 if( ((_i16)g_pCB->SocketTriggerSelect.Resp.Status) >= 0 )
1148 readsds->fd_array[0] = g_pCB->SocketTriggerSelect.Resp.ReadFds;
1152 writesds->fd_array[0] = g_pCB->SocketTriggerSelect.Resp.WriteFds;
1157 _SlDrvReleasePoolObj(g_pCB->SocketTriggerSelect.Info.ObjPoolIdx);
1159 g_pCB->SocketTriggerSelect.Info.ObjPoolIdx = MAX_CONCURRENT_ACTIONS;
1162 g_pCB->SocketTriggerSelect.Info.State = SOCK_TRIGGER_READY;
1164 return (_i16)g_pCB->SocketTriggerSelect.Resp.Status;
1171 Msg.Cmd.Nfds = (_u8)nfds;
1172 Msg.Cmd.ReadFdsCount = 0;
1173 Msg.Cmd.WriteFdsCount = 0;
1175 Msg.Cmd.ReadFds = 0;
1176 Msg.Cmd.WriteFds = 0;
1181 Msg.Cmd.ReadFds = (_u16)readsds->fd_array[0];
1185 Msg.Cmd.WriteFds = (_u16)writesds->fd_array[0];
1187 if( NULL == timeout )
1189 Msg.Cmd.tv_sec = 0xffff;
1190 Msg.Cmd.tv_usec = 0xffff;
1194 if( 0xffff <= timeout->tv_sec )
1196 Msg.Cmd.tv_sec = 0xffff;
1200 Msg.Cmd.tv_sec = (_u16)timeout->tv_sec;
1204 timeout->tv_usec = timeout->tv_usec >> 10;
1206 if( 0xffff <= timeout->tv_usec )
1208 Msg.Cmd.tv_usec = 0xffff;
1212 Msg.Cmd.tv_usec = (_u16)timeout->tv_usec;
1218 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&AsyncRsp, SELECT_ID, SL_MAX_SOCKETS);
1220 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
1222 return SL_POOL_IS_EMPTY;
1226 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlSelectCmdCtrl, &Msg, NULL));
1228 if(SL_OS_RET_CODE_OK == (_i16)Msg.Rsp.status)
1230 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);
1232 Msg.Rsp.status = (_i16)AsyncRsp.Status;
1236 if(1 == _SlIsEventRegistered(SL_EVENT_HDL_SOCKET_TRIGGER))
1241 if ((IsNonBlocking == TRUE) && (AsyncRsp.Status == 0))
1244 g_pCB->SocketTriggerSelect.Info.State = SOCK_TRIGGER_WAITING_FOR_RESP;
1246 Msg.Cmd.tv_sec = 0xffff;
1247 Msg.Cmd.tv_usec = 0xffff;
1250 _SlDrvReleasePoolObj(ObjIdx);
1253 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8*)&g_pCB->SocketTriggerSelect.Resp, SELECT_ID, SL_MAX_SOCKETS);
1255 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
1257 return SL_POOL_IS_EMPTY;
1261 g_pCB->SocketTriggerSelect.Info.ObjPoolIdx = ObjIdx;
1264 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlSelectCmdCtrl, &Msg, NULL));
1265 return SL_ERROR_BSD_EAGAIN;
1271 if( ((_i16)Msg.Rsp.status) >= 0 )
1275 readsds->fd_array[0] = AsyncRsp.ReadFds;
1279 writesds->fd_array[0] = AsyncRsp.WriteFds;
1284 _SlDrvReleasePoolObj(ObjIdx);
1285 return (_i16)Msg.Rsp.status;
_i16 sl_Bind(_i16 sd, const SlSockAddr_t *addr, _i16 addrlen)
Assign a name to a socket.
_u32 sl_Htonl(_u32 val)
Reorder the bytes of a 32-bit unsigned value.
_i16 sl_Select(_i16 nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, struct SlTimeval_t *timeout)
Monitor socket activity.
void slcb_SocketTriggerEventHandler(SlSockTriggerEvent_t *pSlSockTriggerEvent)
Socket trigger routine. This routine will notify the application that a netwrok activity has been com...
_i16 sl_SetSockOpt(_i16 sd, _i16 level, _i16 optname, const void *optval, SlSocklen_t optlen)
Set socket options-.
_u16 sl_Htons(_u16 val)
Reorder the bytes of a 16-bit unsigned value.
_i16 sl_Close(_i16 sd)
Gracefully close socket.
_i16 sl_Recv(_i16 sd, void *pBuf, _i16 Len, _i16 flags)
Read data from TCP socket.
_i16 sl_GetSockOpt(_i16 sd, _i16 level, _i16 optname, void *optval, SlSocklen_t *optlen)
Get socket options.
_i16 sl_Socket(_i16 Domain, _i16 Type, _i16 Protocol)
Create an endpoint for communication.
_i16 sl_RecvFrom(_i16 sd, void *buf, _i16 Len, _i16 flags, SlSockAddr_t *from, SlSocklen_t *fromlen)
Read data from socket.
_i16 sl_Accept(_i16 sd, SlSockAddr_t *addr, SlSocklen_t *addrlen)
Accept a connection on a socket.
_i16 sl_Connect(_i16 sd, const SlSockAddr_t *addr, _i16 addrlen)
Initiate a connection on a socket.
_i16 sl_Listen(_i16 sd, _i16 backlog)
Listen for connections on a socket.
_i16 sl_SendTo(_i16 sd, const void *pBuf, _i16 Len, _i16 flags, const SlSockAddr_t *to, SlSocklen_t tolen)
Write data to socket.
_i16 sl_Send(_i16 sd, const void *pBuf, _i16 Len, _i16 flags)
Write data to TCP socket.