diff --git a/binary/wifiHD.elf b/binary/wifiHD.elf index 4c2330577..91d535e5b 100644 Binary files a/binary/wifiHD.elf and b/binary/wifiHD.elf differ diff --git a/wifiHD/Release/wifiHD.elf b/wifiHD/Release/wifiHD.elf index 4c2330577..91d535e5b 100644 Binary files a/wifiHD/Release/wifiHD.elf and b/wifiHD/Release/wifiHD.elf differ diff --git a/wifiHD/src/ard_spi.c b/wifiHD/src/ard_spi.c index 5814ccdb5..70b96195a 100644 --- a/wifiHD/src/ard_spi.c +++ b/wifiHD/src/ard_spi.c @@ -23,6 +23,7 @@ #include "delay.h" #include "eic.h" #include "timer.h" +#include "lwip/dns.h" @@ -169,6 +170,8 @@ struct netif* ard_netif = NULL; // Network list retrived in the last scanNetwork static struct wl_network_t network_list[WL_NETWORKS_LIST_MAXNUM]; +struct ip_addr _hostIpAddr; + void* getTTCP(uint8_t sock) { if (sock < MAX_SOCK_NUM) @@ -407,7 +410,7 @@ int spi_add_cmd(char _cmd_id, cmd_spi_cb_t cb, cmd_spi_rcb_t rcb, void* ctx, if (i == ARRAY_SIZE(cmd_spi_list)) { - WARN("List Commands full!\n"); + printk("List Commands full!\n"); return -1; } cmd_spi_list[i].cmd_id = _cmd_id; @@ -762,6 +765,47 @@ cmd_spi_state_t get_reply_ipaddr_cb(char* recv, char* reply, void* ctx, uint16_t return SPI_CMD_DONE; } +void foundHostByName(const char *name, struct ip_addr *ipaddr, void *callback_arg) +{ + INFO_SPI("foundHostByName: Found Host: name=%s ip=0x%x\n", name, ipaddr->addr); + _hostIpAddr.addr = ipaddr->addr; +} + +int req_reply_host_by_name_cb(int numParam, char* buf, void* ctx) { + + char hostName[DNS_MAX_NAME_LENGTH]; + tParam* params = (tParam*) buf; + + // HostName + if (params->paramLen < DNS_MAX_NAME_LENGTH) { + memcpy(hostName, ¶ms->param, params->paramLen); + hostName[params->paramLen]='\0'; + } else { + RETURN_ERR(WL_FAILURE) + } + + _hostIpAddr.addr = 0; + err_t err = dns_gethostbyname(hostName, &_hostIpAddr, foundHostByName, NULL); + if (err == ERR_OK) + { + INFO_SPI("Found Host: name=%s ip=0x%x\n", hostName, _hostIpAddr.addr); + RETURN_ERR(WL_SUCCESS) + } + RETURN_ERR(WL_FAILURE) +} + +cmd_spi_state_t get_reply_host_by_name_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, 1); + + PUT_LONG_IN_BYTE_NO(_hostIpAddr.addr, reply, 3); + + END_HEADER_REPLY(reply, 8, *count); + + return SPI_CMD_DONE; +} cmd_spi_state_t get_reply_mac_cb(char* recv, char* reply, void* ctx, uint16_t* count) { @@ -1231,7 +1275,8 @@ void init_spi_cmds() { spi_add_cmd(GET_IDX_ENCT_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_ENCT_CMD, CMD_GET_FLAG); spi_add_cmd(GET_IDX_SSID_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_SSID_CMD, CMD_GET_FLAG); spi_add_cmd(GET_IDX_RSSI_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_RSSI_CMD, CMD_GET_FLAG); - + spi_add_cmd(REQ_HOST_BY_NAME_CMD, req_reply_host_by_name_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(GET_HOST_BY_NAME_CMD, ack_cmd_cb, get_reply_host_by_name_cb, NULL, CMD_GET_FLAG); spi_add_cmd(START_SERVER_TCP_CMD, start_server_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(START_CLIENT_TCP_CMD, start_client_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); spi_add_cmd(STOP_CLIENT_TCP_CMD, stop_client_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); diff --git a/wifiHD/src/ard_spi.h b/wifiHD/src/ard_spi.h index 48a44bd8b..074a50f10 100644 --- a/wifiHD/src/ard_spi.h +++ b/wifiHD/src/ard_spi.h @@ -61,6 +61,8 @@ cmd_state_t cmd_statSpi(int argc, char* argv[], void* ctx); cmd_state_t cmd_resetStatSpi(int argc, char* argv[], void* ctx); +cmd_state_t cmd_gethostbyname(int argc, char* argv[], void* ctx); + void showTTCPstatus(); int getSock(void * _ttcp); diff --git a/wifiHD/src/ard_tcp.c b/wifiHD/src/ard_tcp.c index 3e3444a9c..3a9b11765 100644 --- a/wifiHD/src/ard_tcp.c +++ b/wifiHD/src/ard_tcp.c @@ -232,6 +232,7 @@ static void atcp_conn_err_cb(void *arg, err_t err) { int sock = getSock(ttcp); if (sock) clearMapSockTcp(sock); + _connected = false; ard_tcp_done(ttcp, err); } diff --git a/wifiHD/src/cmd_wl.c b/wifiHD/src/cmd_wl.c index d3fc0f6a8..2de1e89fb 100644 --- a/wifiHD/src/cmd_wl.c +++ b/wifiHD/src/cmd_wl.c @@ -36,6 +36,7 @@ #include "wl_util.h" #include "util.h" #include "lwip/netif.h" +#include "lwip/dns.h" #include "debug.h" extern void showTTCPstatus(); @@ -175,6 +176,42 @@ cmd_setpass(int argc, char* argv[], void* ctx) } #endif +#ifdef _DNS_CMD_ +void foundHost(const char *name, struct ip_addr *ipaddr, void *callback_arg) +{ + printk("Found Host: name=%s ip=0x%x\n", name, ipaddr->addr); +} + +/** + * + */ +cmd_state_t +cmd_gethostbyname(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: getHost \n"; + char hostname[DNS_MAX_NAME_LENGTH]; + struct ip_addr _addr; + int len = 0; + + if (argc < 2) { + printk(usage); + return CMD_DONE; + } + + len = join_argv(hostname, sizeof hostname, argc - 1, argv + 1); + if (0 == len) { + return CMD_DONE; + } + err_t err = dns_gethostbyname(hostname, &_addr, foundHost, NULL); + if (err == ERR_OK) + { + printk("Found Host: name=%s ip=0x%x\n", hostname, _addr.addr); + } + + return CMD_DONE; +} +#endif + /** * diff --git a/wifiHD/src/console.c b/wifiHD/src/console.c index 218e2548d..3887ab2b1 100644 --- a/wifiHD/src/console.c +++ b/wifiHD/src/console.c @@ -37,11 +37,12 @@ #include #include "console.h" +#define MAX_CMD_CONSOLE_NUM 9 struct { cmd_cb_t cb; const char* str; void* ctx; -} cmd_list[16] = { { 0 } }; +} cmd_list[MAX_CMD_CONSOLE_NUM] = { { 0 } }; #define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) @@ -53,15 +54,15 @@ struct { #error #endif -#ifndef CMD_MAX_LEN -#define CMD_MAX_LEN 80 +#ifndef CMD_CONSOLE_MAX_LEN +#define CMD_CONSOLE_MAX_LEN 25 #endif static Bool is_initialized = FALSE; char* console_gets() { - static char buf[CMD_MAX_LEN]; + static char buf[CMD_CONSOLE_MAX_LEN]; static int pos = 0; int c; int status; diff --git a/wifiHD/src/lwipopts.h b/wifiHD/src/lwipopts.h index 48b38c722..4b3d6aabe 100644 --- a/wifiHD/src/lwipopts.h +++ b/wifiHD/src/lwipopts.h @@ -329,7 +329,7 @@ * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS * transport. */ -#define LWIP_DNS 0 +#define LWIP_DNS 1 /* --------------------------------- diff --git a/wifiHD/src/main.c b/wifiHD/src/main.c index 3e4547dc4..2c39431b5 100644 --- a/wifiHD/src/main.c +++ b/wifiHD/src/main.c @@ -16,6 +16,7 @@ #include "lwip/init.h" #include "lwip/dhcp.h" +#include "lwip/dns.h" #include "lwip/tcp.h" #include "netif/etharp.h" #include "netif/wlif.h" @@ -77,7 +78,7 @@ void fw_download_cb(void* ctx, uint8_t** buf, uint32_t* len) struct ctx_server { struct netif *netif; - uint8_t wl_init_complete; + //uint8_t wl_init_complete; }; // to maintain the word alignment @@ -87,7 +88,7 @@ struct ctx_server { static bool initSpiComplete = false; // variable used as enable flag for debug prints -uint16_t enableDebug = 0; +uint16_t enableDebug = 0; //INFO_WARN_FLAG; uint16_t verboseDebug = 0; /** @@ -129,18 +130,22 @@ dhcp_coarse_tmr_cb(void *ctx) dhcp_coarse_tmr(); } +/** + * + */ +static void +dns_tmr_cb(void *ctx) +{ + dns_tmr(); +} + + /** * */ static void wl_cm_scan_cb(void* ctx) { - struct ctx_server* hs = ctx; - - uint8_t init = hs->wl_init_complete; - - INFO_INIT("Scan networks...[ OK ] %d 0x%x\n", init); - set_result(WL_SCAN_COMPLETED); } @@ -161,6 +166,9 @@ wl_cm_conn_cb(struct wl_network_t* net, void* ctx) INFO_INIT("Start DHCP...\n"); dhcp_start(hs->netif); + + INFO_INIT("Start DNS...\n"); + dns_init(); } @@ -333,7 +341,9 @@ void initShell() console_add_cmd("spiStat", cmd_statSpi, NULL); console_add_cmd("resetSpiStat", cmd_resetStatSpi, NULL); #endif - +#ifdef _DNS_CMD_ + console_add_cmd("getHost", cmd_gethostbyname, NULL); +#endif } /** @@ -363,12 +373,14 @@ wl_init_complete_cb(void* ctx) etharp_tmr_cb, hs); timer_sched_timeout_cb(TCP_TMR_INTERVAL, TIMEOUT_PERIODIC, tcp_tmr_cb, hs); - timer_sched_timeout_cb(DHCP_FINE_TIMER_MSECS, TIMEOUT_PERIODIC, + timer_sched_timeout_cb(DHCP_FINE_TIMER_MSECS, TIMEOUT_PERIODIC, dhcp_fine_tmr_cb, hs); timer_sched_timeout_cb(DHCP_COARSE_TIMER_MSECS, TIMEOUT_PERIODIC, dhcp_coarse_tmr_cb, hs); +// timer_sched_timeout_cb(DNS_TMR_INTERVAL, TIMEOUT_PERIODIC, +// dns_tmr_cb, NULL); + - initShell(); if (initSpi()) WARN("Spi not initialized\n"); @@ -418,6 +430,8 @@ main(void) #else printk("Arduino Wifi Startup... [%s]\n", __TIMESTAMP__); + initShell(); + size_t size_ctx_server = sizeof(struct ctx_server)+PAD_CTX_SIZE; hs = calloc(1, size_ctx_server); ASSERT(hs, "out of memory"); diff --git a/wifiHD/src/wifi_spi.h b/wifiHD/src/wifi_spi.h index d651d216b..7b929945e 100644 --- a/wifiHD/src/wifi_spi.h +++ b/wifiHD/src/wifi_spi.h @@ -51,6 +51,8 @@ enum { GET_IDX_SSID_CMD = 0x31, GET_IDX_RSSI_CMD = 0x32, GET_IDX_ENCT_CMD = 0x33, + REQ_HOST_BY_NAME_CMD= 0x34, + GET_HOST_BY_NAME_CMD= 0x35, // All command with DATA_FLAG 0x40 send a 16bit Len SEND_DATA_TCP_CMD = 0x44,