WIFI_API_20150524e
Diff: WIFI_Driver/nmc/socket_nmc.h
- Revision:
- 0:a2de37bf5f3d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nmc/socket_nmc.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,759 @@ +/* +@file + socket.h + +@brief Socket Interface APIs + + The file defines APIs and types of socket layer for the NMC1500 IoT solution. The APIs are very similar + to the standard POSIX sockets APIs. The socket layer operates in asynchronus mode which means socket + functions are non-blocking functions, requiring the result of a socket operation (eg. bind) is delivered later + in a callback function [APPSocketEventHandler](@ref APPSocketEventHandler). +*/ +#ifndef __SOCKET_NMC_H__ +#define __SOCKET_NMC_H__ + +#include "nmi_wlan_if.h" +#include "nmi_wlan.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +//#include "common\include\nm_common.h" + +#define NMI_API + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#define HOSTNAME_MAX_SIZE 64 +/*< Maximum allowed size for a host domain name. +*/ + + + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*< Maximum allowed size for a socket Data buffer. +*/ + + +#define AF_INET 2 +/*< Supported socket family. +*/ + + +#define SOCK_STREAM 1 +/*< This is the identifier of TCP socket type. +*/ + + +#define SOCK_DGRAM 2 +/*< This is the identifier of UDP socket type. +*/ + + +#define SOCKET_FLAGS_SSL 0x01 +/*< This flag shall be passed to the + socket API for SSL session. +*/ + + +#define TCP_SOCK_MAX 2//(7) +/*< Maximum number of simultaneous TCP sockets. +*/ + + +#define UDP_SOCK_MAX 2//4 +/*< Maximum number of simultaneous UDP sockets. +*/ + + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*< Maximum number of Sockets. +*/ + + +/************** +Socket Errors +**************/ + +#define SOCK_ERR_NO_ERROR 0 +/*< Every thing is OK. +*/ + + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*< Socket address is invalid. The socket operation cannot + be completed without address is specified. For example, + Bind is called without specifying a port number. +*/ + + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*< Cannot bind on the given address. It is already bound + by another opened socket. +*/ + + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*< The maximum number of TCP sockets is reached. Socket + creation failed. +*/ + + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*< The maximum number of UDP sockets is reached. Socket + creation failed. +*/ + + +#define SOCK_ERR_INVALID_ARG -6 +/*< An invalid arguement is passed to a function. +*/ + + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*< The maximum number of TCP passive listening sockets is + reached. Listen function fails. +*/ + + +#define SOCK_ERR_INVALID -9 +/*< The requested socket operation is not valid in the + current socket state. For Example, accept is called on a + TCP socket before bind or listen. +*/ + + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*< The socket address is required for the operation to + be completed. It is generated from sendto when there is + no valid address found to send the data to. +*/ + + +#define SOCK_ERR_CONN_ABORTED -12 +/*< The socket is closed by the peer. The local socket is + closed also. +*/ + + +#define SOCK_ERR_TIMEOUT -13 +/*< The socket pending operation has been timedout. +*/ + + +#define SOCK_ERR_BUFFER_FULL -14 +/*< The send operation could not be performed before the + transmission buffer corresponding to this socket is busy. +*/ + +#ifndef _NM_BSP_BIG_END + +#define _htonl(m) (m) +#define _htons(A) (A) + +#else + +#define _htonl(m) \ + (uint32)(((uint32)(m << 24)) | ((uint32)((m & 0x0000FF00) << 8)) | ((uint32)((m & 0x00FF0000) >> 8)) | ((uint32)(m >> 24))) +/*< Convert a 4-byte integer from the host representation to the Network byte order representation. +*/ + + +#define _htons(A) (uint16)((((uint16) (A)) << 8) | (((uint16) (A)) >> 8)) +/*< Convert a 2-byte integer (short) from the host representation to the Network byte order representation. +*/ + + +#endif + + +#define _ntohl _htonl +/*< Convert a 4-byte integer from the Network byte order representation to the host representation . +*/ + + +#define _ntohs _htons +/*< Convert a 2-byte integer from the Network byte order representation to the host representation . +*/ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/* +@typedef \ + SOCKET + +@brief + Data type definition for socket handlers. +*/ +typedef sint8 SOCKET; + + +/* +@struct \ + in_addr + +@brief + IPv4 address representation. +*/ +typedef struct{ + uint32 s_addr; + /*< Network Byte Order representation of the IPv4 address. + */ +}in_addr_nmc;//Tsungta + + +/* +@struct \ + sockaddr + +@brief + Generic socket address structure. +*/ +struct sockaddr{ + uint16 sa_family; + uint8 sa_data[14]; +}; + + +/* +@struct \ + sockaddr_in + +@brief + Socket address structure for IPV4 addresses. +*/ +struct sockaddr_in_nmc{//Tsungta + uint16 sin_family; + /*< The only supported value for this is AF_INET. + */ + uint16 sin_port; + /*< Port number of the socket address. It must be set in the + Network Byte Order format (e.g. _htons(80)). + */ + in_addr_nmc sin_addr; //Tsungta + /*< IP Address [in_addr]. + */ + uint8 sin_zero[8]; + /*< Dummy bytes. + */ +}; + + +/******************************************* +Specific Definitions for Asynchronous implementation +*******************************************/ + +/* +@enum \ + tenuSocketCallbackMsgType + +@brief + Socket message types for socket callback notifications. +*/ +typedef enum{ + SOCKET_MSG_BIND = 1, + SOCKET_MSG_LISTEN, + SOCKET_MSG_DNS_RESOLVE, + SOCKET_MSG_ACCEPT, + SOCKET_MSG_CONNECT, + SOCKET_MSG_RECV, + SOCKET_MSG_SEND, + SOCKET_MSG_SENDTO, + SOCKET_MSG_RECVFROM, + SOCKET_MSG_DHCP_OFFER, + SOCKET_MSG_TCPERROR +}tenuSocketCallbackMsgType; + +/* +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_BIND message type + in a response to a user call to bind. +*/ +typedef struct{ + sint8 status; + /*< The result of the bind operation. + */ +}tstrSocketBindMsg; + + +/* +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_LISTEN message type + in a response to a user call to listen. +*/ +typedef struct{ + sint8 status; + /*< Result of the listen operation. + */ +}tstrSocketListenMsg; + + + +/* +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_ACCEPT message type + in a response to a user call to accept. +*/ +typedef struct{ + SOCKET sock; + /*< Socket ID for the accepted connection with a remote peer. If it is a negative value, it refers to + an accept error (accept failed). + */ + struct sockaddr_in_nmc strAddr;//Tsungta + /*< Socket address structure for the remote peer. + */ +}tstrSocketAcceptMsg; + + +/* +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_CONNECT message type + in a response to a user call to connect. +*/ +typedef struct{ + SOCKET sock; + /*< Socket ID referring to the socket passed to the connect function call. + */ + sint8 s8Error; + /*< Connect error code. It shall be ZERO for successful connect and a negative number otherwise. + */ +}tstrSocketConnectMsg; + + +/* +@struct \ + tstrSocketTCPErrorMsg + +@brief Socket connect status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_TCPERROR message type + in a response for TCP socket error. +*/ +typedef struct{ + SOCKET sock; + /*< Socket ID referring to the socket passed to the TCP socket control function call. + */ + sint8 s8Error; + /*< Connect error code. TCP socket handling errors. + */ +}tstrSocketTCPErrorMsg; + +/* +@struct \ + + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct{ + uint8 *pu8Buffer; + /*< Pointer to the USER buffer (passed to recv or recvfrom) containing a received data chunk. + */ + sint16 s16BufferSize; + /*< The recevied data chunk size. It will be negative value if there is a recv error. + */ + uint16 u16RemainingSize; + /*< The number of bytes remaining in the current recv operation. + */ + struct sockaddr_in_nmc strRemoteAddr;//Tsungta + /*< Socket address structure for the remote peer. + */ +}tstrSocketRecvMsg; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/* +@fn \ + NMI_API void socketInit(void); + +@brief Socket Layer Initialization + + The function performs the necessary initializations for the socket library. + It must be invoked before any socket operation is performed. +*/ +NMI_API void socketInit(void); + + +/* +@fn \ + NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + +@brief + Creates a socket with a given type. + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + +@param [in] u8Flags + Used to specify the socket creation flags. It shall be set to zero for normal TCP/UDP sockets. + If could be SOCKET_FLAGS_SSL if the socket is used for SSL session. The use of the flag + [SOCKET_FLAGS_SSL](@ref SOCKET_FLAGS_SSL) has no meaning in case of UDP sockets. + +@return + The function shall return a negative value for socket creation failed and a nonnegative value + representing the socket ID otherwise. +*/ +NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + + +/* +@fn \ + NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +@brief + Binds a socket on a local port. + +@param [in] sock + Socket ID. + +@param [in] pstrAddr + Socket address for the address to be bound. + +@param [in] u8AddrLen + Size of the given address in bytes. + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + + +/* +@fn \ + NMI_API sint8 listen(SOCKET sock, uint8 backlog); + +@brief + Start listening on a passive socket for incoming connections. The socket must be bound on a local port + or the listen fails. The listen function must be called at receiving [SOCKET_MSG_BIND](@ref SOCKET_MSG_BIND) + in the socket callback. + +@param [in] sock + Socket ID. + +@param [in] backlog + Number of maximum allowed connections that will be accepted on the given socket. + It is not used by the current implementation. + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 listen(SOCKET sock, uint8 backlog); + + +/* +@fn \ + NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); + +@brief + Retrieve a successful connection . + +@param [in] sock + Socket ID. + +@param [in] addr + It is not used in the current implementation. + +@param [in] addrlen + It is not used in the current implementation. + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); + + +/* +@fn \ + NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +@brief + Establishes a TCP connection with a remote server. + +@param [in] sock + Socket ID. + +@param [in] pstrAddr + Address of the remote server. + +@param [in] u8AddrLen + Address length in bytes. + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + + +/* +@fn \ + NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds); + +@brief + Recieves data from a TCP Scoket. + +@param [in] sock + Socket handler. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error in the function + [APPSocketEventHandler](@ref APPSocketEventHandler). + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); + + +/* +@fn \ + NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds); + +@brief + Recieves data from a UDP Scoket. + +@param [in] sock + Socket handler. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); + + +/* +@fn \ + NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); + +@brief + Sends data on a TCP Scoket. + +@param [in] sock + Socket handler. + +@param [in] pvSendBuffer + Pointer to a buffer that holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. It must not exceed [SOCKET_BUFFER_MAX_LENGTH](@ref SOCKET_BUFFER_MAX_LENGTH). + +@param [in] u16Flags + It is not used in the current implementation + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint16 send_nmc(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); + + +/* +@fn \ + NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen); + +@brief + Sends data on a UDP Scoket. + +@param [in] sock + Socket handler. + +@param [in] pvSendBuffer + Pointer to a buffer that holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. It must not exceed [SOCKET_BUFFER_MAX_LENGTH](@ref SOCKET_BUFFER_MAX_LENGTH). + +@param [in] flags + It is not used in the current implementation + +@param [in] pstrDestAddr + The destination address. + +@param [in] u8AddrLen + Destination address length in bytes. + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen); + + +/* +@fn \ + NMI_API sint8 close(SOCKET sock); + +@brief + Closes a socket. + +@param [in] sock + Socket handler. + +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 close_nmc(SOCKET sock); + + +/* +@fn \ + NMI_API sint8 gethostbyname(uint8 * pcHostName); + +@brief + Use DNS to resolve a domain name into the corresponding IP Address. + +@param [in] pcHostName + NULL terminated string containing the domain name for the remote host. + Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint8 gethostbyname(uint8 * pcHostName); + + +/* +@fn \ + NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + +@brief + Convert the IPv4 from the dotted decimal notation to an integer represented in Network Byte Order. + +@param [in] pcIpAddr + NULL terminated string containing the dotted decimal notation for an IP "a.b.c.d". + +@return + The integer representation of the IPv4 address in network byte order. +*/ +NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + + +/* +@fn \ + NMI_API void APPSocketEventHandler(SOCKET sock, uint8 u8Msg, void * pvMsg); + +@brief Socket Callback Function + + A function used by the socket layer to convey a socket operation callback to the user. This function MUST be + implemeneted by the application developer. + +@param [in] sock + Socket ID. + +@param [in] u8Msg + Socket message type [tenuSocketCallbackMsgType](@ref tenuSocketCallbackMsgType). + +@param [in] pvMsg + Msg parameters corresponding to the message type. + +@sa tstrSocketBindMsg + tstrSocketListenMsg + tstrSocketAcceptMsg + tstrSocketConnectMsg + tstrSocketRecvMsg +*/ +NMI_API void APPSocketEventHandler(SOCKET sock, uint8 u8Msg, void * pvMsg); + + +/* +@fn \ + NMI_API void AppServerCb(uint8* pu8DomainName, uint32 u32ServerIP); + +@brief + DNS host name resolution callback. + +@param [in] pu8DomainName + NULL terminated string containing the Domain name of a host (eg. "www.Google.com"). + +@param [in] u32ServerIP + IP Address corresponding to the domain name. It is formatted in network byte order. +*/ +NMI_API void AppServerCb(uint8* pu8DomainName, uint32 u32ServerIP); + +//Ryan +typedef void (*tf_APPSocketEventHandler)(SOCKET sock, uint8 u8Msg, void * pvMsg); + +NMI_API void m2m_set_app(tf_APPSocketEventHandler str); + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr)) + +/* +* @struct tstrHifHdr +* @brief Structure to hold HIF header +* @author Mahfouz Sheref +* @version 1.0 +*/ +typedef struct +{ + uint8 u8Gid; /*< Group ID */ + uint8 u8Opcode; /*< OP code */ + uint16 u16Length; /*< Payload length */ +}tstrHifHdr; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */