From 2e69313eb303720bd1bd2adda565d30029352ff2 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Mon, 17 Feb 2014 17:40:42 +0900 Subject: [PATCH] Multiple callbacks, fixed initialize ssl->lwipCtx, io.c --- IDE/IAR-EWARM/CyaSSL/https-nb.c | 63 +++++++++++++++++++++++---------- src/io.c | 22 ++++++++++-- 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/IDE/IAR-EWARM/CyaSSL/https-nb.c b/IDE/IAR-EWARM/CyaSSL/https-nb.c index 84a2d0868..0bb15f6e5 100644 --- a/IDE/IAR-EWARM/CyaSSL/https-nb.c +++ b/IDE/IAR-EWARM/CyaSSL/https-nb.c @@ -41,6 +41,15 @@ #include #include "https-nb.h" +#if 0 +/*Enable debug*/ +#include +#define DBG0_PRINTF(x, ...) printf("[HTTPSClient : DBG]"x"\r\n", ##__VA_ARGS__); +#else +/*Disable debug*/ +#define DBG0_PRINTF(x, ...) +#endif + #if 0 /*Enable debug*/ #include @@ -89,7 +98,7 @@ void CyaSSL_HTTPS_Client_NB_init(void *nb, https_nb->path = path ; https_nb->stat = BEGIN ; } - + int CyaSSL_HTTPS_Client_NB(void *nb) { int ret ; @@ -101,7 +110,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) switch(https_nb->stat) { case BEGIN: - printf("======= LwIP: HTTPS Client Test(%x): %d ====\n", nb, count ++) ; + printf("== HTTPS Client(%x): %d ==\n", nb, count ++) ; /*** Assuming LwIP has been initialized ***/ https_nb->stat = INITIALIZED ; case INITIALIZED: @@ -134,8 +143,8 @@ int CyaSSL_HTTPS_Client_NB(void *nb) case TCP_CONNECT: if(LwIP_cb_mutex)return ERR_OK ; else LwIP_cb_mutex = 1 ; - DBG_PRINTF("LwIPtest: TCP_CONNECT(%x)\n", https_nb) ; - DBG_PRINTF("LwIPtest: Server IP Addrress(%d.%d.%d.%d)\n", + DBG_PRINTF("TCP_CONNECT(%x)\n", https_nb) ; + DBG_PRINTF("Server IP Addrress(%d.%d.%d.%d)\n", (*(unsigned long *)&https_nb->serverIP_em&0xff), (*(unsigned long *)&https_nb->serverIP_em>>8)&0xff, (*(unsigned long *)&https_nb->serverIP_em>>16)&0xff, @@ -144,6 +153,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) https_nb->serverPort, TcpConnectedCallback); if(ret == ERR_OK) { + https_nb->wait_cnt = 0 ; https_nb->stat = WAITING ; return ERR_OK; } else { @@ -153,7 +163,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) } case TCP_CONNECTED: - printf("LwIPtest: TCP CONNECTED(%x)\n", https_nb) ; + DBG0_PRINTF("TCP CONNECTED(%x)\n", https_nb) ; LwIP_cb_mutex = 0 ; /*CyaSSLv3_client_method() @@ -189,7 +199,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) } else { ret = CyaSSL_get_error(https_nb->ssl, NULL) ; if(ret == SSL_ERROR_WANT_READ) { - https_nb->ssl->lwipCtx.wait = -1 ; + https_nb->ssl->lwipCtx.wait = 1000000 ; https_nb->stat = SSL_CONN_WAITING ; return ERR_OK ; } else { @@ -201,7 +211,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) case SSL_CONN_WAITING: - if(https_nb->ssl->lwipCtx.wait-- == 0) { + if(https_nb->ssl->lwipCtx.wait-- <= 0) { /* counting down after the callback for multiple callbacks */ https_nb->stat = SSL_CONN ; LwIP_cb_mutex = 0 ; @@ -215,7 +225,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) int size ; if(LwIP_cb_mutex)return ERR_OK ; else LwIP_cb_mutex = 1 ; /* lock */ - printf("SSL CONNECTED(%x)\n", https_nb) ; + DBG0_PRINTF("SSL CONNECTED(%x)\n", https_nb) ; sprintf(sendBuff, "GET %s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\n\r\n", https_nb->path, https_nb->hostname) ; @@ -223,6 +233,7 @@ int CyaSSL_HTTPS_Client_NB(void *nb) CyaSSL_write(https_nb->ssl, sendBuff, size) ; + https_nb->wait_cnt = 0 ; https_nb->stat = WAITING ; return ERR_OK; } @@ -235,9 +246,8 @@ int CyaSSL_HTTPS_Client_NB(void *nb) LwIP_cb_mutex = 0 ; memset(httpbuff, '\0', HTTP_BUFF_SIZE) ; ret = CyaSSL_read(https_nb->ssl, httpbuff, HTTP_BUFF_SIZE) ; - printf("HTTPS GET(%x), Received(%d)\n",https_nb, strlen(httpbuff)) ; - /* puts(httpbuff) ; */ - /* puts("===================\n") ; */ + DBG0_PRINTF("HTTPS GET(%x), Received(%d)\n",https_nb, strlen(httpbuff)) ; + /*DBG0_PRINTF*/puts(httpbuff) ; } case SSL_CLOSE: { @@ -260,7 +270,20 @@ int CyaSSL_HTTPS_Client_NB(void *nb) https_nb->idle ++ ; if(https_nb->idle > 50000) https_nb->stat = BEGIN ; + return ERR_OK; case WAITING: + if(https_nb->wait_cnt++ > 1000000) { + LwIP_cb_mutex = 0 ; + https_nb->wait_cnt = 0 ; + if((https_nb->stat >= SSL_CONN)&&(https_nb->stat < SSL_CLOSE)) { + ERR_PRINTF("Wait Time out, go to CyaSSL close") ; + https_nb->stat = SSL_CLOSE ; + } else { + ERR_PRINTF("Wait Time out, go to Begin") ; + https_nb->stat = TCP_CLOSE ; + } + } + return ERR_OK ; default: return ERR_OK; } @@ -289,20 +312,23 @@ void *CyaSSL_HTTPS_ClientP_5 = (void *)&CyaSSL_HTTPS_Client_5 ; #define HTTPS_PORT 443 #define IP_ADDR(a,b,c,d) (((a)|((b)<<8)|((c)<<16)|(d)<<24)) -static struct ip_addr server_em = { IP_ADDR(192,168,11,9) } ; +static struct ip_addr server0_em = { IP_ADDR(192,168,11,9) } ; +static struct ip_addr server1_em = { IP_ADDR(31,13,68,33)} ; void HTTPSClient_main_init() { CyaSSL_HTTPS_Client_NB_init(CyaSSL_HTTPS_ClientP_1, - server_em, HTTPS_PORT, "xxx.com", "/") ; + //server_em, HTTPS_PORT, "xxx.com", "/") ; + server1_em, HTTPS_PORT, "graph.facebook.com", "/takashikojo") ; CyaSSL_HTTPS_Client_NB_init(CyaSSL_HTTPS_ClientP_2, - server_em, HTTPS_PORT, "xxx.com", "/") ; + server0_em, HTTPS_PORT, "xxx.com", "/") ; CyaSSL_HTTPS_Client_NB_init(CyaSSL_HTTPS_ClientP_3, - server_em, HTTPS_PORT, "xxx.com", "/") ; + server1_em, HTTPS_PORT, "graph.facebook.com", "/takashikojo") ; + //server_em, HTTPS_PORT, "xxx.com", "/") ; CyaSSL_HTTPS_Client_NB_init(CyaSSL_HTTPS_ClientP_4, - server_em, HTTPS_PORT, "xxx.com", "/") ; + server0_em, HTTPS_PORT, "xxx.com", "/") ; CyaSSL_HTTPS_Client_NB_init(CyaSSL_HTTPS_ClientP_5, - server_em, HTTPS_PORT, "xxx.com", "/") ; + server0_em, HTTPS_PORT, "xxx.com", "/") ; } void HTTPSClient_main(int i) @@ -314,7 +340,7 @@ void HTTPSClient_main(int i) if((i % 2) == 0) { /* wait for initializing TCP/IP, DHCP */ CyaSSL_HTTPS_Client_NB(CyaSSL_HTTPS_ClientP_2) ; } - +#if 0 if((i % 3) == 0) { /* wait for initializing TCP/IP, DHCP */ CyaSSL_HTTPS_Client_NB(CyaSSL_HTTPS_ClientP_3) ; } @@ -327,6 +353,7 @@ void HTTPSClient_main(int i) CyaSSL_HTTPS_Client_NB(CyaSSL_HTTPS_ClientP_5) ; } +#endif } #endif /* NO_MAIN_DRIVER */ diff --git a/src/io.c b/src/io.c index 87dd71a69..1d90de774 100644 --- a/src/io.c +++ b/src/io.c @@ -1070,6 +1070,10 @@ void CyaSSL_SetIO_NetX(CYASSL* ssl, NX_TCP_SOCKET* nxSocket, ULONG waitOption) #define DBG_PRINTF_CB(x, ...) #endif +#ifdef CYASSL_IAR_ARM + #include "intrinsics.h" +#endif + static void CyaSSL_PbufFree(void *vp) { struct pbuf *p ; @@ -1078,7 +1082,7 @@ static void CyaSSL_PbufFree(void *vp) while(p->next != NULL) { next = p->next; - pbuf_free(p); + pbuf_free(p); p = next; } pbuf_free(p); @@ -1092,6 +1096,16 @@ static int CyaSSL_GetDataFromPbuf(char *buff, CYASSL *ssl, int size) int skipLen = 0 ; p = ssl->lwipCtx.pbuf ; + #if defined(DEBUG_PBUF) + printf("WantRead Size=%d\n", size) ; + do { + printf("p=%x, p->len=%d, p->tot_len=%d\n", p, p->len, p->tot_len) ; + if(p != p->next) + p = p->next ; + else break ; + } while(p) ; + p = ssl->lwipCtx.pbuf ; + #endif if(p->tot_len < (ssl->lwipCtx.pulled + size)) return 0 ; @@ -1168,8 +1182,7 @@ err_t CyaSSL_LwIP_recv_cb(void *cb, struct tcp_pcb *pcb, struct pbuf *p, s8_t er ((ssl->options.acceptState != ACCEPT_BEGIN) && (ssl->options.connectState != ACCEPT_THIRD_REPLY_DONE))) { - if(ssl->lwipCtx.wait < 0) /* wait for multiple callbacks */ - ssl->lwipCtx.wait = 10000 ; + ssl->lwipCtx.wait = 100000 ; } else if(ssl->lwipCtx.recv) return ssl->lwipCtx.recv(ssl->lwipCtx.arg, pcb, p, err) ; /* user callback */ @@ -1227,6 +1240,9 @@ int CyaSSL_SetIO_LwIP(CYASSL* ssl, void* pcb, ssl->lwipCtx.recv = recv ; /* recv user callback */ ssl->lwipCtx.sent = sent ; /* sent user callback */ ssl->lwipCtx.arg = arg ; + ssl->lwipCtx.pbuf = 0 ; + ssl->lwipCtx.pulled = 0 ; + ssl->lwipCtx.wait = 0 ; /* CyaSSL_LwIP_recv/sent_cb invokes recv/sent user callback in them. */ tcp_recv(pcb, CyaSSL_LwIP_recv_cb) ; tcp_sent(pcb, CyaSSL_LwIP_sent_cb) ;