simplelink: net: import SlNetSock

Bring in SlNetSock and its associated modules from the TI CC32xx
SimpleLink SDK 4.10.00.07. SlNetSock is a module that implements a
higher-level, BSD-socket-like abstraction that has the ability to
support multiple network interfaces. When used on top of the native
SimpleLink WiFi Host Driver API, it provides extra network-related
functionality such as getaddrinfo(), which is necessary for addressing
zephyrproject-rtos/zephyr#11890

Origin: Texas Instruments cc32xx SimpleLink SDK
License: BSD 3-Clause
URL: http://www.ti.com/tool/download/simplelink-cc32xx-sdk
Purpose: Provide access to SlNetSock functions for TI CC32XX SoC
Maintained-by: External

Signed-off-by: Vincent Wan <vwan@ti.com>
This commit is contained in:
Vincent Wan 2020-08-04 15:33:09 -07:00 committed by Carles Cufí
parent b84ad97802
commit 13267bea30
9 changed files with 7644 additions and 0 deletions

View File

@ -37,6 +37,10 @@ if(CONFIG_HAS_CC3220SDK)
source/ti/drivers/net/wifi/porting/cc_pal.c
source/ti/drivers/net/wifi/eventreg.c
source/ti/drivers/net/wifi/source/sl_socket.c
source/ti/drivers/net/wifi/slnetif/slnetifwifi.c
source/ti/net/slnetif.c
source/ti/net/slnetsock.c
source/ti/net/slnetutils.c
source/ti/devices/cc32xx/driverlib/timer.c
source/ti/devices/cc32xx/driverlib/udma.c

View File

@ -0,0 +1,80 @@
/*
* Copyright (c) 2019, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __SL_NET_H__
#define __SL_NET_H__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*!
\defgroup SlNet SlNet group
\short Interface for general SlNet services.
*/
/*!
\addtogroup SlNet
@{
*/
/*****************************************************************************/
/* Function prototypes */
/*****************************************************************************/
/*!
\brief Prototype for SysConfig generated initialization function that
initializes various parts of the NS stack based on the user's SysConfig
script. This function should be called after the lower network stacks
initialize. Non-SysConfig users can provide their own implementation of
this function in their application's source code.
\return Zero on success, or negative error code on failure
*/
int32_t ti_net_SlNet_initConfig();
/*!
Close the Doxygen group.
@}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __SL_NET_H__ */

View File

