240 lines
6.5 KiB
C
240 lines
6.5 KiB
C
/*
|
|
* main.c
|
|
*/
|
|
|
|
#include "main.h"
|
|
#include "util.h"
|
|
|
|
#if !BSPCFG_ENABLE_IO_SUBSYSTEM
|
|
#error This application requires BSPCFG_ENABLE_IO_SUBSYSTEM defined \
|
|
non-zero in user_config.h. Please recompile BSP with this option.
|
|
#endif
|
|
|
|
#ifndef BSP_DEFAULT_IO_CHANNEL_DEFINED
|
|
#error This application requires BSP_DEFAULT_IO_CHANNEL to be not NULL. \
|
|
Please set corresponding BSPCFG_ENABLE_TTYx to non-zero in \
|
|
user_config.h and recompile BSP with this option.
|
|
#endif
|
|
|
|
#if defined BSP_SDCARD_ESDHC_CHANNEL
|
|
#if ! BSPCFG_ENABLE_ESDHC
|
|
#error This application requires BSPCFG_ENABLE_ESDHC defined non-zero in \
|
|
user_config.h. Please recompile libraries with this option.
|
|
#endif
|
|
|
|
#elif defined BSP_SDCARD_SDHC_CHANNEL
|
|
|
|
#if ! BSPCFG_ENABLE_SDHC
|
|
#error This application requires BSPCFG_ENABLE_SDHC defined non-zero in \
|
|
user_config.h. Please recompile libraries with this option.
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if defined (BSP_SDCARD_SPI_CHANNEL)
|
|
#define SDCARD_COM_CHANNEL BSP_SDCARD_SPI_CHANNEL
|
|
#elif defined (BSP_SDCARD_ESDHC_CHANNEL)
|
|
#define SDCARD_COM_CHANNEL BSP_SDCARD_ESDHC_CHANNEL
|
|
#elif defined (BSP_SDCARD_SDHC_CHANNEL)
|
|
#define SDCARD_COM_CHANNEL BSP_SDCARD_SDHC_CHANNEL
|
|
#else
|
|
#error "SDCARD low level communication device not defined!"
|
|
#endif
|
|
|
|
TASK_TEMPLATE_STRUCT MQX_template_list[] =
|
|
{
|
|
/* Task number, Entry point, Stack, Pri, String, Auto? */
|
|
{MAIN_TASK, Main_task, 20000, 9, "main", MQX_AUTO_START_TASK},
|
|
{0, 0, 0, 0, 0, 0, }
|
|
};
|
|
|
|
/*TASK*-----------------------------------------------------
|
|
*
|
|
* Task Name : Main_task
|
|
* Comments :
|
|
* This task sets up the SD card and Ethernet devices,
|
|
* then starts the example CyaSSL client. The example
|
|
* CyaSSL client connects to a server over SSL and sends
|
|
* a simple HTTP GET message, then prints out the reply
|
|
* from the server.
|
|
*
|
|
* To change the IP address and port of the server,
|
|
* change the yasslIP and yasslPort variables in
|
|
* client_test(). Note that yasslIP needs to be given
|
|
* in hexadecimal.
|
|
*
|
|
*END*-----------------------------------------------------*/
|
|
|
|
void Main_task(uint_32 initial_data)
|
|
{
|
|
int ret = 0;
|
|
_mqx_int error_code, bytes;
|
|
_mqx_uint param;
|
|
_mqx_uint sz;
|
|
MQX_FILE_PTR com_handle, sdcard_handle, filesystem_handle, partman_handle;
|
|
MQX_FILE_PTR cert_file = NULL;
|
|
char filesystem_name[] = "a:";
|
|
char partman_name[] = "pm:";
|
|
const char* fileName = "a:\certs\\client-key.der";
|
|
|
|
printf("Starting client example... \n");
|
|
|
|
ret = sdcard_open(&com_handle, &sdcard_handle, &partman_handle,
|
|
&filesystem_handle, partman_name, filesystem_name);
|
|
|
|
if (ret != 0) {
|
|
printf("error: sdcard_open(), ret = %d\n", ret);
|
|
_mqx_exit(1);
|
|
}
|
|
printf("SD card installed to %s\n", filesystem_name);
|
|
|
|
setup_ethernet();
|
|
client_test();
|
|
|
|
ret = sdcard_close(&sdcard_handle, &partman_handle, &filesystem_handle,
|
|
partman_name, filesystem_name);
|
|
|
|
if (ret != 0) {
|
|
printf("error: sdcard_close(), ret = %d\n", ret);
|
|
_mqx_exit(1);
|
|
}
|
|
printf("SD card uninstalled.\n");
|
|
|
|
_mqx_exit(0);
|
|
}
|
|
|
|
void setup_ethernet(void) {
|
|
|
|
int error;
|
|
_enet_handle ehandle; /* for Ethernet driver */
|
|
_rtcs_if_handle ihandle;
|
|
_enet_address address;
|
|
|
|
error = RTCS_create();
|
|
if (error) {
|
|
err_sys("failed to create RTCS");
|
|
}
|
|
|
|
ENET_get_mac_address(BSP_DEFAULT_ENET_DEVICE, ENET_IPADDR, address);
|
|
|
|
/* Set up the Ethernet driver */
|
|
error = ENET_initialize(BSP_DEFAULT_ENET_DEVICE, address, 0, &ehandle);
|
|
if (error)
|
|
err_sys("failed to initialize Ethernet driver");
|
|
|
|
error = RTCS_if_add(ehandle, RTCS_IF_ENET, &ihandle);
|
|
if (error)
|
|
err_sys("failed to add interface for Ethernet");
|
|
|
|
error = RTCS_if_bind(ihandle, ENET_IPADDR, ENET_IPMASK);
|
|
if (error)
|
|
err_sys("failed to bind interface for Ethernet");
|
|
|
|
#ifdef GATE_IPADDR
|
|
RTCS_gate_add(GATE_IPADDR, INADDR_ANY, INADDR_ANY);
|
|
#endif
|
|
|
|
printf("Ethernet device %d bound to %X\n", BSP_DEFAULT_ENET_DEVICE,
|
|
ENET_IPADDR);
|
|
}
|
|
|
|
void client_test(void) {
|
|
|
|
char msg[64];
|
|
char reply[1024];
|
|
int sockfd, input;
|
|
int ret = 0, msgSz = 0;
|
|
struct sockaddr_in servaddr;
|
|
CYASSL_CTX* ctx;
|
|
CYASSL* ssl;
|
|
|
|
long yasslIP = 0xa9fea662; /* 169.254.166.98 */
|
|
long yasslPort = 11111;
|
|
|
|
CyaSSL_Debugging_ON();
|
|
CyaSSL_Init();
|
|
|
|
ctx = CyaSSL_CTX_new(CyaSSLv3_client_method());
|
|
|
|
if (ctx == 0)
|
|
err_sys("setting up ctx");
|
|
|
|
ret = CyaSSL_CTX_use_certificate_file(ctx, clientCert, SSL_FILETYPE_PEM);
|
|
if (ret != SSL_SUCCESS) {
|
|
err_sys("can't load client cert file, check file");
|
|
}
|
|
|
|
ret = CyaSSL_CTX_use_PrivateKey_file(ctx, clientKey, SSL_FILETYPE_PEM);
|
|
if (ret != SSL_SUCCESS) {
|
|
err_sys("can't load client key file, check file");
|
|
}
|
|
|
|
ret = CyaSSL_CTX_load_verify_locations(ctx, caCert, 0);
|
|
if (ret != SSL_SUCCESS) {
|
|
err_sys("can't load CA cert file, check file");
|
|
}
|
|
|
|
/* create socket descriptor */
|
|
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (sockfd == RTCS_SOCKET_ERROR) {
|
|
err_sys("socket creation failed");
|
|
} else {
|
|
printf("socket created successfully\n");
|
|
}
|
|
|
|
/* Unlike most TCP/IP stacks, RTCS requires that sin_port and
|
|
* sin_addr needs to be in Host Byte Order, not Network Byte Order.
|
|
* This means we shouldn't use htons() when setting these values. */
|
|
memset((char*)&servaddr, 0, sizeof(servaddr));
|
|
servaddr.sin_family = AF_INET;
|
|
servaddr.sin_port = yasslPort;
|
|
servaddr.sin_addr.s_addr = yasslIP;
|
|
|
|
ret = connect(sockfd, &servaddr, sizeof(servaddr));
|
|
if (ret != RTCS_OK) {
|
|
err_sys("connect() failed");
|
|
} else {
|
|
printf("Connected to %lx, port %d.\n", servaddr.sin_addr.s_addr,
|
|
servaddr.sin_port);
|
|
}
|
|
|
|
if( (ssl = CyaSSL_new(ctx)) == NULL) {
|
|
err_sys("CyaSSL_new failed");
|
|
}
|
|
|
|
CyaSSL_set_fd(ssl, sockfd);
|
|
|
|
ret = CyaSSL_connect(ssl);
|
|
if (ret != SSL_SUCCESS)
|
|
err_sys("CyaSSL_connect failed");
|
|
|
|
printf("CyaSSL_connect() ok, sending GET...\n");
|
|
msgSz = 28;
|
|
strncpy(msg, "GET /index.html HTTP/1.0\r\n\r\n", msgSz);
|
|
if (CyaSSL_write(ssl, msg, msgSz) != msgSz)
|
|
err_sys("CyaSSL_write() failed");
|
|
|
|
input = CyaSSL_read(ssl, reply, sizeof(reply)-1);
|
|
if (input > 0) {
|
|
reply[input] = 0;
|
|
printf("Server response: %s\n", reply);
|
|
|
|
while(1) {
|
|
input = CyaSSL_read(ssl, reply, sizeof(reply)-1);
|
|
if (input > 0) {
|
|
reply[input] = 0;
|
|
printf("%s\n", reply);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CyaSSL_shutdown(ssl);
|
|
CyaSSL_free(ssl);
|
|
CyaSSL_CTX_free(ctx);
|
|
CyaSSL_Cleanup();
|
|
}
|
|
|
|
/* EOF */
|