I am currently trying to get the http_client example working on CC3100Boost + MSP430F5529LP with TLS/SSL. Additional details with respect to configuration is describe CC3100BOOST: Issue enabling secure connection (TLS/SSL) on CC3100Boost + MSP430F5529LP.
As of now I believe the problem is somewhere in the function HTTPCli_connect() in httpcli.c routine.
/*
* ======== HTTPCli_connect ========
*/
int HTTPCli_connect(HTTPCli_Struct *cli, const struct sockaddr *addr,
int flags, const HTTPCli_Params *params)
{
int skt;
int ret;
int slen;
int sopt = 0;
struct timeval tv;
struct sockaddr *sa;
Ssock_Struct ssock;
xassert(cli != NULL);
xassert(addr != NULL);
if (proxyAddr.sa_family != 0) {
sa = &proxyAddr;
}
else {
sa = (struct sockaddr *)addr;
}
if (sa->sa_family == AF_INET6) {
slen = sizeof(struct sockaddr_in6);
}
else {
slen = sizeof(struct sockaddr_in);
}
if (!getCliState(cli, INPROGRESS_FLAG)) {
#ifndef HTTPCli_LIBTYPE_MIN
if (params != NULL) {
cli->shandle = params->shandle;
cli->chandle = params->chandle;
cli->rhandle = params->rhandle;
#ifndef __linux__
cli->stackSize = params->stackSize;
cli->priority = params->priority;
#endif /* __linux__ */
if (cli->chandle) {
xassert(cli->shandle != NULL);
}
if (cli->shandle) {
xassert(params->shandle->handle1xx != NULL);
xassert(params->shandle->handle2xx != NULL);
xassert(params->shandle->handle4xx != NULL);
}
}
#endif /* HTTPCli_LIBTYPE_MIN */
#ifdef __SL__
if (flags & HTTPCli_TYPE_TLS) {
sopt = SL_SEC_SOCKET;
}
#endif /* __SL__ */
skt = socket(sa->sa_family, SOCK_STREAM, sopt);
if (isValidSocket(skt)) {
Ssock_construct(&ssock, skt);
cli->ssock = ssock;
if (params != NULL && params->timeout) {
tv.tv_sec = params->timeout;
tv.tv_usec = 0;
if (setsockopt(skt, SOL_SOCKET, SO_RCVTIMEO, &tv,
sizeof(tv)) < 0) {
HTTPCli_disconnect(cli);
return (HTTPCli_ESOCKETFAIL);
}
}
#ifdef __SL__
/* In SL, the secure params have to be set before connect */
if (flags & HTTPCli_TYPE_TLS) {
ret = startSecureMode(cli);
if (ret < 0) {
HTTPCli_disconnect(cli);
return (ret);
}
}
#endif /*__SL__*/
}
else {
return (HTTPCli_ESOCKETFAIL);
}
}
ret = connect(skt, sa, slen);
if (ret < 0) {
#ifdef __SLP__
if (errno(skt) == EINPROGRESS) {
setCliState(cli, INPROGRESS_FLAG, 1);
return (HTTPCli_EINPROGRESS);
}
#endif /* __SLP__ */
HTTPCli_disconnect(cli);
return (HTTPCli_ECONNECTFAIL);
}
setCliState(cli, INPROGRESS_FLAG, 0);
#if !defined(__SL__) && !defined(__SLP__)
/* In CYASSL, the secure params are set after connect */
if (flags & HTTPCli_TYPE_TLS) {
/* Tunnel using HTTP CONNECT for TLS through proxy */
if (proxyAddr.sa_family != 0) {
ret = httpProxyTunnel(cli, addr);
if (ret < 0) {
return (HTTPCli_EPROXYTUNNELFAIL);
}
}
ret = startSecureMode(cli);
if (ret < 0) {
HTTPCli_disconnect(cli);
return (ret);
}
}
#endif /* __SL__ || __SLP__ */
#ifdef __SLP__
if (params->rnotify) {
ret = setsocknotify(skt, SO_READNOTIFY, params->rnotify, cli);
if (ret < 0) {
return (HTTPCli_ESETNOTIFYFAIL);
}
}
if (params->wnotify) {
ret = setsocknotify(skt, SO_WRITENOTIFY, params->wnotify, cli);
if (ret < 0) {
return (HTTPCli_ESETNOTIFYFAIL);
}
}
if (params->enotify) {
ret = setsocknotify(skt, SO_EXCEPTNOTIFY, params->enotify, cli);
if (ret < 0) {
return (HTTPCli_ESETNOTIFYFAIL);
}
}
#endif /* __SLP__ */
return (0);
}
The software correctly call the connect() function which returns response of 0, but the code goes in to the code incorrectly executes the HTTPCli_disconnect() function. I have relisted the code section below.
ret = connect(skt, sa, slen);
if (ret < 0) {
#ifdef __SLP__
if (errno(skt) == EINPROGRESS) {
setCliState(cli, INPROGRESS_FLAG, 1);
return (HTTPCli_EINPROGRESS);
}
#endif /* __SLP__ */
HTTPCli_disconnect(cli);
return (HTTPCli_ECONNECTFAIL);
}
Also below are list of defined macros for the project.
Additionally I did also dig a little bit more deeper and found that the an error of -456 is generate a inside sl_connect() function in socket.c file. I believe the following line code is where the error is generated.
/* wait for async and get Data Read parameters */ SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);