@ -0,0 +1,700 @@
/*
* Copyright (c) 2017-2019, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*****************************************************************************/
/* Include files */
/*****************************************************************************/
#ifndef __SL_NET_ERR_H__
#define __SL_NET_ERR_H__
#ifdef __cplusplus
extern "C" {
#endif
/*!
\defgroup SlNetErr SlNetErr group
\short Provide BSD and proprietary errors
*/
/*!
\addtogroup SlNetErr
@{
*/
/*****************************************************************************/
/* Macro declarations */
/*****************************************************************************/
#define SLNETERR_RET_CODE_OK (0L) /**< Success */
#define SLNETERR_GENERAL_DEVICE (-6L) /**< General device error */
/* BSD SOCKET ERRORS CODES */
#define SLNETERR_BSD_SOC_ERROR (-1L) /**< Failure */
#define SLNETERR_BSD_ENXIO (-6L) /**< No such device or address */
#define SLNETERR_BSD_INEXE (-8L) /**< socket command in execution */
#define SLNETERR_BSD_EBADF (-9L) /**< Bad file number */
#define SLNETERR_BSD_ENSOCK (-10L) /**< The system limit on the total number of open sockets, has been reached */
#define SLNETERR_BSD_EAGAIN (-11L) /**< Try again */
#define SLNETERR_BSD_EWOULDBLOCK SLNETERR_BSD_EAGAIN
#define SLNETERR_BSD_ENOMEM (-12L) /**< Out of memory */
#define SLNETERR_BSD_EACCES (-13L) /**< Permission denied */
#define SLNETERR_BSD_EFAULT (-14L) /**< Bad address */
#define SLNETERR_BSD_ECLOSE (-15L) /**< close socket operation failed to transmit all queued packets */
#define SLNETERR_BSD_EALREADY_ENABLED (-21L) /**< Transceiver - Transceiver already ON. there could be only one */
#define SLNETERR_BSD_EINVAL (-22L) /**< Invalid argument */
#define SLNETERR_BSD_EAUTO_CONNECT_OR_CONNECTING (-69L) /**< Transceiver - During connection, connected or auto mode started */
#define SLNETERR_BSD_CONNECTION_PENDING (-72L) /**< Transceiver - Device is connected, disconnect first to open transceiver */
#define SLNETERR_BSD_EUNSUPPORTED_ROLE (-86L) /**< Transceiver - Trying to start when WLAN role is AP or P2P GO */
#define SLNETERR_BSD_ENOTSOCK (-88L) /**< Socket operation on non-socket */
#define SLNETERR_BSD_EDESTADDRREQ (-89L) /**< Destination address required */
#define SLNETERR_BSD_EMSGSIZE (-90L) /**< Message too long */
#define SLNETERR_BSD_EPROTOTYPE (-91L) /**< Protocol wrong type for socket */
#define SLNETERR_BSD_ENOPROTOOPT (-92L) /**< Protocol not available */
#define SLNETERR_BSD_EPROTONOSUPPORT (-93L) /**< Protocol not supported */
#define SLNETERR_BSD_ESOCKTNOSUPPORT (-94L) /**< Socket type not supported */
#define SLNETERR_BSD_EOPNOTSUPP (-95L) /**< Operation not supported on transport endpoint */
#define SLNETERR_BSD_EAFNOSUPPORT (-97L) /**< Address family not supported by protocol */
#define SLNETERR_BSD_EADDRINUSE (-98L) /**< Address already in use */
#define SLNETERR_BSD_EADDRNOTAVAIL (-99L) /**< Cannot assign requested address */
#define SLNETERR_BSD_ENETDOWN (-100L) /**< Network is down */
#define SLNETERR_BSD_ENETUNREACH (-101L) /**< Network is unreachable */
#define SLNETERR_BSD_ECONNABORTED (-103L) /**< Software caused connection abort */
#define SLNETERR_BSD_ECONNRESET (-104L) /**< Connection reset by peer */
#define SLNETERR_BSD_ENOBUFS (-105L) /**< No buffer space available */
#define SLNETERR_BSD_EOBUFF SLNETERR_BSD_ENOBUFS
#define SLNETERR_BSD_EISCONN (-106L) /**< Transport endpoint is already connected */
#define SLNETERR_BSD_ENOTCONN (-107L) /**< Transport endpoint is not connected */
#define SLNETERR_BSD_ESHUTDOWN (-108L) /**< Cannot send after transport endpoint shutdown */
#define SLNETERR_BSD_ETIMEDOUT (-110L) /**< Connection timed out */
#define SLNETERR_BSD_ECONNREFUSED (-111L) /**< Connection refused */
#define SLNETERR_BSD_EHOSTDOWN (-112L) /**< Host is down */
#define SLNETERR_BSD_EHOSTUNREACH (-113L) /**< No route to host */
#define SLNETERR_BSD_EALREADY (-114L) /**< Non blocking connect in progress, try again */
#define SLNETERR_BSD_EDOM (-115L) /**< Mathematics argument out of domain of function. */
#define SLNETERR_BSD_ENOSPC (-116L) /**< No space left on device. */
/* ssl tls security start with -300 offset */
#define SLNETERR_ESEC_CLOSE_NOTIFY (-300L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_UNEXPECTED_MESSAGE (-310L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_BAD_RECORD_MAC (-320L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_DECRYPTION_FAILED (-321L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_RECORD_OVERFLOW (-322L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_DECOMPRESSION_FAILURE (-330L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_HANDSHAKE_FAILURE (-340L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_NO_CERTIFICATE (-341L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_BAD_CERTIFICATE (-342L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_UNSUPPORTED_CERTIFICATE (-343L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_ILLEGAL_PARAMETER (-347L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_ACCESS_DENIED (-349L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_DECODE_ERROR (-350L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_DECRYPT_ERROR1 (-351L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_EXPORT_RESTRICTION (-360L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_PROTOCOL_VERSION (-370L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_INSUFFICIENT_SECURITY (-371L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_INTERNAL_ERROR (-380L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_USER_CANCELLED (-390L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_NO_RENEGOTIATION (-400L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_UNSUPPORTED_EXTENSION (-410L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_CERTIFICATE_UNOBTAINABLE (-411L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_UNRECOGNIZED_NAME (-412L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_BAD_CERTIFICATE_STATUS_RESPONSE (-413L) /**< ssl/tls alerts */
#define SLNETERR_ESEC_BAD_CERTIFICATE_HASH_VALUE (-414L) /**< ssl/tls alerts */
/* proprietary secure */
#define SLNETERR_ESEC_GENERAL (-450L) /**< error secure level general error */
#define SLNETERR_ESEC_DECRYPT (-451L) /**< error secure level, decrypt recv packet fail */
#define SLNETERR_ESEC_CLOSED (-452L) /**< secure layer is closed by other side, tcp is still connected */
#define SLNETERR_ESEC_SNO_VERIFY (-453L) /**< Connected without server verification */
#define SLNETERR_ESEC_NO_CA_FILE (-454L) /**< error secure level CA file not found */
#define SLNETERR_ESEC_MEMORY (-455L) /**< error secure level No memory space available */
#define SLNETERR_ESEC_BAD_CA_FILE (-456L) /**< error secure level bad CA file */
#define SLNETERR_ESEC_BAD_CERT_FILE (-457L) /**< error secure level bad Certificate file */
#define SLNETERR_ESEC_BAD_PRIVATE_FILE (-458L) /**< error secure level bad private file */
#define SLNETERR_ESEC_BAD_DH_FILE (-459L) /**< error secure level bad DH file */
#define SLNETERR_ESEC_T00_MANY_SSL_OPENED (-460L) /**< MAX SSL Sockets are opened */
#define SLNETERR_ESEC_DATE_ERROR (-461L) /**< connected with certificate date verification error */
#define SLNETERR_ESEC_HAND_SHAKE_TIMED_OUT (-462L) /**< connection timed out due to handshake time */
#define SLNETERR_ESEC_TX_BUFFER_NOT_EMPTY (-463L) /**< cannot start ssl connection while send buffer is full */
#define SLNETERR_ESEC_RX_BUFFER_NOT_EMPTY (-464L) /**< cannot start ssl connection while recv buffer is full */
#define SLNETERR_ESEC_SSL_DURING_HAND_SHAKE (-465L) /**< cannot use while in handshaking */
#define SLNETERR_ESEC_NOT_ALLOWED_WHEN_LISTENING (-466L) /**< the operation is not allowed when listening, do before listen */
#define SLNETERR_ESEC_CERTIFICATE_REVOKED (-467L) /**< connected but one of the certificates in the chain is revoked */
#define SLNETERR_ESEC_UNKNOWN_ROOT_CA (-468L) /**< connected but the root CA used to validate the peer is unknown */
#define SLNETERR_ESEC_WRONG_PEER_CERT (-469L) /**< wrong peer cert (server cert) was received while trying to connect to server */
#define SLNETERR_ESEC_TCP_DISCONNECTED_UNCOMPLETE_RECORD (-470L) /**< the other side disconnected the TCP layer and didn't send the whole ssl record */
#define SLNETERR_ESEC_HELLO_VERIFY_ERROR (-471L) /**< Hello verification failed in DTLS */
#define SLNETERR_ESEC_BUFFER_E (-632L) /**< output buffer too small or input too large */
#define SLNETERR_ESEC_ALGO_ID_E (-633L) /**< setting algo id error */
#define SLNETERR_ESEC_PUBLIC_KEY_E (-634L) /**< setting public key error */
#define SLNETERR_ESEC_DATE_E (-635L) /**< setting date validity error */
#define SLNETERR_ESEC_SUBJECT_E (-636L) /**< setting subject name error */
#define SLNETERR_ESEC_ISSUER_E (-637L) /**< setting issuer name error */
#define SLNETERR_ESEC_CA_TRUE_E (-638L) /**< setting CA basic constraint true error */
#define SLNETERR_ESEC_EXTENSIONS_E (-639L) /**< setting extensions error */
#define SLNETERR_ESEC_ASN_PARSE_E (-640L) /**< ASN parsing error, invalid input */
#define SLNETERR_ESEC_ASN_VERSION_E (-641L) /**< ASN version error, invalid number */
#define SLNETERR_ESEC_ASN_GETINT_E (-642L) /**< ASN get big int error, invalid data */
#define SLNETERR_ESEC_ASN_RSA_KEY_E (-643L) /**< ASN key init error, invalid input */
#define SLNETERR_ESEC_ASN_OBJECT_ID_E (-644L) /**< ASN object id error, invalid id */
#define SLNETERR_ESEC_ASN_TAG_NULL_E (-645L) /**< ASN tag error, not null */
#define SLNETERR_ESEC_ASN_EXPECT_0_E (-646L) /**< ASN expect error, not zero */
#define SLNETERR_ESEC_ASN_BITSTR_E (-647L) /**< ASN bit string error, wrong id */
#define SLNETERR_ESEC_ASN_UNKNOWN_OID_E (-648L) /**< ASN oid error, unknown sum id */
#define SLNETERR_ESEC_ASN_DATE_SZ_E (-649L) /**< ASN date error, bad size */
#define SLNETERR_ESEC_ASN_BEFORE_DATE_E (-650L) /**< ASN date error, current date before */
#define SLNETERR_ESEC_ASN_AFTER_DATE_E (-651L) /**< ASN date error, current date after */
#define SLNETERR_ESEC_ASN_SIG_OID_E (-652L) /**< ASN signature error, mismatched oid */
#define SLNETERR_ESEC_ASN_TIME_E (-653L) /**< ASN time error, unknown time type */
#define SLNETERR_ESEC_ASN_INPUT_E (-654L) /**< ASN input error, not enough data */
#define SLNETERR_ESEC_ASN_SIG_CONFIRM_E (-655L) /**< ASN sig error, confirm failure */
#define SLNETERR_ESEC_ASN_SIG_HASH_E (-656L) /**< ASN sig error, unsupported hash type */
#define SLNETERR_ESEC_ASN_SIG_KEY_E (-657L) /**< ASN sig error, unsupported key type */
#define SLNETERR_ESEC_ASN_DH_KEY_E (-658L) /**< ASN key init error, invalid input */
#define SLNETERR_ESEC_ASN_NTRU_KEY_E (-659L) /**< ASN ntru key decode error, invalid input */
#define SLNETERR_ESEC_ASN_CRIT_EXT_E (-660L) /**< ASN unsupported critical extension */
#define SLNETERR_ESEC_ECC_BAD_ARG_E (-670L) /**< ECC input argument of wrong type */
#define SLNETERR_ESEC_ASN_ECC_KEY_E (-671L) /**< ASN ECC bad input */
#define SLNETERR_ESEC_ECC_CURVE_OID_E (-672L) /**< Unsupported ECC OID curve type */
#define SLNETERR_ESEC_BAD_FUNC_ARG (-673L) /**< Bad function argument provided */
#define SLNETERR_ESEC_NOT_COMPILED_IN (-674L) /**< Feature not compiled in */
#define SLNETERR_ESEC_UNICODE_SIZE_E (-675L) /**< Unicode password too big */
#define SLNETERR_ESEC_NO_PASSWORD (-676L) /**< no password provided by user */
#define SLNETERR_ESEC_ALT_NAME_E (-677L) /**< alt name size problem, too big */
#define SLNETERR_ESEC_ASN_NO_SIGNER_E (-688L) /**< ASN no signer to confirm failure */
#define SLNETERR_ESEC_ASN_CRL_CONFIRM_E (-689L) /**< ASN CRL signature confirm failure */
#define SLNETERR_ESEC_ASN_CRL_NO_SIGNER_E (-690L) /**< ASN CRL no signer to confirm failure */
#define SLNETERR_ESEC_ASN_OCSP_CONFIRM_E (-691L) /**< ASN OCSP signature confirm failure */
#define SLNETERR_ESEC_VERIFY_FINISHED_ERROR (-704L) /**< verify problem on finished */
#define SLNETERR_ESEC_VERIFY_MAC_ERROR (-705L) /**< verify mac problem */
#define SLNETERR_ESEC_PARSE_ERROR (-706L) /**< parse error on header */
#define SLNETERR_ESEC_UNKNOWN_HANDSHAKE_TYPE (-707L) /**< weird handshake type */
#define SLNETERR_ESEC_SOCKET_ERROR_E (-708L) /**< error state on socket */
#define SLNETERR_ESEC_SOCKET_NODATA (-709L) /**< expected data, not there */
#define SLNETERR_ESEC_INCOMPLETE_DATA (-710L) /**< don't have enough data to complete task */
#define SLNETERR_ESEC_UNKNOWN_RECORD_TYPE (-711L) /**< unknown type in record hdr */
#define SLNETERR_ESEC_INNER_DECRYPT_ERROR (-712L) /**< error during decryption */
#define SLNETERR_ESEC_FATAL_ERROR (-713L) /**< recvd alert fatal error */
#define SLNETERR_ESEC_ENCRYPT_ERROR (-714L) /**< error during encryption */
#define SLNETERR_ESEC_FREAD_ERROR (-715L) /**< fread problem */
#define SLNETERR_ESEC_NO_PEER_KEY (-716L) /**< need peer's key */
#define SLNETERR_ESEC_NO_PRIVATE_KEY (-717L) /**< need the private key */
#define SLNETERR_ESEC_RSA_PRIVATE_ERROR (-718L) /**< error during rsa priv op */
#define SLNETERR_ESEC_NO_DH_PARAMS (-719L) /**< server missing DH params */
#define SLNETERR_ESEC_BUILD_MSG_ERROR (-720L) /**< build message failure */
#define SLNETERR_ESEC_BAD_HELLO (-721L) /**< client hello malformed */
#define SLNETERR_ESEC_DOMAIN_NAME_MISMATCH (-722L) /**< peer subject name mismatch */
#define SLNETERR_ESEC_WANT_READ (-723L) /**< want read, call again */
#define SLNETERR_ESEC_NOT_READY_ERROR (-724L) /**< handshake layer not ready */
#define SLNETERR_ESEC_PMS_VERSION_ERROR (-725L) /**< pre m secret version error */
#define SLNETERR_ESEC_WANT_WRITE (-727L) /**< want write, call again */
#define SLNETERR_ESEC_BUFFER_ERROR (-728L) /**< malformed buffer input */
#define SLNETERR_ESEC_VERIFY_CERT_ERROR (-729L) /**< verify cert error */
#define SLNETERR_ESEC_VERIFY_SIGN_ERROR (-730L) /**< verify sign error */
#define SLNETERR_ESEC_LENGTH_ERROR (-741L) /**< record layer length error */
#define SLNETERR_ESEC_PEER_KEY_ERROR (-742L) /**< can't decode peer key */
#define SLNETERR_ESEC_ZERO_RETURN (-743L) /**< peer sent close notify */
#define SLNETERR_ESEC_SIDE_ERROR (-744L) /**< wrong client/server type */
#define SLNETERR_ESEC_NO_PEER_CERT (-745L) /**< peer didn't send key */
#define SLNETERR_ESEC_ECC_CURVETYPE_ERROR (-750L) /**< Bad ECC Curve Type */
#define SLNETERR_ESEC_ECC_CURVE_ERROR (-751L) /**< Bad ECC Curve */
#define SLNETERR_ESEC_ECC_PEERKEY_ERROR (-752L) /**< Bad Peer ECC Key */
#define SLNETERR_ESEC_ECC_MAKEKEY_ERROR (-753L) /**< Bad Make ECC Key */
#define SLNETERR_ESEC_ECC_EXPORT_ERROR (-754L) /**< Bad ECC Export Key */
#define SLNETERR_ESEC_ECC_SHARED_ERROR (-755L) /**< Bad ECC Shared Secret */
#define SLNETERR_ESEC_NOT_CA_ERROR (-757L) /**< Not a CA cert error */
#define SLNETERR_ESEC_BAD_PATH_ERROR (-758L) /**< Bad path for opendir */
#define SLNETERR_ESEC_BAD_CERT_MANAGER_ERROR (-759L) /**< Bad Cert Manager */
#define SLNETERR_ESEC_OCSP_CERT_REVOKED (-760L) /**< OCSP Certificate revoked */
#define SLNETERR_ESEC_CRL_CERT_REVOKED (-761L) /**< CRL Certificate revoked */
#define SLNETERR_ESEC_CRL_MISSING (-762L) /**< CRL Not loaded */
#define SLNETERR_ESEC_MONITOR_RUNNING_E (-763L) /**< CRL Monitor already running */
#define SLNETERR_ESEC_THREAD_CREATE_E (-764L) /**< Thread Create Error */
#define SLNETERR_ESEC_OCSP_NEED_URL (-765L) /**< OCSP need an URL for lookup */
#define SLNETERR_ESEC_OCSP_CERT_UNKNOWN (-766L) /**< OCSP responder doesn't know */
#define SLNETERR_ESEC_OCSP_LOOKUP_FAIL (-767L) /**< OCSP lookup not successful */
#define SLNETERR_ESEC_MAX_CHAIN_ERROR (-768L) /**< max chain depth exceeded */
#define SLNETERR_ESEC_NO_PEER_VERIFY (-778L) /**< Need peer cert verify Error */
#define SLNETERR_ESEC_UNSUPPORTED_SUITE (-790L) /**< unsupported cipher suite */
#define SLNETERR_ESEC_MATCH_SUITE_ERROR (-791L) /**< can't match cipher suite */
/* WLAN ERRORS CODES*/
#define SLNETERR_WLAN_KEY_ERROR (-2049L)
#define SLNETERR_WLAN_INVALID_ROLE (-2050L)
#define SLNETERR_WLAN_PREFERRED_NETWORKS_FILE_LOAD_FAILED (-2051L)
#define SLNETERR_WLAN_CANNOT_CONFIG_SCAN_DURING_PROVISIONING (-2052L)
#define SLNETERR_WLAN_INVALID_SECURITY_TYPE (-2054L)
#define SLNETERR_WLAN_PASSPHRASE_TOO_LONG (-2055L)
#define SLNETERR_WLAN_EAP_WRONG_METHOD (-2057L)
#define SLNETERR_WLAN_PASSWORD_ERROR (-2058L)
#define SLNETERR_WLAN_EAP_ANONYMOUS_LEN_ERROR (-2059L)
#define SLNETERR_WLAN_SSID_LEN_ERROR (-2060L)
#define SLNETERR_WLAN_USER_ID_LEN_ERROR (-2061L)
#define SLNETERR_WLAN_PREFERRED_NETWORK_LIST_FULL (-2062L)
#define SLNETERR_WLAN_PREFERRED_NETWORKS_FILE_WRITE_FAILED (-2063L)
#define SLNETERR_WLAN_ILLEGAL_WEP_KEY_INDEX (-2064L)
#define SLNETERR_WLAN_INVALID_DWELL_TIME_VALUES (-2065L)
#define SLNETERR_WLAN_INVALID_POLICY_TYPE (-2066L)
#define SLNETERR_WLAN_PM_POLICY_INVALID_OPTION (-2067L)
#define SLNETERR_WLAN_PM_POLICY_INVALID_PARAMS (-2068L)
#define SLNETERR_WLAN_WIFI_NOT_CONNECTED (-2069L)
#define SLNETERR_WLAN_ILLEGAL_CHANNEL (-2070L)
#define SLNETERR_WLAN_WIFI_ALREADY_DISCONNECTED (-2071L)
#define SLNETERR_WLAN_TRANSCEIVER_ENABLED (-2072L)
#define SLNETERR_WLAN_GET_NETWORK_LIST_EAGAIN (-2073L)
#define SLNETERR_WLAN_GET_PROFILE_INVALID_INDEX (-2074L)
#define SLNETERR_WLAN_FAST_CONN_DATA_INVALID (-2075L)
#define SLNETERR_WLAN_NO_FREE_PROFILE (-2076L)
#define SLNETERR_WLAN_AP_SCAN_INTERVAL_TOO_LOW (-2077L)
#define SLNETERR_WLAN_SCAN_POLICY_INVALID_PARAMS (-2078L)
#define SLNETERR_RXFL_OK (0L) /**< O.K */
#define SLNETERR_RXFL_RANGE_COMPARE_PARAMS_ARE_INVALID (-2079L)
#define SLNETERR_RXFL_RXFL_INVALID_PATTERN_LENGTH (-2080L) /**< requested length for L1/L4 payload matching must not exceed 16 bytes */
#define SLNETERR_RXFL_ACTION_USER_EVENT_ID_TOO_BIG (-2081L) /**< user action id for host event must not exceed SLNETERR_WLAN_RX_FILTER_MAX_USER_EVENT_ID */
#define SLNETERR_RXFL_OFFSET_TOO_BIG (-2082L) /**< requested offset for L1/L4 payload matching must not exceed 1535 bytes */
#define SLNETERR_RXFL_STAT_UNSUPPORTED (-2083L) /**< get rx filters statistics not supported */
#define SLNETERR_RXFL_INVALID_FILTER_ARG_UPDATE (-2084L) /**< invalid filter args request */
#define SLNETERR_RXFL_INVALID_SYSTEM_STATE_TRIGGER_FOR_FILTER_TYPE (-2085L) /**< system state not supported for this filter type */
#define SLNETERR_RXFL_INVALID_FUNC_ID_FOR_FILTER_TYPE (-2086L) /**< function id not supported for this filter type */
#define SLNETERR_RXFL_DEPENDENT_FILTER_DO_NOT_EXIST_3 (-2087L) /**< filter parent doesn't exist */
#define SLNETERR_RXFL_OUTPUT_OR_INPUT_BUFFER_LENGTH_TOO_SMALL (-2088L) /**< ! The output buffer length is smaller than required for that operation */
#define SLNETERR_RXFL_DEPENDENT_FILTER_SOFTWARE_FILTER_NOT_FIT (-2089L) /**< Node filter can't be child of software filter and vice_versa */
#define SLNETERR_RXFL_DEPENDENCY_IS_NOT_PERSISTENT (-2090L) /**< Dependency filter is not persistent */
#define SLNETERR_RXFL_RXFL_ALLOCATION_PROBLEM (-2091L)
#define SLNETERR_RXFL_SYSTEM_STATE_NOT_SUPPORTED_FOR_THIS_FILTER (-2092L) /**< System state is not supported */
#define SLNETERR_RXFL_TRIGGER_USE_REG5_TO_REG8 (-2093L) /**< Only counters 5 - 8 are allowed, for trigger */
#define SLNETERR_RXFL_TRIGGER_USE_REG1_TO_REG4 (-2094L) /**< Only counters 1 - 4 are allowed, for trigger */
#define SLNETERR_RXFL_ACTION_USE_REG5_TO_REG8 (-2095L) /**< Only counters 5 - 8 are allowed, for action */
#define SLNETERR_RXFL_ACTION_USE_REG1_TO_REG4 (-2096L) /**< Only counters 1 - 4 are allowed, for action */
#define SLNETERR_RXFL_FIELD_SUPPORT_ONLY_EQUAL_AND_NOTEQUAL (-2097L) /**< Rule compare function Id is out of range */
#define SLNETERR_RXFL_WRONG_MULTICAST_BROADCAST_ADDRESS (-2098L) /**< The address should be of type multicast or broadcast */
#define SLNETERR_RXFL_THE_FILTER_IS_NOT_OF_HEADER_TYPE (-2099L) /**< The filter should be of header type */
#define SLNETERR_RXFL_WRONG_COMPARE_FUNC_FOR_BROADCAST_ADDRESS (-2100L) /**< The compare function is not suitable for broadcast address */
#define SLNETERR_RXFL_WRONG_MULTICAST_ADDRESS (-2101L) /**< The address should be of multicast type */
#define SLNETERR_RXFL_DEPENDENT_FILTER_IS_NOT_PERSISTENT (-2102L) /**< The dependency filter is not persistent */
#define SLNETERR_RXFL_DEPENDENT_FILTER_IS_NOT_ENABLED (-2103L) /**< The dependency filter is not enabled */
#define SLNETERR_RXFL_FILTER_HAS_CHILDS (-2104L) /**< The filter has childs and can't be removed */
#define SLNETERR_RXFL_CHILD_IS_ENABLED (-2105L) /**< Can't disable filter while the child is enabled */
#define SLNETERR_RXFL_DEPENDENCY_IS_DISABLED (-2106L) /**< Can't enable filter in case its dependency filter is disabled */
#define SLNETERR_RXFL_MAC_SEND_MATCHDB_FAILED (-2107L)
#define SLNETERR_RXFL_MAC_SEND_ARG_DB_FAILED (-2108L)
#define SLNETERR_RXFL_MAC_SEND_NODEDB_FAILED (-2109L)
#define SLNETERR_RXFL_MAC_OPERTATION_RESUME_FAILED (-2110L)
#define SLNETERR_RXFL_MAC_OPERTATION_HALT_FAILED (-2111L)
#define SLNETERR_RXFL_NUMBER_OF_CONNECTION_POINTS_EXCEEDED (-2112L) /**< Number of connection points exceeded */
#define SLNETERR_RXFL_DEPENDENT_FILTER_DEPENDENCY_ACTION_IS_DROP (-2113L) /**< The dependent filter has Drop action, thus the filter can't be created */
#define SLNETERR_RXFL_FILTER_DO_NOT_EXISTS (-2114L) /**< The filter doesn't exists */
#define SLNETERR_RXFL_DEPEDENCY_NOT_ON_THE_SAME_LAYER (-2115L) /**< The filter and its dependency must be on the same layer */
#define SLNETERR_RXFL_NUMBER_OF_ARGS_EXCEEDED (-2116L) /**< Number of arguments exceeded */
#define SLNETERR_RXFL_ACTION_NO_REG_NUMBER (-2117L) /**< Action require counter number */
#define SLNETERR_RXFL_DEPENDENT_FILTER_LAYER_DO_NOT_FIT (-2118L) /**< the filter and its dependency should be from the same layer */
#define SLNETERR_RXFL_DEPENDENT_FILTER_SYSTEM_STATE_DO_NOT_FIT (-2119L) /**< The filter and its dependency system state don't fit */
#define SLNETERR_RXFL_DEPENDENT_FILTER_DO_NOT_EXIST_2 (-2120L) /**< The parent filter don't exist */
#define SLNETERR_RXFL_DEPENDENT_FILTER_DO_NOT_EXIST_1 (-2121L) /**< The parent filter is null */
#define SLNETERR_RXFL_RULE_HEADER_ACTION_TYPE_NOT_SUPPORTED (-2122L) /**< The action type is not supported */
#define SLNETERR_RXFL_RULE_HEADER_TRIGGER_COMPARE_FUNC_OUT_OF_RANGE (-2123L) /**< The Trigger comparison function is out of range */
#define SLNETERR_RXFL_RULE_HEADER_TRIGGER_OUT_OF_RANGE (-2124L) /**< The Trigger is out of range */
#define SLNETERR_RXFL_RULE_HEADER_COMPARE_FUNC_OUT_OF_RANGE (-2125L) /**< The rule compare function is out of range */
#define SLNETERR_RXFL_FRAME_TYPE_NOT_SUPPORTED (-2126L) /**< ASCII frame type string is illegal */
#define SLNETERR_RXFL_RULE_FIELD_ID_NOT_SUPPORTED (-2127L) /**< Rule field ID is out of range */
#define SLNETERR_RXFL_RULE_HEADER_FIELD_ID_ASCII_NOT_SUPPORTED (-2128L) /**< This ASCII field ID is not supported */
#define SLNETERR_RXFL_RULE_HEADER_NOT_SUPPORTED (-2129L) /**< The header rule is not supported on current release */
#define SLNETERR_RXFL_RULE_HEADER_OUT_OF_RANGE (-2130L) /**< The header rule is out of range */
#define SLNETERR_RXFL_RULE_HEADER_COMBINATION_OPERATOR_OUT_OF_RANGE (-2131L) /**< Combination function Id is out of range */
#define SLNETERR_RXFL_RULE_HEADER_FIELD_ID_OUT_OF_RANGE (-2132L) /**< rule field Id is out of range */
#define SLNETERR_RXFL_UPDATE_NOT_SUPPORTED (-2133L) /**< Update not supported */
#define SLNETERR_RXFL_NO_FILTER_DATABASE_ALLOCATE (-2134L)
#define SLNETERR_RXFL_ALLOCATION_FOR_GLOBALS_STRUCTURE_FAILED (-2135L)
#define SLNETERR_RXFL_ALLOCATION_FOR_DB_NODE_FAILED (-2136L)
#define SLNETERR_RXFL_READ_FILE_FILTER_ID_ILLEGAL (-2137L)
#define SLNETERR_RXFL_READ_FILE_NUMBER_OF_FILTER_FAILED (-2138L)
#define SLNETERR_RXFL_READ_FILE_FAILED (-2139L)
#define SLNETERR_RXFL_NO_FILTERS_ARE_DEFINED (-2140L) /**< No filters are defined in the system */
#define SLNETERR_RXFL_NUMBER_OF_FILTER_EXCEEDED (-2141L) /**< Number of max filters exceeded */
#define SLNETERR_RXFL_BAD_FILE_MODE (-2142L)
#define SLNETERR_RXFL_FAILED_READ_NVFILE (-2143L)
#define SLNETERR_RXFL_FAILED_INIT_STORAGE (-2144L)
#define SLNETERR_RXFL_CONTINUE_WRITE_MUST_BE_MOD_4 (-2145L)
#define SLNETERR_RXFL_FAILED_LOAD_FILE (-2146L)
#define SLNETERR_RXFL_INVALID_HANDLE (-2147L)
#define SLNETERR_RXFL_FAILED_TO_WRITE (-2148L)
#define SLNETERR_RXFL_OFFSET_OUT_OF_RANGE (-2149L)
#define SLNETERR_RXFL_ALLOC (-2150L)
#define SLNETERR_RXFL_READ_DATA_LENGTH (-2151L)
#define SLNETERR_RXFL_INVALID_FILE_ID (-2152L)
#define SLNETERR_RXFL_FILE_FILTERS_NOT_EXISTS (-2153L)
#define SLNETERR_RXFL_FILE_ALREADY_IN_USE (-2154L)
#define SLNETERR_RXFL_INVALID_ARGS (-2155L)
#define SLNETERR_RXFL_FAILED_TO_CREATE_FILE (-2156L)
#define SLNETERR_RXFL_FS_ALREADY_LOADED (-2157L)
#define SLNETERR_RXFL_UNKNOWN (-2158L)
#define SLNETERR_RXFL_FAILED_TO_CREATE_LOCK_OBJ (-2159L)
#define SLNETERR_RXFL_DEVICE_NOT_LOADED (-2160L)
#define SLNETERR_RXFL_INVALID_MAGIC_NUM (-2161L)
#define SLNETERR_RXFL_FAILED_TO_READ (-2162L)
#define SLNETERR_RXFL_NOT_SUPPORTED (-2163L)
#define SLNETERR_WLAN_INVALID_COUNTRY_CODE (-2164L)
#define SLNETERR_WLAN_NVMEM_ACCESS_FAILED (-2165L)
#define SLNETERR_WLAN_OLD_FILE_VERSION (-2166L)
#define SLNETERR_WLAN_TX_POWER_OUT_OF_RANGE (-2167L)
#define SLNETERR_WLAN_INVALID_AP_PASSWORD_LENGTH (-2168L)
#define SLNETERR_WLAN_PROVISIONING_ABORT_PROVISIONING_ALREADY_STARTED (-2169L)
#define SLNETERR_WLAN_PROVISIONING_ABORT_HTTP_SERVER_DISABLED (-2170L)
#define SLNETERR_WLAN_PROVISIONING_ABORT_PROFILE_LIST_FULL (-2171L)
#define SLNETERR_WLAN_PROVISIONING_ABORT_INVALID_PARAM (-2172L)
#define SLNETERR_WLAN_PROVISIONING_ABORT_GENERAL_ERROR (-2173L)
#define SLNETERR_WLAN_MULTICAST_EXCEED_MAX_ADDR (-2174L)
#define SLNETERR_WLAN_MULTICAST_INVAL_ADDR (-2175L)
#define SLNETERR_WLAN_AP_SCAN_INTERVAL_TOO_SHORT (-2176L)
#define SLNETERR_WLAN_PROVISIONING_CMD_NOT_EXPECTED (-2177L)
#define SLNETERR_WLAN_AP_ACCESS_LIST_NO_ADDRESS_TO_DELETE (-2178L) /**< List is empty, no address to delete */
#define SLNETERR_WLAN_AP_ACCESS_LIST_FULL (-2179L) /**< access list is full */
#define SLNETERR_WLAN_AP_ACCESS_LIST_DISABLED (-2180L) /**< access list is disabled */
#define SLNETERR_WLAN_AP_ACCESS_LIST_MODE_NOT_SUPPORTED (-2181L) /**< Trying to switch to unsupported mode */
#define SLNETERR_WLAN_AP_STA_NOT_FOUND (-2182L) /**< trying to disconnect station which is not connected */
/* DEVICE ERRORS CODES*/
#define SLNETERR_SUPPLICANT_ERROR (-4097L)
#define SLNETERR_HOSTAPD_INIT_FAIL (-4098L)
#define SLNETERR_HOSTAPD_INIT_IF_FAIL (-4099L)
#define SLNETERR_WLAN_DRV_INIT_FAIL (-4100L)
#define SLNETERR_MDNS_ENABLE_FAIL (-4103L) /**< mDNS enable failed */
#define SLNETERR_ROLE_STA_ERR (-4107L) /**< Failure to load MAC/PHY in STA role */
#define SLNETERR_ROLE_AP_ERR (-4108L) /**< Failure to load MAC/PHY in AP role */
#define SLNETERR_ROLE_P2P_ERR (-4109L) /**< Failure to load MAC/PHY in P2P role */
#define SLNETERR_CALIB_FAIL (-4110L) /**< Failure of calibration */
#define SLNETERR_RESTORE_IMAGE_COMPLETE (-4113L) /**< Return to factory image completed, perform reset */
#define SLNETERR_UNKNOWN_ERR (-4114L)
#define SLNETERR_GENERAL_ERR (-4115L) /**< General error during init */
#define SLNETERR_WRONG_ROLE (-4116L)
#define SLNETERR_INCOMPLETE_PROGRAMMING (-4117L) /**< Error during programming, Program new image should be invoked (see sl_FsProgram) */
#define SLNETERR_PENDING_TXRX_STOP_TIMEOUT_EXP (-4118L) /**< Timeout expired before completing all TX/RX */
#define SLNETERR_PENDING_TXRX_NO_TIMEOUT (-4119L) /**< No Timeout, still have pending TX/RX */
#define SLNETERR_INVALID_PERSISTENT_CONFIGURATION (-4120L) /**< persistent configuration can only be set to 0 (disabled) or 1 (enabled) */
/* NETAPP ERRORS CODES*/
#define SLNETERR_MDNS_CREATE_FAIL (-6145L) /**< mDNS create failed */
#define SLNETERR_DEVICE_NAME_LEN_ERR (-6146L) /**< Set Dev name error codes */
#define SLNETERR_DEVICE_NAME_INVALID (-6147L) /**< Set Dev name error codes */
#define SLNETERR_DOMAIN_NAME_LEN_ERR (-6148L) /**< Set domain name error codes */
#define SLNETERR_DOMAIN_NAME_INVALID (-6149L) /**< Set domain name error codes */
#define SLNETERR_NET_APP_DNS_QUERY_NO_RESPONSE (-6150L) /**< DNS query failed, no response */
#define SLNETERR_NET_APP_DNS_ERROR (-6151L) /**< DNS internal error */
#define SLNETERR_NET_APP_DNS_NO_SERVER (-6152L) /**< No DNS server was specified */
#define SLNETERR_NET_APP_DNS_TIMEOUTR (-6153L) /**< mDNS parameters error */
#define SLNETERR_NET_APP_DNS_QUERY_FAILED (-6154L) /**< DNS query failed; no DNS server sent an 'answer' */
#define SLNETERR_NET_APP_DNS_BAD_ADDRESS_ERROR (-6155L) /**< Improperly formatted IPv4 or IPv6 address */
#define SLNETERR_NET_APP_DNS_SIZE_ERROR (-6156L) /**< DNS destination size is too small */
#define SLNETERR_NET_APP_DNS_MALFORMED_PACKET (-6157L) /**< Improperly formed or corrupted DNS packet received */
#define SLNETERR_NET_APP_DNS_BAD_ID_ERROR (-6158L) /**< DNS packet from server does not match query ID */
#define SLNETERR_NET_APP_DNS_PARAM_ERROR (-6159L) /**< Invalid params */
#define SLNETERR_NET_APP_DNS_SERVER_NOT_FOUND (-6160L) /**< Server not found in Client list of DNS servers */
#define SLNETERR_NET_APP_DNS_PACKET_CREATE_ERROR (-6161L) /**< Error creating DNS packet */
#define SLNETERR_NET_APP_DNS_EMPTY_DNS_SERVER_LIST (-6162L) /**< DNS Client's list of DNS servers is empty */
#define SLNETERR_NET_APP_DNS_SERVER_AUTH_ERROR (-6163L) /**< Server not able to authenticate answer/authority data*/
#define SLNETERR_NET_APP_DNS_ZERO_GATEWAY_IP_ADDRESS (-6164L) /**< DNS Client IP instance has a zero gateway IP address */
#define SLNETERR_NET_APP_DNS_MISMATCHED_RESPONSE (-6165L) /**< Server response type does not match the query request*/
#define SLNETERR_NET_APP_DNS_DUPLICATE_ENTRY (-6166L) /**< Duplicate entry exists in DNS server table */
#define SLNETERR_NET_APP_DNS_RETRY_A_QUERY (-6167L) /**< SOA status returned; web site only exists as IPv4 */
#define SLNETERR_NET_APP_DNS_INVALID_ADDRESS_TYPE (-6168L) /**< IP address type (e.g. IPv6L) not supported */
#define SLNETERR_NET_APP_DNS_IPV6_NOT_SUPPORTED (-6169L) /**< IPv6 disabled */
#define SLNETERR_NET_APP_DNS_NEED_MORE_RECORD_BUFFER (-6170L) /**< The buffer size is not enough. */
#define SLNETERR_NET_APP_MDNS_ERROR (-6171L) /**< MDNS internal error. */
#define SLNETERR_NET_APP_MDNS_PARAM_ERROR (-6172L) /**< MDNS parameters error. */
#define SLNETERR_NET_APP_MDNS_CACHE_ERROR (-6173L) /**< The Cache size is not enough. */
#define SLNETERR_NET_APP_MDNS_UNSUPPORTED_TYPE (-6174L) /**< The unsupported resource record type. */
#define SLNETERR_NET_APP_MDNS_DATA_SIZE_ERROR (-6175L) /**< The data size is too big. */
#define SLNETERR_NET_APP_MDNS_AUTH_ERROR (-6176L) /**< Attempting to parse too large a data. */
#define SLNETERR_NET_APP_MDNS_PACKET_ERROR (-6177L) /**< The packet can not add the resource record. */
#define SLNETERR_NET_APP_MDNS_DEST_ADDRESS_ERROR (-6178L) /**< The destination address error. */
#define SLNETERR_NET_APP_MDNS_UDP_PORT_ERROR (-6179L) /**< The udp port error. */
#define SLNETERR_NET_APP_MDNS_NOT_LOCAL_LINK (-6180L) /**< The message that not originate from the local link. */
#define SLNETERR_NET_APP_MDNS_EXCEED_MAX_LABEL (-6181L) /**< The data exceed the max label size. */
#define SLNETERR_NET_APP_MDNS_EXIST_UNIQUE_RR (-6182L) /**< At least one unique record in the cache. */
#define SLNETERR_NET_APP_MDNS_EXIST_ANSWER (-6183L) /**< At least one answer record in the cache. */
#define SLNETERR_NET_APP_MDNS_EXIST_SAME_QUERY (-6184L) /**< Exist the same query. */
#define SLNETERR_NET_APP_MDNS_DUPLICATE_SERVICE (-6185L) /**< Duplicate service. */
#define SLNETERR_NET_APP_MDNS_NO_ANSWER (-6186L) /**< No response for one-shot query. */
#define SLNETERR_NET_APP_MDNS_NO_KNOWN_ANSWER (-6187L) /**< No known answer for query. */
#define SLNETERR_NET_APP_MDNS_NAME_MISMATCH (-6188L) /**< The name mismatch. */
#define SLNETERR_NET_APP_MDNS_NOT_STARTED (-6189L) /**< MDNS does not start. */
#define SLNETERR_NET_APP_MDNS_HOST_NAME_ERROR (-6190L) /**< MDNS host name error. */
#define SLNETERR_NET_APP_MDNS_NO_MORE_ENTRIES (-6191L) /**< No more entries be found. */
#define SLNETERR_NET_APP_MDNS_SERVICE_TYPE_MISMATCH (-6192L) /**< The service type mismatch */
#define SLNETERR_NET_APP_MDNS_LOOKUP_INDEX_ERROR (-6193L) /**< Index is bigger than number of services. */
#define SLNETERR_NET_APP_MDNS_MAX_SERVICES_ERROR (-6194L)
#define SLNETERR_NET_APP_MDNS_IDENTICAL_SERVICES_ERROR (-6195L)
#define SLNETERR_NET_APP_MDNS_EXISTED_SERVICE_ERROR (-6196L)
#define SLNETERR_NET_APP_MDNS_ERROR_SERVICE_NAME_ERROR (-6197L)
#define SLNETERR_NET_APP_MDNS_RX_PACKET_ALLOCATION_ERROR (-6198L)
#define SLNETERR_NET_APP_MDNS_BUFFER_SIZE_ERROR (-6199L)
#define SLNETERR_NET_APP_MDNS_NET_APP_SET_ERROR (-6200L)
#define SLNETERR_NET_APP_MDNS_GET_SERVICE_LIST_FLAG_ERROR (-6201L)
#define SLNETERR_NET_APP_MDNS_MDNS_NO_CONFIGURATION_ERROR (-6202L)
#define SLNETERR_NET_APP_MDNS_STATUS_ERROR (-6203L)
#define SLNETERR_NET_APP_ENOBUFS (-6204L)
#define SLNETERR_NET_APP_DNS_IPV6_REQ_BUT_IPV6_DISABLED (-6205L) /**< trying to issue ipv6 DNS request but ipv6 is disabled */
#define SLNETERR_NET_APP_DNS_INVALID_FAMILY_TYPE (-6206L) /**< Family type is not ipv4 and not ipv6 */
#define SLNETERR_NET_APP_DNS_REQ_TOO_BIG (-6207L) /**< DNS request size is too big */
#define SLNETERR_NET_APP_DNS_ALLOC_ERROR (-6208L) /**< Allocation error */
#define SLNETERR_NET_APP_DNS_EXECUTION_ERROR (-6209L) /**< Execution error */
#define SLNETERR_NET_APP_P2P_ROLE_IS_NOT_CONFIGURED (-6210L) /**< role p2p is not configured yet, should be CL or GO in order to execute command */
#define SLNETERR_NET_APP_INCORECT_ROLE_FOR_APP (-6211L) /**< incorrect role for specific application */
#define SLNETERR_NET_APP_INCORECT_APP_MASK (-6212L) /**< mask does not match any app */
#define SLNETERR_NET_APP_MDNS_ALREADY_STARTED (-6213L) /**< mdns application already started */
#define SLNETERR_NET_APP_HTTP_SERVER_ALREADY_STARTED (-6214L) /**< http server application already started */
#define SLNETERR_NET_APP_HTTP_GENERAL_ERROR (-6216L) /**< New error - Http handle request failed */
#define SLNETERR_NET_APP_HTTP_INVALID_TIMEOUT (-6217L) /**< New error - Http timeout invalid argument */
#define SLNETERR_NET_APP_INVALID_URN_LENGTH (-6218L) /**< invalid URN length */
#define SLNETERR_NET_APP_RX_BUFFER_LENGTH (-6219L) /**< size of the requested services is smaller than size of the user buffer */
/*< NETCFG ERRORS CODES*/
#define SLNETERR_STATIC_ADDR_SUBNET_ERROR (-8193L)
#define SLNETERR_INCORRECT_IPV6_STATIC_LOCAL_ADDR (-8194L) /**< Ipv6 Local address prefix is wrong */
#define SLNETERR_INCORRECT_IPV6_STATIC_GLOBAL_ADDR (-8195L) /**< Ipv6 Global address prefix is wrong */
#define SLNETERR_IPV6_LOCAL_ADDR_SHOULD_BE_SET_FIRST (-8195L) /**< Attempt to set ipv6 global address before ipv6 local address is set */
/* NETUTIL ERRORS CODES */
#define SLNETERR_NETUTIL_CRYPTO_GENERAL (-12289L)
#define SLNETERR_NETUTIL_CRYPTO_INVALID_INDEX (-12290L)
#define SLNETERR_NETUTIL_CRYPTO_INVALID_PARAM (-12291L)
#define SLNETERR_NETUTIL_CRYPTO_MEM_ALLOC (-12292L)
#define SLNETERR_NETUTIL_CRYPTO_INVALID_DB_VER (-12293L)
#define SLNETERR_NETUTIL_CRYPTO_UNSUPPORTED_OPTION (-12294L)
#define SLNETERR_NETUTIL_CRYPTO_BUFFER_TOO_SMALL (-12295L)
#define SLNETERR_NETUTIL_CRYPTO_EMPTY_DB_ENTRY (-12296L)
#define SLNETERR_NETUTIL_CRYPTO_NON_TEMPORARY_KEY (-12297L)
#define SLNETERR_NETUTIL_CRYPTO_DB_ENTRY_NOT_FREE (-12298L)
#define SLNETERR_NETUTIL_CRYPTO_CORRUPTED_DB_FILE (-12299L)
/* GENERAL ERRORS CODES*/
#define SLNETERR_INVALID_OPCODE (-14337L)
#define SLNETERR_INVALID_PARAM (-14338L)
#define SLNETERR_STATUS_ERROR (-14341L)
#define SLNETERR_NVMEM_ACCESS_FAILED (-14342L)
#define SLNETERR_NOT_ALLOWED_NWP_LOCKED (-14343L) /**< Device is locked, Return to Factory Image or Program new image should be invoked (see sl_FsCtl, sl_FsProgram) */
/* SECURITY ERRORS CODE */
#define SLNETERR_LOADING_CERTIFICATE_STORE (-28673L)
/* Device is Locked! Return to Factory Image or Program new
image should be invoked (see sl_FsCtl, sl_FsProgram) */
#define SLNETERR_DEVICE_LOCKED_SECURITY_ALERT (-28674L)
/* INTERNAL HOST ERRORS CODES*/
/* Receive this error in case there are no resources to issue the command
If possible, increase the number of MAX_CONCURRENT_ACTIONS (result in memory increase)
If not, try again later */
#define SLNETERR_POOL_IS_EMPTY (-2000L)
/* Receive this error in case a given length for RX buffer was too small.
Receive payload was bigger than the given buffer size. Therefore, payload is cut according to receive size
Recommend to increase buffer size */
#define SLNETERR_ESMALLBUF (-2001L)
/* Receive this error in case zero length is supplied to a "get" API
Recommend to supply length according to requested information (view options defines for help) */
#define SLNETERR_EZEROLEN (-2002L)
/* User supplied invalid parameter */
#define SLNETERR_INVALPARAM (-2003L)
/* Failed to open interface */
#define SLNETERR_BAD_INTERFACE (-2004L)
/* API has been aborted due to an error detected by host driver */
#define SLNETERR_API_ABORTED (-2005L)
/* Parameters are invalid */
#define SLNETERR_RET_CODE_INVALID_INPUT (-2006L)
/* Driver internal error */
#define SLNETERR_RET_CODE_SELF_ERROR (-2007L)
/* NWP internal error */
#define SLNETERR_RET_CODE_NWP_IF_ERROR (-2008L)
/* malloc error */
#define SLNETERR_RET_CODE_MALLOC_ERROR (-2009L)
/* protocol error */
#define SLNETERR_RET_CODE_PROTOCOL_ERROR (-2010L)
/* API has been aborted, command is not allowed in device lock state */
#define SLNETERR_RET_CODE_DEV_LOCKED (-2011L)
/* SlNetSock_Start cannot be invoked twice */
#define SLNETERR_RET_CODE_DEV_ALREADY_STARTED (-2012L)
/* SL Net API is in progress */
#define SLNETERR_RET_CODE_API_COMMAND_IN_PROGRESS (-2013L)
/* Provisioning is in progress - */
#define SLNETERR_RET_CODE_PROVISIONING_IN_PROGRESS (-2014L)
/* Wrong ping parameters - ping cannot be called with the following parameters:
1. infinite ping packet
2. report only when finished
3. no callback supplied */
#define SLNETERR_RET_CODE_NET_APP_PING_INVALID_PARAMS (-2015L)
/* SlNetSock select already in progress.
this error will be returned if app will try to call
SlNetSock_select blocking when there is already select trigger in progress */
#define SLNETERR_RET_CODE_SOCKET_SELECT_IN_PROGRESS_ERROR (-2016L)
#define SLNETERR_RET_CODE_STOP_IN_PROGRESS (-2017L)
/* The device has not been started yet */
#define SLNETERR_RET_CODE_DEV_NOT_STARTED (-2018L)
/* The event link was not found in the list */
#define SLNETERR_RET_CODE_EVENT_LINK_NOT_FOUND (-2019L)
/* Function couldn't find any free space/location */
#define SLNETERR_RET_CODE_NO_FREE_SPACE (-2020L)
/* Function couldn't execute correctly */
#define SLNETERR_RET_CODE_FUNCTION_FAILED (-2021L)
/* Mutex creation failed */
#define SLNETERR_RET_CODE_MUTEX_CREATION_FAILED (-2022L)
/* Function couldn't find the requested resource */
#define SLNETERR_RET_CODE_COULDNT_FIND_RESOURCE (-2023L)
/* Interface doesn't support the non mandatory function */
#define SLNETERR_RET_CODE_DOESNT_SUPPORT_NON_MANDATORY_FXN (-2024L)
/* Socket creation in progress */
#define SLNETERR_RET_CODE_SOCKET_CREATION_IN_PROGRESS (-2025L)
/* Unsupported scenario, option or feature */
#define SLNETERR_RET_CODE_UNSUPPORTED (-2026L)
/* sock related API's from SlNetIf_Config_t failed */
#define SLNETSOCK_ERR_SOCKCREATE_FAILED (-3000L)
#define SLNETSOCK_ERR_SOCKCLOSE_FAILED (-3001L)
#define SLNETSOCK_ERR_SOCKSELECT_FAILED (-3002L)
#define SLNETSOCK_ERR_SOCKSETOPT_FAILED (-3003L)
#define SLNETSOCK_ERR_SOCKGETOPT_FAILED (-3004L)
#define SLNETSOCK_ERR_SOCKRECVFROM_FAILED (-3005L)
#define SLNETSOCK_ERR_SOCKSENDTO_FAILED (-3006L)
#define SLNETSOCK_ERR_SOCKSHUTDOWN_FAILED (-3007L)
#define SLNETSOCK_ERR_SOCKACCEPT_FAILED (-3008L)
#define SLNETSOCK_ERR_SOCKBIND_FAILED (-3009L)
#define SLNETSOCK_ERR_SOCKLISTEN_FAILED (-3000L)
#define SLNETSOCK_ERR_SOCKCONNECT_FAILED (-3001L)
#define SLNETSOCK_ERR_SOCKGETPEERNAME_FAILED (-3002L)
#define SLNETSOCK_ERR_SOCKGETLOCALNAME_FAILED (-3003L)
#define SLNETSOCK_ERR_SOCKRECV_FAILED (-3004L)
#define SLNETSOCK_ERR_SOCKSEND_FAILED (-3005L)
#define SLNETSOCK_ERR_SOCKSTARTSEC_FAILED (-3006L)
/* util related API's from SlNetIf_Config_t failed */
#define SLNETUTIL_ERR_UTILGETHOSTBYNAME_FAILED (-3100L)
/*
* base for util error codes related to SlNetUtil_getAddrInfo and
* SlNetUtil_gaiStrErr
*/
#define SLNETUTIL_EAI_BASE (-3120L)
/*
* util error codes related to SlNetUtil_getAddrInfo and SlNetUtil_gaiStrErr
* The numbering of these codes MUST match the order of the strErrorMsgs array
* in <ti/net/slnetutils.c>
*/
#define SLNETUTIL_EAI_AGAIN (-3121L)
#define SLNETUTIL_EAI_BADFLAGS (-3122L)
#define SLNETUTIL_EAI_FAIL (-3123L)
#define SLNETUTIL_EAI_FAMILY (-3124L)
#define SLNETUTIL_EAI_MEMORY (-3125L)
#define SLNETUTIL_EAI_NONAME (-3126L)
#define SLNETUTIL_EAI_SERVICE (-3127L)
#define SLNETUTIL_EAI_SOCKTYPE (-3128L)
#define SLNETUTIL_EAI_SYSTEM (-3129L)
#define SLNETUTIL_EAI_OVERFLOW (-3130L)
#define SLNETUTIL_EAI_ADDRFAMILY (-3131L)
/* if related API's from SlNetIf_Config_t failed */
#define SLNETIF_ERR_IFLOADSECOBJ_FAILED (-3200L)
#define SLNETIF_ERR_IFGETIPADDR_FAILED (-3201L)
#define SLNETIF_ERR_IFGETCONNECTIONSTATUS_FAILED (-3202L)
#define SLNETIF_ERR_IFCREATECONTEXT_FAILED (-3203L)
/*!
Close the Doxygen group.
@}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __SL_NET_ERR_H__ */

View File

@ -0,0 +1,862 @@
/*
* Copyright (c) 2017-2020, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*****************************************************************************/
/* Include files */
/*****************************************************************************/
/* Global includes */
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ti/net/slnetif.h>
#include <ti/net/slneterr.h>
/*****************************************************************************/
/* Macro declarations */
/*****************************************************************************/
#define SLNETIF_NORMALIZE_NEEDED 0
#if SLNETIF_NORMALIZE_NEEDED
#define SLNETIF_NORMALIZE_RET_VAL(retVal,err) ((retVal < 0)?(retVal = err):(retVal))
#else
#define SLNETIF_NORMALIZE_RET_VAL(retVal,err)
#endif
/* Interface maximum priority */
#define SLNETIF_MAX_PRIORITY (15)
/* The 32bit interface flags structure:
Bits 0-3 : interface priority
Bit 4 : Interface state
Bits 5-31 : Reserved
*/
#define IF_PRIORITY_BITS (0x000f)
#define IF_STATE_BIT (0x0010)
/* this macro returns the priority of the interface */
#define GET_IF_PRIORITY(netIf) ((netIf).flags & IF_PRIORITY_BITS)
/* this macro reset the priority of the interface */
#define RESET_IF_PRIORITY(netIf) ((netIf).flags &= ~IF_PRIORITY_BITS)
/* this macro set the priority of the interface */
#define SET_IF_PRIORITY(netIf, priority) ((netIf).flags |= ((int32_t)priority))
/* this macro returns the state of the interface */
#define GET_IF_STATE(netIf) (((netIf).flags & IF_STATE_BIT)?SLNETIF_STATE_ENABLE:SLNETIF_STATE_DISABLE)
/* this macro set the interface to enable state */
#define SET_IF_STATE_ENABLE(netIf) ((netIf).flags |= IF_STATE_BIT)
/* this macro set the interface to disable state */
#define SET_IF_STATE_DISABLE(netIf) ((netIf).flags &= ~IF_STATE_BIT)
/* Check if the state bit is set */
#define IS_STATE_BIT_SET(queryBitmap) (0 != (queryBitmap & SLNETIF_QUERY_IF_STATE_BIT))
/* Check if the connection status bit is set */
#define IS_CONNECTION_STATUS_BIT_SET(queryBitmap) (0 != (queryBitmap & SLNETIF_QUERY_IF_CONNECTION_STATUS_BIT))
/* Return last found netIf, if none of the existing interfaces answers
the query */
#define IS_ALLOW_PARTIAL_MATCH_BIT_SET(queryBitmap) (0 != (queryBitmap & SLNETIF_QUERY_IF_ALLOW_PARTIAL_MATCH_BIT))
/*****************************************************************************/
/* Structure/Enum declarations */
/*****************************************************************************/
/* Interface Node */
typedef struct SlNetIf_Node_t
{
SlNetIf_t netIf;
struct SlNetIf_Node_t *next;
} SlNetIf_Node_t;
/*****************************************************************************/
/* Global declarations */
/*****************************************************************************/
static SlNetIf_Node_t * SlNetIf_listHead = NULL;
/*****************************************************************************/
/* Function prototypes */
/*****************************************************************************/
static int32_t SlNetIf_configCheck(const SlNetIf_Config_t *ifConf);
//*****************************************************************************
//
// SlNetIf_configCheck - Checks that all mandatory configuration exists
//
//*****************************************************************************
static int32_t SlNetIf_configCheck(const SlNetIf_Config_t *ifConf)
{
/* Check if the mandatory configuration exists
This configuration needs to be updated when new mandatory is added */
if ((NULL != ifConf) &&
(NULL != ifConf->sockCreate) &&
(NULL != ifConf->sockClose) &&
(NULL != ifConf->sockSelect) &&
(NULL != ifConf->sockSetOpt) &&
(NULL != ifConf->sockGetOpt) &&
(NULL != ifConf->sockRecvFrom) &&
(NULL != ifConf->sockSendTo) &&
(NULL != ifConf->ifGetIPAddr) &&
(NULL != ifConf->ifGetConnectionStatus) )
{
/* All mandatory configuration exists - return success */
return SLNETERR_RET_CODE_OK;
}
else
{
/* Not all mandatory configuration exists - return error code */
return SLNETERR_INVALPARAM;
}
}
//*****************************************************************************
//
// SlNetIf_init - Initialize the SlNetIf module
//
//*****************************************************************************
int32_t SlNetIf_init(int32_t flags)
{
return SLNETERR_RET_CODE_OK;
}
//*****************************************************************************
//
// SlNetIf_add - Adding new interface
//
//*****************************************************************************
int32_t SlNetIf_add(uint16_t ifID, char *ifName, const SlNetIf_Config_t *ifConf, uint8_t priority)
{
SlNetIf_Node_t *ifNode = SlNetIf_listHead;
SlNetIf_Node_t *prvNode = NULL;
char *allocName = NULL;
int16_t strLen;
int32_t retVal;
/* Check if ifID is a valid input - Only one bit is set (Pow of 2) or if
the priority isn't a valid input */
if ( (false == ONLY_ONE_BIT_IS_SET(ifID)) || (priority > SLNETIF_MAX_PRIORITY) )
{
return SLNETERR_RET_CODE_INVALID_INPUT;
}
/* Run over the interface list until finding the required ifID or Until
reaching the end of the list */
while (NULL != ifNode)
{
/* Check if the identifier of the interface is equal to the input */
if ((ifNode->netIf).ifID == ifID)
{
/* Required interface found, ifID cannot be used again */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
/* Check if the identifier of the interface is equal to the input */
if ((GET_IF_PRIORITY(ifNode->netIf)) > priority)
{
/* Higher priority interface found, save location */
prvNode = ifNode;
}
else
{
break;
}
ifNode = ifNode->next;
}
/* Check if all required configuration exists */
retVal = SlNetIf_configCheck(ifConf);
/* Check retVal in order to continue with adding the interface */
if (SLNETERR_RET_CODE_OK == retVal)
{
/* Interface node memory allocation */
/* Allocate memory for new interface node for the interface list */
ifNode = malloc(sizeof(SlNetIf_Node_t));
/* Check if the memory allocated successfully */
if (NULL == ifNode)
{
/* Allocation failed, return error code */
return SLNETERR_RET_CODE_MALLOC_ERROR;
}
/* Interface name memory allocation */
/* Check if memory allocation for the name of the string is required */
if (NULL != ifName)
{
/* Store the length of the interface name */
strLen = strlen(ifName);
/* Allocate memory that will store the name of the interface */
allocName = malloc(strLen + 1);
/* Check if the memory allocated successfully */
if (NULL == allocName)
{
/* Allocation failed, free ifNode before returning from
function */
free(ifNode);
return SLNETERR_RET_CODE_MALLOC_ERROR;
}
/* Copy the input name into the allocated memory.
*
* Note, using strcpy (not strncpy) to work around gcc warning
* https://gcc.gnu.org/bugzilla//show_bug.cgi?id=88059
* ... and we know ifName will fit in allocName.
*/
strcpy(allocName, ifName);
}
/* Fill the allocated interface node with the input parameters */
/* Copy the interface ID */
(ifNode->netIf).ifID = ifID;
/* Connect the string allocated memory into the allocated interface */
(ifNode->netIf).ifName = allocName;
/* Copy the interface configuration */
(ifNode->netIf).ifConf = (SlNetIf_Config_t *)ifConf;
/* Reset the flags, set state to ENABLE and set the priority */
(ifNode->netIf).flags = 0;
SET_IF_PRIORITY(ifNode->netIf, priority);
SET_IF_STATE_ENABLE(ifNode->netIf);
/* Check if CreateContext function exists */
if (NULL != ifConf->ifCreateContext)
{
/* Function exists, run it and fill the context */
retVal = ifConf->ifCreateContext(ifID, allocName, &((ifNode->netIf).ifContext));
}
/* Check retVal before continuing */
if (SLNETERR_RET_CODE_OK == retVal)
{
/* After creating and filling the interface, add it to the right
place in the list according to its priority */
/* Check if there isn't any higher priority node */
if (NULL == prvNode)
{
/* there isn't any higher priority node so check if list is
empty */
if (NULL != SlNetIf_listHead)
{
/* List isn't empty, so use the new allocated interface
as the new head and connect the old list head as the
following node */
ifNode->next = SlNetIf_listHead;
}
else
{
/* List is empty, so the new allocated interface will be
the head list */
ifNode->next = NULL;
}
SlNetIf_listHead = ifNode;
}
else
{
/* Higher priority exists, connect the allocated node after
the prvNode and the next node (if exists) of prvNode to
the next of the node */
ifNode->next = prvNode->next;
prvNode->next = ifNode;
}
}
}
return retVal;
}
//*****************************************************************************
//
// SlNetIf_getIfByID - Get interface configuration from interface ID
//
//*****************************************************************************
SlNetIf_t * SlNetIf_getIfByID(uint16_t ifID)
{
SlNetIf_Node_t *ifNode = SlNetIf_listHead;
/* Check if ifID is a valid input - Only one bit is set (Pow of 2) */
if (false == ONLY_ONE_BIT_IS_SET(ifID))
{
return NULL;
}
/* Run over the interface list until finding the required ifID or Until
reaching the end of the list */
while (NULL != ifNode)
{
/* Check if the identifier of the interface is equal to the input */
if ((ifNode->netIf).ifID == ifID)
{
/* Required interface found, return the interface pointer */
return &(ifNode->netIf);
}
ifNode = ifNode->next;
}
/* Interface identifier was not found */
return NULL;
}
//*****************************************************************************
//
// SlNetIf_queryIf - Get interface configuration with the highest priority
// from the provided interface bitmap
// Note: ifBitmap - 0 is not a valid input
//
//*****************************************************************************
SlNetIf_t * SlNetIf_queryIf(uint32_t ifBitmap, uint32_t queryBitmap)
{
SlNetIf_Node_t *ifNode = SlNetIf_listHead;
SlNetIf_t *bestPartialMatchIf = NULL;
if (0 == ifBitmap)
{
return NULL;
}
/* Run over the interface list until finding the first ifID that is
set in the ifBitmap or Until reaching the end of the list if no
ifID were found */
while (NULL != ifNode)
{
/* Check if the identifier of the interface is equal to the input */
if (((ifNode->netIf).ifID) & ifBitmap)
{
/* Save the netIf only at the first match */
if (NULL == bestPartialMatchIf)
{
bestPartialMatchIf = &(ifNode->netIf);
}
/* Skip over Bitmap queries */
if ( 0 != queryBitmap)
{
/* Check if the state bit needs to be set and if it is */
if ( (true == IS_STATE_BIT_SET(queryBitmap)) &&
(SLNETIF_STATE_DISABLE == (GET_IF_STATE(ifNode->netIf))) )
{
/* State is disabled when needed to be set, continue
to the next interface */
ifNode = ifNode->next;
continue;
}
/* Check if the connection status bit needs to be set
and if it is */
if ( (true == IS_CONNECTION_STATUS_BIT_SET(queryBitmap)) &&
(SLNETIF_STATUS_CONNECTED != SlNetIf_getConnectionStatus((ifNode->netIf).ifID)) )
{
/* Connection status is not connected when it needed to
be - continue to the next interface */
ifNode = ifNode->next;
continue;
}
}
/* Required interface found, return the interface pointer */
return &(ifNode->netIf);
}
ifNode = ifNode->next;
}
/* When bit is set, return the last interface found if there isn't
an existing interface that answers the query return the last
netIf that was found */
if (true == IS_ALLOW_PARTIAL_MATCH_BIT_SET(queryBitmap))
{
return bestPartialMatchIf;
}
else
{
return NULL;
}
}
//*****************************************************************************
//
// SlNetIf_getNameByID - Get interface Name from interface ID
//
//*****************************************************************************
const char * SlNetIf_getNameByID(uint16_t ifID)
{
SlNetIf_t *netIf;
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifID);
/* Check if the requested interface exists or the function returned NULL */
if (NULL == netIf)
{
/* Interface doesn't exists or invalid input, return NULL */
return NULL;
}
else
{
/* Interface exists, return the interface name */
return netIf->ifName;
}
}
//*****************************************************************************
//
// SlNetIf_getIDByName - Get interface ID from interface name
//
//*****************************************************************************
int32_t SlNetIf_getIDByName(char *ifName)
{
SlNetIf_Node_t *ifNode = SlNetIf_listHead;
/* Check if ifName is a valid input */
if (NULL == ifName)
{
return(SLNETERR_RET_CODE_INVALID_INPUT);
}
/* Run over the interface list until finding the required ifID or Until
reaching the end of the list */
while (NULL != ifNode)
{
/* Check if the identifier of the interface is equal to the input */
if (strcmp((ifNode->netIf).ifName, ifName) == 0)
{
/* Required interface found, return the interface identifier */
return ((ifNode->netIf).ifID);
}
ifNode = ifNode->next;
}
/* Interface identifier was not found, return error code */
return(SLNETERR_RET_CODE_INVALID_INPUT);
}
//*****************************************************************************
//
// SlNetIf_getPriority - Get interface priority
//
//*****************************************************************************
int32_t SlNetIf_getPriority(uint16_t ifID)
{
SlNetIf_t *netIf;
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifID);
/* Check if the requested interface exists or the function returned NULL */
if (NULL == netIf)
{
/* Interface doesn't exists or invalid input, return error code */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
else
{
/* Interface exists, return interface priority */
return GET_IF_PRIORITY(*netIf);
}
}
//*****************************************************************************
//
// SlNetIf_setPriority - Set interface priority
//
//*****************************************************************************
int32_t SlNetIf_setPriority(uint16_t ifID, uint8_t priority)
{
SlNetIf_Node_t *ifListNode = SlNetIf_listHead;
SlNetIf_Node_t *prvIfListNode = SlNetIf_listHead;
SlNetIf_Node_t *reqIfListNode = NULL;
bool connectAgain = false;
if (priority > SLNETIF_MAX_PRIORITY)
{
/* Run validity check and find the requested interface */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
/* Find the location of required interface */
while (NULL != ifListNode)
{
/* If the location of the required interface found, store the
location */
if ((ifListNode->netIf.ifID) == ifID)
{
reqIfListNode = ifListNode;
/* Check if the required interface is the last node and needs
lower priority than the previous node, only update of the
priority is required for this node */
if (NULL == ifListNode->next)
{
if (GET_IF_PRIORITY(prvIfListNode->netIf) >= priority)
{
/* The required interface is the last node and needs
lower priority than the previous node, only update
of the priority is required for this node */
break;
}
else
{
/* The required interface is the last node but has
higher priority than the previous node, disconnect
the interface from the list. connect the previous node
to the end of the list
If this is not the only node in the list, find where
it now belongs based on its new priority. */
if (reqIfListNode != SlNetIf_listHead)
{
prvIfListNode->next = NULL;
connectAgain = true;
/* This is the end of the list, so stop looping */
break;
}
}
}
/* Check if the required interface is the first node in the list */
else if (SlNetIf_listHead == ifListNode)
{
if ( (NULL == ifListNode->next) || ((GET_IF_PRIORITY(ifListNode->next->netIf)) <= priority) )
{
/* The required interface is the first node and needs
higher priority than the following node, only update
of the priority is required for this node */
break;
}
/* The required interface is the first node but doesn't need
higher priority than the following node so the following
node will be the first node of the list */
else
{
SlNetIf_listHead = ifListNode->next;
connectAgain = true;
}
}
/* The required interface isn't the first or last node and needs
priority change but is in the correct location, only update
of the priority is required for this node */
else if ( (GET_IF_PRIORITY(prvIfListNode->netIf) >= priority) && ((GET_IF_PRIORITY(ifListNode->next->netIf)) <= priority) )
{
break;
}
/* The required interface isn't the first or last node and needs
priority change, disconnect it from the list. connect the
previous node with the following node */
else
{
prvIfListNode->next = prvIfListNode->next->next;
connectAgain = true;
}
}
else
{
prvIfListNode = ifListNode;
}
ifListNode = ifListNode->next;
}
/* When connectAgain is set, there's a need to find where to add back
the required interface according to the priority */
if (connectAgain == true)
{
ifListNode = SlNetIf_listHead;
while (NULL != ifListNode)
{
/* If the incoming priority is higher than any present */
if (ifListNode == SlNetIf_listHead)
{
if ((GET_IF_PRIORITY(ifListNode->netIf)) <= priority)
{
reqIfListNode->next = ifListNode;
SlNetIf_listHead = reqIfListNode;
break;
}
}
/* Check if the priority of the current interface is higher of
the required priority, if so, store it as the previous
interface and continue to search until finding interface with
lower priority and than connect the required interface to the
prior interface */
if ((GET_IF_PRIORITY(ifListNode->netIf)) > priority)
{
prvIfListNode = ifListNode;
}
else
{
reqIfListNode->next = prvIfListNode->next;
prvIfListNode->next = reqIfListNode;
break;
}
ifListNode = ifListNode->next;
if (NULL == ifListNode)
{
/* All interfaces have higher priorities than reqIfListNode */
prvIfListNode->next = reqIfListNode;
reqIfListNode->next = NULL;
break;
}
}
}
if (NULL != reqIfListNode)
{
/* Interface exists, set the interface priority */
RESET_IF_PRIORITY(reqIfListNode->netIf);
SET_IF_PRIORITY(reqIfListNode->netIf, priority);
}
return SLNETERR_RET_CODE_OK;
}
//*****************************************************************************
//
// SlNetIf_setState - Set interface state
//
//*****************************************************************************
int32_t SlNetIf_setState(uint16_t ifID, SlNetIfState_e ifState)
{
SlNetIf_t *netIf;
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifID);
/* Check if the requested interface exists or the function returned NULL */
if (NULL == netIf)
{
/* Interface doesn't exists or invalid input, return error code */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
else
{
/* Interface exists, set the interface state */
if (ifState == SLNETIF_STATE_DISABLE)
{
/* Interface state - Disable */
SET_IF_STATE_DISABLE(*netIf);
}
else
{
/* Interface state - Enable */
SET_IF_STATE_ENABLE(*netIf);
}
}
return SLNETERR_RET_CODE_OK;
}
//*****************************************************************************
//
// SlNetIf_getState - Get interface state
//
//*****************************************************************************
int32_t SlNetIf_getState(uint16_t ifID)
{
SlNetIf_t *netIf;
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifID);
/* Check if the requested interface exists or the function returned NULL */
if (NULL == netIf)
{
/* Interface doesn't exists or invalid input, return error code */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
else
{
/* Interface exists, return interface state */
return GET_IF_STATE(*netIf);
}
}
//*****************************************************************************
//
// SlNetIf_getIPAddr - Get IP Address of specific interface
//
//*****************************************************************************
int32_t SlNetIf_getIPAddr(uint16_t ifID, SlNetIfAddressType_e addrType, uint16_t *addrConfig, uint32_t *ipAddr)
{
SlNetIf_t *netIf;
int32_t retVal;
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifID);
/* Check if the requested interface exists or the function returned NULL */
if (NULL == netIf)
{
/* Interface doesn't exists or invalid input, return NULL */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
else
{
/* Interface exists, return interface IP address */
retVal = (netIf->ifConf)->ifGetIPAddr(netIf->ifContext, addrType, addrConfig, ipAddr);
SLNETIF_NORMALIZE_RET_VAL(retVal,SLNETIF_ERR_IFGETIPADDR_FAILED);
/* Check retVal for error codes */
if (retVal < SLNETERR_RET_CODE_OK)
{
/* Return retVal, function error */
return retVal;
}
else
{
/* Return success */
return SLNETERR_RET_CODE_OK;
}
}
}
//*****************************************************************************
//
// SlNetIf_getConnectionStatus - Get interface connection status
//
//*****************************************************************************
int32_t SlNetIf_getConnectionStatus(uint16_t ifID)
{
SlNetIf_t *netIf;
int16_t connectionStatus;
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifID);
/* Check if the requested interface exists or the function returned NULL */
if (NULL == netIf)
{
/* Interface doesn't exists or invalid input, return NULL */
return SLNETERR_RET_CODE_INVALID_INPUT;
}
else
{
/* Interface exists, return interface connection status */
connectionStatus = (netIf->ifConf)->ifGetConnectionStatus(netIf->ifContext);
/* Interface exists, set the interface state */
if (connectionStatus == SLNETIF_STATUS_DISCONNECTED)
{
/* Interface is disconnected */
return SLNETIF_STATUS_DISCONNECTED;
}
else if (connectionStatus > SLNETIF_STATUS_DISCONNECTED)
{
SLNETIF_NORMALIZE_RET_VAL(connectionStatus,SLNETIF_STATUS_CONNECTED);
}
else
{
SLNETIF_NORMALIZE_RET_VAL(connectionStatus,SLNETIF_ERR_IFGETCONNECTIONSTATUS_FAILED);
}
return connectionStatus;
}
}
//*****************************************************************************
//
// SlNetIf_loadSecObj - Load secured buffer to the network stack
//
//*****************************************************************************
int32_t SlNetIf_loadSecObj(uint16_t objType, char *objName, int16_t objNameLen, uint8_t *objBuff, int16_t objBuffLen, uint32_t ifBitmap)
{
SlNetIf_t *netIf;
int32_t retVal;
uint32_t ifIDIndex = 1; /* Set value to highest bit in uint32_t */
uint32_t maxIDIndex = (uint32_t)1 << SLNETIF_MAX_IF;
/* validate params */
if ((objName == NULL) || (strlen(objName) != objNameLen) ||
((objType != SLNETIF_SEC_OBJ_TYPE_RSA_PRIVATE_KEY) &&
(objType != SLNETIF_SEC_OBJ_TYPE_CERTIFICATE) &&
(objType != SLNETIF_SEC_OBJ_TYPE_DH_KEY)))
{
return SLNETERR_RET_CODE_INVALID_INPUT;
}
/* bitmap 0 entered, load sec obj to all available interfaces */
if (0 == ifBitmap)
{
ifBitmap = ~ifBitmap;
}
while ( ifIDIndex < maxIDIndex )
{
/* Check if ifIDIndex is a required ifID from the ifBitmap */
if ( ifIDIndex & ifBitmap )
{
/* Run validity check and find the requested interface */
netIf = SlNetIf_getIfByID(ifIDIndex & ifBitmap);
/* Check if the requested interface exists or the function
returned NULL */
if ( (NULL != netIf) && (NULL != (netIf->ifConf)->ifLoadSecObj) )
{
/* Interface exists, return interface IP address */
retVal = (netIf->ifConf)->ifLoadSecObj(netIf->ifContext, objType, objName, objNameLen, objBuff, objBuffLen);
SLNETIF_NORMALIZE_RET_VAL(retVal,SLNETIF_ERR_IFLOADSECOBJ_FAILED);
/* Check retVal for error codes */
if (retVal < SLNETERR_RET_CODE_OK)
{
/* Return retVal, function error */
return retVal;
}
else
{
/* Return success */
return SLNETERR_RET_CODE_OK;
}
}
}
ifIDIndex <<= 1;
}
/* Interface doesn't exists or invalid input, return error code */
return SLNETERR_RET_CODE_INVALID_INPUT;
}

View File

@ -0,0 +1,630 @@
/*
* Copyright (c) 2017-2019, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*****************************************************************************/
/* Include files */
/*****************************************************************************/
#ifndef __SL_NET_IF_H__
#define __SL_NET_IF_H__
#include <stdint.h>
#include <stdbool.h>
#include <ti/net/slnetsock.h>
#ifdef __cplusplus
extern "C" {
#endif
/*!
\defgroup SlNetIf SlNetIf group
\short Controls standard stack/interface options and capabilities
*/
/*!
\addtogroup SlNetIf
@{
*/
/*****************************************************************************/
/* Macro declarations */
/*****************************************************************************/
/* Interface ID bit pool to be used in interface add and in socket creation */
#define SLNETIF_ID_1 (1 << 0) /**< Interface ID 1 */
#define SLNETIF_ID_2 (1 << 1) /**< Interface ID 2 */
#define SLNETIF_ID_3 (1 << 2) /**< Interface ID 3 */
#define SLNETIF_ID_4 (1 << 3) /**< Interface ID 4 */
#define SLNETIF_ID_5 (1 << 4) /**< Interface ID 5 */
#define SLNETIF_ID_6 (1 << 5) /**< Interface ID 6 */
#define SLNETIF_ID_7 (1 << 6) /**< Interface ID 7 */
#define SLNETIF_ID_8 (1 << 7) /**< Interface ID 8 */
#define SLNETIF_ID_9 (1 << 8) /**< Interface ID 9 */
#define SLNETIF_ID_10 (1 << 9) /**< Interface ID 10 */
#define SLNETIF_ID_11 (1 << 10) /**< Interface ID 11 */
#define SLNETIF_ID_12 (1 << 11) /**< Interface ID 12 */
#define SLNETIF_ID_13 (1 << 12) /**< Interface ID 13 */
#define SLNETIF_ID_14 (1 << 13) /**< Interface ID 14 */
#define SLNETIF_ID_15 (1 << 14) /**< Interface ID 15 */
#define SLNETIF_ID_16 (1 << 15) /**< Interface ID 16 */
#define SLNETIF_MAX_IF (16) /**< Maximum interface */
/* this macro returns 0 when only one bit is set and a number when it isn't */
#define ONLY_ONE_BIT_IS_SET(x) (((x > 0) && ((x & (x - 1)) == 0))?true:false)
/* Interface connection status bit pool to be used in set interface connection status function */
#define SLNETIF_STATUS_DISCONNECTED (0)
#define SLNETIF_STATUS_CONNECTED (1)
/*!
\brief Interface state bit pool to be used in set interface state function
*/
typedef enum
{
SLNETIF_STATE_DISABLE = 0,
SLNETIF_STATE_ENABLE = 1
} SlNetIfState_e;
/*!
\brief Address type enum to be used in get ip address function
*/
typedef enum
{
SLNETIF_IPV4_ADDR = 0,
SLNETIF_IPV6_ADDR_LOCAL = 1,
SLNETIF_IPV6_ADDR_GLOBAL = 2
} SlNetIfAddressType_e;
/* Address config return values that can be retrieved in get ip address function */
#define SLNETIF_ADDR_CFG_UNKNOWN (0)
#define SLNETIF_ADDR_CFG_DHCP (1)
#define SLNETIF_ADDR_CFG_DHCP_LLA (2)
#define SLNETIF_ADDR_CFG_STATIC (4)
#define SLNETIF_ADDR_CFG_STATELESS (5)
#define SLNETIF_ADDR_CFG_STATEFUL (6)
/* Security object types for load Sec Obj function */
#define SLNETIF_SEC_OBJ_TYPE_RSA_PRIVATE_KEY (1)
#define SLNETIF_SEC_OBJ_TYPE_CERTIFICATE (2)
#define SLNETIF_SEC_OBJ_TYPE_DH_KEY (3)
/*!
Check if interface state is enabled.
\sa SlNetIf_queryIf()
*/
#define SLNETIF_QUERY_IF_STATE_BIT (1 << 0)
/*!
Check if interface connection status is connected.
\sa SlNetIf_queryIf()
*/
#define SLNETIF_QUERY_IF_CONNECTION_STATUS_BIT (1 << 1)
/*!
Enable last partial match in an interface search, if no existing
interface matches the query completely.
\sa SlNetIf_queryIf()
*/
#define SLNETIF_QUERY_IF_ALLOW_PARTIAL_MATCH_BIT (1 << 2)
/*****************************************************************************/
/* Structure/Enum declarations */
/*****************************************************************************/
/*!
\brief SlNetIf_Config_t structure contains all the function callbacks that are expected to be filled by the relevant network stack interface \n
Each interface has different capabilities, so not all the API's must be supported therefore an API's can be defined as:
- <b>Mandatory API's</b> - must be supported by the interface in order to be part of SlNetSock layer
- <b>Non-Mandatory API's</b> - can be supported, but not mandatory for basic SlNetSock proper operation
\note Interface that is not supporting a non-mandatory API should set it to \b NULL in its function list
\sa SlNetIf_Config_t
*/
typedef struct SlNetIf_Config_t
{
/* socket related API's */
int16_t (*sockCreate) (void *ifContext, int16_t domain, int16_t type, int16_t protocol, void **sdContext); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_create */
int32_t (*sockClose) (int16_t sd, void *sdContext); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_close */
int32_t (*sockShutdown) (int16_t sd, void *sdContext, int16_t how); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_shutdown */
int16_t (*sockAccept) (int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen, uint8_t flags, void **acceptedSdContext); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_accept */
int32_t (*sockBind) (int16_t sd, void *sdContext, const SlNetSock_Addr_t *addr, int16_t addrlen); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_bind */
int32_t (*sockListen) (int16_t sd, void *sdContext, int16_t backlog); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_listen */
int32_t (*sockConnect) (int16_t sd, void *sdContext, const SlNetSock_Addr_t *addr, SlNetSocklen_t addrlen, uint8_t flags); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_connect */
int32_t (*sockGetPeerName) (int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_getPeerName */
int32_t (*sockGetLocalName) (int16_t sd, void *sdContext, SlNetSock_Addr_t *addr, SlNetSocklen_t *addrlen); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_getSockName */
int32_t (*sockSelect) (void *ifContext, int16_t nsds, SlNetSock_SdSet_t *readsds, SlNetSock_SdSet_t *writesds, SlNetSock_SdSet_t *exceptsds, SlNetSock_Timeval_t *timeout); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_select */
int32_t (*sockSetOpt) (int16_t sd, void *sdContext, int16_t level, int16_t optname, void *optval, SlNetSocklen_t optlen); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_setOpt */
int32_t (*sockGetOpt) (int16_t sd, void *sdContext, int16_t level, int16_t optname, void *optval, SlNetSocklen_t *optlen); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_getOpt */
int32_t (*sockRecv) (int16_t sd, void *sdContext, void *buf, uint32_t len, uint32_t flags); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_recv */
int32_t (*sockRecvFrom) (int16_t sd, void *sdContext, void *buf, uint32_t len, uint32_t flags, SlNetSock_Addr_t *from, SlNetSocklen_t *fromlen); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_recvFrom */
int32_t (*sockSend) (int16_t sd, void *sdContext, const void *buf, uint32_t len, uint32_t flags); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_send */
int32_t (*sockSendTo) (int16_t sd, void *sdContext, const void *buf, uint32_t len, uint32_t flags, const SlNetSock_Addr_t *to, SlNetSocklen_t tolen); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetSock_sendTo */
int32_t (*sockstartSec) (int16_t sd, void *sdContext, SlNetSockSecAttrib_t *secAttrib, uint8_t flags); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetSock_startSec */
/* util related API's */
int32_t (*utilGetHostByName) (void *ifContext, char *name, const uint16_t nameLen, uint32_t *ipAddr, uint16_t *ipAddrLen, const uint8_t family); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetUtil_getHostByName */
/* if related API's */
int32_t (*ifGetIPAddr) (void *ifContext, SlNetIfAddressType_e addrType, uint16_t *addrConfig, uint32_t *ipAddr); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetIf_getIPAddr */
int32_t (*ifGetConnectionStatus) (void *ifContext); /*!< \b Mandatory API \n The actual implementation of the interface for ::SlNetIf_getConnectionStatus */
int32_t (*ifLoadSecObj) (void *ifContext, uint16_t objType, char *objName, int16_t objNameLen, uint8_t *objBuff, int16_t objBuffLen); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetIf_loadSecObj */
int32_t (*ifCreateContext) (uint16_t ifID, const char *ifName, void **ifContext); /*!< \b Non-Mandatory API \n The actual implementation of the interface for ::SlNetIf_add */
} SlNetIf_Config_t;
/*!
\brief The SlNetIf_t structure holds the configuration of the interface
Its ID, name, flags and the configuration list - ::SlNetIf_Config_t.
*/
typedef struct SlNetIf_t
{
uint32_t ifID;
char *ifName;
int32_t flags;
SlNetIf_Config_t *ifConf;
void *ifContext;
} SlNetIf_t;
/*****************************************************************************/
/* Function prototypes */
/*****************************************************************************/
/*!
\brief Initialize the SlNetIf module
\param[in] flags For future usage,
The value 0 may be used in order to run the
default flags
\return Zero on success, or negative error code on failure
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_init snippet
*/
int32_t SlNetIf_init(int32_t flags);
/*!
\brief Add a new SlNetIf-compatible interface to the system
The SlNetIf_add function allows the application to add specific interfaces
with their priorities and function list.\n
This function gives full control to the application on the interfaces.
\param[in] ifID Specifies the interface which needs
to be added.\n
The values of the interface identifier
is defined with the prefix SLNETIF_ID_
which defined in slnetif.h
\param[in] ifName Specifies the name of the interface,
\b Note: Can be set to NULL, but when set to NULL
cannot be used with SlNetIf_getIDByName()
\param[in] ifConf Specifies the function list for the
interface
\param[in] priority Specifies the priority of the interface
(In ascending order).
Note: maximum priority is 15
\return Zero on success, or negative error code on failure
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_add wifi snippet
\snippet ti/net/test/snippets/slnetif.c SlNetIf_add NDK snippet
\snippet ti/net/test/snippets/slnetif.c SlNetIf_add NDKSec snippet
*/
int32_t SlNetIf_add(uint16_t ifID, char *ifName, const SlNetIf_Config_t *ifConf, uint8_t priority);
/*!
\brief Get interface configuration from interface ID
The SlNetIf_getIfByID function retrieves the configuration of the
requested interface.
\param[in] ifID Specifies the interface which its configuration
needs to be retrieved.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\return A pointer to the configuration of the
interface on success, or NULL on failure
\sa SlNetIf_add()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getIfByID snippet
*/
SlNetIf_t * SlNetIf_getIfByID(uint16_t ifID);
/*!
\brief Query for the highest priority interface, given a list of
interfaces and properties.
\param[in] ifBitmap The bit-wise OR of interfaces to be searched.\n
Note: Zero is currently not valid.
\param[in] queryBitmap The bit-wise OR of additional query criteria.
\remarks @c queryBitmap can be set to :
- #SLNETIF_QUERY_IF_STATE_BIT
- #SLNETIF_QUERY_IF_CONNECTION_STATUS_BIT
- #SLNETIF_QUERY_IF_ALLOW_PARTIAL_MATCH_BIT
\return A pointer to the configuration of a found
interface on success, or NULL on failure
\sa SlNetIf_add()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_queryIf snippet
*/
SlNetIf_t * SlNetIf_queryIf(uint32_t ifBitmap, uint32_t queryBitmap);
/*!
\brief Get interface Name from interface ID
The SlNetIf_getNameByID function retrieves the name of the requested
interface.
\param[in] ifID Specifies the interface which its name needs
to be retrieved.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\return A pointer to the name of the interface on
success, or NULL on failure
\sa SlNetIf_add()
\sa SlNetIf_getIDByName()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getNameByID snippet
*/
const char * SlNetIf_getNameByID(uint16_t ifID);
/*!
\brief Get interface ID from interface name
The SlNetIf_getIDByName function retrieves the interface identifier of the
requested interface name.
\param[in] ifName Specifies the interface which its interface
identifier needs to be retrieved.\n
\return The interface identifier value of the interface
on success, or negative error code on failure
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\sa SlNetIf_add()
\sa SlNetIf_getNameByID()
\sa SlNetSock_getIfID()
\note - Input NULL as ifName will return error code.
- When using more than one interface with the same
name, the ID of the highest priority interface
will be returned
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getIDByName snippet
*/
int32_t SlNetIf_getIDByName(char *ifName);
/*!
\brief Get interface priority
The SlNetIf_getPriority function retrieves the priority of the
interface.
\param[in] ifID Specifies the interface which its priority
needs to be retrieved.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\return The priority value of the interface on success,
or negative error code on failure
\sa SlNetIf_add()
\sa SlNetIf_setPriority()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getPriority snippet
*/
int32_t SlNetIf_getPriority(uint16_t ifID);
/*!
\brief Set interface priority
The SlNetIf_setPriority function sets new priority to the requested interface.
\param[in] ifID Specifies the interface which its priority
needs to be changed.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\param[in] priority Specifies the priority needs to be set.
(In ascending order)
Note: maximum priority is 15
\return Zero on success, or negative error code on
failure
\sa SlNetIf_add()
\sa SlNetIf_getPriority()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_setPriority snippet
*/
int32_t SlNetIf_setPriority(uint16_t ifID, uint8_t priority);
/*!
\brief Set interface state
Enable or disable the interface.
\param[in] ifID Specifies the interface which its state
needs to be changed.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\param[in] ifState Specifies the interface state.\n
The values of the interface state are defined
with the prefix SLNETIF_INTERFACE_ which
defined in slnetif.h
\return Zero on success, or negative error code on
failure
\sa SlNetIf_add()
\sa SlNetIf_getState()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_setState snippet
*/
int32_t SlNetIf_setState(uint16_t ifID, SlNetIfState_e ifState);
/*!
\brief Get interface state
Obtain the current state of the interface.
\param[in] ifID Specifies the interface which its state needs
to be retrieved.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\return State of the interface on success, or negative
error code on failure
\sa SlNetIf_add()
\sa SlNetIf_setState()
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getState snippet
*/
int32_t SlNetIf_getState(uint16_t ifID);
/*!
\brief Get the connection status of an interface
\param[in] ifID Interface ID
\return @c SLNETIF_STATUS_ value on success,
or negative error code on failure
\remark @c ifID should be a value with the @c SLNETIF_ID_
prefix
\sa SlNetIf_add()
\sa SLNETIF_STATUS_CONNECTED
\sa SLNETIF_STATUS_DISCONNECTED
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getConnectionStatus snippet
*/
int32_t SlNetIf_getConnectionStatus(uint16_t ifID);
/*!
\brief Get IP Address of specific interface
The SlNetIf_getIPAddr function retrieve the IP address of a specific
interface according to the Address Type, IPv4, IPv6 LOCAL
or IPv6 GLOBAL.
\param[in] ifID Specifies the interface which its connection
state needs to be retrieved.\n
The values of the interface identifier is
defined with the prefix SLNETIF_ID_ which
defined in slnetif.h
\param[in] addrType Address type:
- #SLNETIF_IPV4_ADDR
- #SLNETIF_IPV6_ADDR_LOCAL
- #SLNETIF_IPV6_ADDR_GLOBAL
\param[out] addrConfig Address config:
- #SLNETIF_ADDR_CFG_UNKNOWN
- #SLNETIF_ADDR_CFG_DHCP
- #SLNETIF_ADDR_CFG_DHCP_LLA
- #SLNETIF_ADDR_CFG_STATIC
- #SLNETIF_ADDR_CFG_STATELESS
- #SLNETIF_ADDR_CFG_STATEFUL
\param[out] ipAddr IP Address according to the Address Type
\return Zero on success, or negative error code on failure
\sa SlNetIfAddressType_e
\slnetif_not_threadsafe
\par Examples
\snippet ti/net/test/snippets/slnetif.c SlNetIf_getIPAddr snippet
*/
int32_t SlNetIf_getIPAddr(uint16_t ifID, SlNetIfAddressType_e addrType, uint16_t *addrConfig, uint32_t *ipAddr);
/*!
\brief Load/unload/replace a secure object into a network interface/stack
SlNetIf_loadSecObj() loads a named secure object into specific
network stack for future use by secure sockets. To unload the
named secure object, pass a NULL object buffer with the
appropriate name.
\param[in] objType The secure object type:
- #SLNETIF_SEC_OBJ_TYPE_RSA_PRIVATE_KEY
- #SLNETIF_SEC_OBJ_TYPE_CERTIFICATE
- #SLNETIF_SEC_OBJ_TYPE_DH_KEY
\param[in] objName The secure object name
\param[in] objNameLen The secure object name length
\param[in] objBuff The secure object buffer to be loaded, or
NULL if the named object is to be unloaded
\param[in] objBuffLen The secure object buffer length
\param[in] ifBitmap The interfaces which the secure
objects should be loaded to
\remark Loaded secure objects are added to secure attributes using
the SlNetSock_secAttribCreate(),
SlNetSock_secAttribSet(), and
SlNetSock_secAttribDelete() lifecycle APIs. The
loading/unloading of secure objects (via
SlNetIf_loadSecObj()) must be done while the secure
object is not associated with any existing secure
attributes. Restating, you must delete any existing
secure attributes before changing any secure objects
associated with them.
\remark The values of @c ifBitmap typically have the prefix
@c SLNETIF_ID_.
\remark SlNetIf_loadSecObj() internally validates the @c objName,
@c objNameLen, and @c objType arguments, so the
underlying interface/stack functions do not need to
check them again.
\remark For stacks that use file systems (e.g. CC3XXX), @c objName
will be the file name used on the file system.
\remark Note that ownership of @c objBuff after returning from
SlNetIf_loadSecObj() varies by stack/interface, often
depending on how the underlying stack implements it's
TLS support.
- On CC3XXX-based stacks, the TLS support is managed
on a separate network processor, and loading a
secure object results in persisting the secure
object to a file system. As a result, after
successfully calling SlNetIf_loadSecObj(), the @c
objBuff is no longer needed, and can be considered
"owned" by the application.
- On NDK-based stacks, the TLS support is typically
managed by a software library like mbedTLS. As a
result, only a reference to @c objBuff is made
within the SlNetIf_loadSecObj() call, and the
buffer must persist as long as the secure object
remains loaded. Ownership of the buffer returns
to the user only after unloading the secure
object (or resetting the device).
\remark To replace an existing named secure object with another
secure object of the same name, call
SlNetIf_loadSecObj() with the same @c objName.
Resources associated with the previously loaded secure
object will be released and replaced by the new secure
object.
\remark When unloading a named secure object, @c objBuffLen is
ignored.
\return 0 on success, negative on failure. Common errors include:
- #SLNETERR_RET_CODE_INVALID_INPUT
- #SLNETERR_RET_CODE_NO_FREE_SPACE
- #SLNETERR_RET_CODE_MALLOC_ERROR
\sa SlNetSock_setOpt()
\sa SlNetSock_secAttribSet()
\slnetif_not_threadsafe
*/
int32_t SlNetIf_loadSecObj(uint16_t objType, char *objName, int16_t objNameLen, uint8_t *objBuff, int16_t objBuffLen, uint32_t ifBitmap);
/*!
Close the Doxygen group.
@}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __SL_NET_IF_H__ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,428 @@
/*
* Copyright (c) 2017-2019, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*****************************************************************************/
/* Include files */
/*****************************************************************************/
#ifndef __SL_NET_UTILS_H__
#define __SL_NET_UTILS_H__
#include <stddef.h>
#include "slnetsock.h"
#ifdef __cplusplus
extern "C" {
#endif
/*!
\defgroup SlNetUtils SlNetUtils group
\short Sockets related commands and configuration
*/
/*!
\addtogroup SlNetUtils
@{
*/
/*****************************************************************************/
/* Macro declarations */
/*****************************************************************************/
#define SLNETUTIL_AI_PASSIVE 0x00000001
#define SLNETUTIL_AI_NUMERICHOST 0x00000004
/*****************************************************************************/
/* Structure/Enum declarations */
/*****************************************************************************/
typedef struct SlNetUtil_addrInfo_t {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
struct SlNetSock_Addr_t *ai_addr;
char *ai_canonname;
struct SlNetUtil_addrInfo_t *ai_next;
} SlNetUtil_addrInfo_t;
/* Creating one address parameter from 4 separate address parameters */
#define SLNETUTIL_IPV4_VAL(add_3,add_2,add_1,add_0) ((((uint32_t)add_3 << 24) & 0xFF000000) | (((uint32_t)add_2 << 16) & 0xFF0000) | (((uint32_t)add_1 << 8) & 0xFF00) | ((uint32_t)add_0 & 0xFF) )
/*****************************************************************************/
/* Function prototypes */
/*****************************************************************************/
/*!
\brief Initialize the SlNetUtil module
\param[in] flags Reserved
\return Zero on success, or negative error code on failure
*/
int32_t SlNetUtil_init(int32_t flags);
/*!
\brief Return text descriptions of getAddrInfo error codes
\param[in] errorCode A getAddrInfo error code
\return Text description of the passed in getAddrInfo error code.
If the error code does not exist returns "Unknown Error"
*/
const char *SlNetUtil_gaiStrErr(int32_t errorCode);
/*!
\brief Get host IP by name\n
Obtain the IP Address of machine on network, by machine name.
\param[in] ifBitmap Specifies the interfaces which the host ip
needs to be retrieved from according to the
priority until one of them will return an answer.\n
Value 0 is used in order to choose automatic
interfaces selection according to the priority
interface list.
Value can be combination of interfaces by OR'ing
multiple interfaces bit identifiers (SLNETIFC_IDENT_
defined in slnetif.h)
Note: interface identifier bit must be configured
prior to this socket creation using SlNetIf_add().
\param[in] name Host name
\param[in] nameLen Name length
\param[out] ipAddr A buffer used to store the IP address(es) from
the resulting DNS resolution. The caller is
responsible for allocating this buffer. Upon
return, this buffer can be accessed as an array
of IPv4 or IPv6 addresses, depending on the
protocol passed in for the family parameter.
Addresses are stored in host byte order.
\param[in,out] ipAddrLen Initially holds the number of IP addresses
that the ipAddr buffer parameter is capable of
storing. Upon successful return, the ipAddrLen
parameter contains the number of IP addresses
that were actually written into the ipAddr
buffer, as a result of successful DNS
resolution, or zero if DNS resolution failed.
\param[in] family Protocol family
\return The interface ID of the interface which was
able to successfully run the function, or
negative on failure.\n
#SLNETERR_POOL_IS_EMPTY may be return in case
there are no resources in the system\n
Possible DNS error codes:
- #SLNETERR_NET_APP_DNS_QUERY_NO_RESPONSE
- #SLNETERR_NET_APP_DNS_NO_SERVER
- #SLNETERR_NET_APP_DNS_QUERY_FAILED
- #SLNETERR_NET_APP_DNS_MALFORMED_PACKET
- #SLNETERR_NET_APP_DNS_MISMATCHED_RESPONSE
\slnetutil_init_precondition
\warning
In case an IP address in a string format is set as input, without
any prefix (e.g. "1.2.3.4") the device will not try to access the
DNS and it will return the input address in the \c ipAddr field
\par Example
- Getting IPv4 using get host by name:
\code
// A buffer capable of storing a single 32-bit IPv4 address
uint32_t DestIP[1];
// The number of IP addresses that DestIP can hold
uint16_t DestIPListSize = 1;
int32_t ifID;
int16_t SockId;
SlNetSock_AddrIn_t LocalAddr; //address of the server to connect to
int32_t LocalAddrSize;
ifID = SlNetUtil_getHostByName(0, "www.ti.com", strlen("www.ti.com"), DestIP, &DestIPListSize, SLNETSOCK_PF_INET);
LocalAddr.sin_family = SLNETSOCK_AF_INET;
LocalAddr.sin_addr.s_addr = SlNetUtil_htonl(DestIP[0]);
LocalAddr.sin_port = SlNetUtil_htons(80);
LocalAddrSize = sizeof(SlNetSock_AddrIn_t);
SockId = SlNetSock_create(SLNETSOCK_AF_INET, SLNETSOCK_SOCK_STREAM, ifID, 0);
if (SockId >= 0)
{
status = SlNetSock_connect(SockId, (SlNetSock_Addr_t *)&LocalAddr, LocalAddrSize);
}
\endcode
*/
int32_t SlNetUtil_getHostByName(uint32_t ifBitmap, char *name, const uint16_t nameLen, uint32_t *ipAddr, uint16_t *ipAddrLen, const uint8_t family);
/*!
\brief Network address and service translation
Create an IPv4 or IPv6 socket address structure, to be used with bind()
and/or connect() to create a client or server socket
This is a "minimal" version for support on embedded devices. Supports a
host name or an IPv4 or IPv6 address string passed in via the 'node'
parameter for creating a client socket. A value of NULL should be passed
for 'node' with AI_PASSIVE flag set to create a (non-loopback) server
socket.
The caller is responsible for freeing the allocated results by calling
SlNetUtil_freeAddrInfo().
\param[in] ifID Specifies the interface which needs
to used for socket operations.\n
The values of the interface identifier
is defined with the prefix SLNETIF_ID_
which defined in slnetif.h
\param[in] node An IP address or a host name.
\param[in] service The port number of the service to bind or connect to.
\param[in] hints An SlNetUtil_addrInfo_t struct used to filter the
results returned.
\param[out] res one or more SlNetUtil_addrInfo_t structs, each of which
can be used to bind or connect a socket.
\return Returns 0 on success, or an error code on failure.
\sa SlNetUtil_freeAddrInfo()
*/
int32_t SlNetUtil_getAddrInfo(uint16_t ifID, const char *node,
const char *service, const struct SlNetUtil_addrInfo_t *hints,
struct SlNetUtil_addrInfo_t **res);
/*!
\brief Free the results returned from SlNetUtil_getAddrInfo
Free the chain of SlNetUtil_addrInfo_t structs allocated and returned by
SlNetUtil_getAddrInfo
\param[in] res linked list of results returned from SlNetUtil_getAddrInfo
\return None.
\sa SlNetUtil_getAddrInfo()
*/
void SlNetUtil_freeAddrInfo(struct SlNetUtil_addrInfo_t *res);
/*!
\brief Reorder the bytes of a 32-bit unsigned value
This function is used to reorder the bytes of a 32-bit unsigned value
from host order to network order.
\param[in] val Variable in host order
\return Return the variable in network order
\slnetutil_init_precondition
\sa SlNetSock_bind()
\sa SlNetSock_connect()
\sa SlNetSock_recvFrom()
\sa SlNetSock_accept()
*/
uint32_t SlNetUtil_htonl(uint32_t val);
/*!
\brief Reorder the bytes of a 32-bit unsigned value
This function is used to reorder the bytes of a 32-bit unsigned
value from network order to host order.
\param[in] val Variable in network order
\return Return the variable in host order
\slnetutil_init_precondition
\sa SlNetSock_bind()
\sa SlNetSock_connect()
\sa SlNetSock_recvFrom()
\sa SlNetSock_accept()
*/
uint32_t SlNetUtil_ntohl(uint32_t val);
/*!
\brief Reorder the bytes of a 16-bit unsigned value
This functions is used to reorder the bytes of a 16-bit unsigned
value from host order to network order.
\param[in] val Variable in host order
\return Return the variable in network order
\slnetutil_init_precondition
\sa SlNetSock_bind()
\sa SlNetSock_connect()
\sa SlNetSock_recvFrom()
\sa SlNetSock_accept()
*/
uint16_t SlNetUtil_htons(uint16_t val);
/*!
\brief Reorder the bytes of a 16-bit unsigned value
This functions is used to reorder the bytes of a 16-bit unsigned value
from network order to host order.
\param[in] val Variable in network order
\return Return the variable in host order
\slnetutil_init_precondition
\sa SlNetSock_bind()
\sa SlNetSock_connect()
\sa SlNetSock_recvFrom()
\sa SlNetSock_accept()
*/
uint16_t SlNetUtil_ntohs(uint16_t val);
/*!
\brief Convert an IPv4 address in string format to binary format
This function converts an IPv4 address stored as a character string to a
32-bit binary value in network byte order. Note that a leading zero or a
"0x" in the address string are interpreted as octal or hexadecimal,
respectively. The function stores the IPv4 address in the address structure
pointed to by the addr parameter.
\param[in] str IPv4 address string in dotted decimal format
\param[out] addr pointer to an IPv4 address structure. The converted binary
address is stored in this structure upon return (in network byte order)
\return returns nonzero if the address string is valid, zero if not
*/
int SlNetUtil_inetAton(const char *str, struct SlNetSock_InAddr_t *addr);
/*!
\brief Converts IP address in binary representation to string representation
This functions is used to converts IP address in binary representation
to IP address in string representation.
\param[in] addrFamily Specifies the address family of the created
socket
For example:
- #SLNETSOCK_AF_INET for network address IPv4
- #SLNETSOCK_AF_INET6 for network address IPv6
\param[in] binaryAddr Pointer to an IP address structure indicating the
address in binary representation. The address
is assumed to be in network-byte order
\param[out] strAddr Pointer to the address string representation
for IPv4 or IPv6 according to the address
family
\param[in] strAddrLen Specifies the length of the StrAddress_dst,
the maximum length of the address in string
representation for IPv4 or IPv6 according to
the address family
\return strAddr on success, or NULL on failure
\slnetutil_init_precondition
\par Example
- IPv4 demo of inet_ntop()
\code
SlNetSock_AddrIn_t sa;
char str[SLNETSOCK_INET_ADDRSTRLEN];
// store this IP address in sa:
SlNetUtil_inetPton(SLNETSOCK_AF_INET, "192.0.2.33", &(sa.sin_addr));
// now get it back and print it
SlNetUtil_inetNtop(SLNETSOCK_AF_INET, &(sa.sin_addr), str, SLNETSOCK_INET_ADDRSTRLEN);
\endcode
*/
const char *SlNetUtil_inetNtop(int16_t addrFamily, const void *binaryAddr, char *strAddr, SlNetSocklen_t strAddrLen);
/*!
\brief Converts IP address in string representation to binary representation
This functions is used to converts IP address in string representation
to IP address in binary representation.
\param[in] addrFamily Specifies the address family of the created
socket
For example:
- #SLNETSOCK_AF_INET for network address IPv4
- #SLNETSOCK_AF_INET6 for network address IPv6
\param[in] strAddr Specifies the IP address in string representation
for IPv4 or IPv6 according to the address family
\param[out] binaryAddr Pointer to an address structure that will be
filled by the IP address in Binary representation.
The address is returned in network-byte order
\return 1 on success, -1 on failure, or 0 if the input
isn't a valid IP address
\slnetutil_init_precondition
\par Example
- IPv6 demo of inet_pton()
\code
SlNetSock_AddrIn6_t sa;
// store this IP address in sa:
SlNetUtil_inetPton(SLNETSOCK_AF_INET6, "0:0:0:0:0:0:0:0", &(sa.sin6_addr));
\endcode
*/
int32_t SlNetUtil_inetPton(int16_t addrFamily, const char *strAddr, void *binaryAddr);
/*!
Close the Doxygen group.
@}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __SL_NET_UTILS_H__ */