aboutsummaryrefslogtreecommitdiff
path: root/firmwares/wifishield/wifiHD/src
diff options
context:
space:
mode:
Diffstat (limited to 'firmwares/wifishield/wifiHD/src')
-rw-r--r--firmwares/wifishield/wifiHD/src/ard_spi.c129
-rw-r--r--firmwares/wifishield/wifiHD/src/ard_spi.h2
-rw-r--r--firmwares/wifishield/wifiHD/src/ard_tcp.c265
-rw-r--r--firmwares/wifishield/wifiHD/src/ard_tcp.h31
-rw-r--r--firmwares/wifishield/wifiHD/src/ard_utils.h7
-rw-r--r--firmwares/wifishield/wifiHD/src/cmd_wl.c25
-rw-r--r--firmwares/wifishield/wifiHD/src/debug.h5
-rw-r--r--firmwares/wifishield/wifiHD/src/lwip_setup.h9
-rw-r--r--firmwares/wifishield/wifiHD/src/main.c43
-rw-r--r--firmwares/wifishield/wifiHD/src/wifi_spi.h3
10 files changed, 316 insertions, 203 deletions
diff --git a/firmwares/wifishield/wifiHD/src/ard_spi.c b/firmwares/wifishield/wifiHD/src/ard_spi.c
index 66b3ba5..8bd288b 100644
--- a/firmwares/wifishield/wifiHD/src/ard_spi.c
+++ b/firmwares/wifishield/wifiHD/src/ard_spi.c
@@ -26,6 +26,7 @@
#include <board_init.h>
#include "util.h"
#include "lwip/udp.h"
+#include "lwip_setup.h"
extern const char* fwVersion;
@@ -94,7 +95,7 @@ bool end_write = false; //TODO only for debug
// Signal indicating a new command is coming from SPI interface
static volatile Bool startRecvCmdSignal = FALSE;
-#define MAX_CMD_NUM 34
+#define MAX_CMD_NUM 36
typedef struct sCmd_spi_list{
cmd_spi_cb_t cb;
char cmd_id;
@@ -535,6 +536,114 @@ int set_passphrase_cmd_cb(int numParam, char* buf, void* ctx) {
RETURN_ERR(err)
}
+int set_ip_config_cmd_cb(int numParam, char* buf, void* ctx) {
+ struct ip_addr lwip_addr;
+ struct ctx_server *hs = ctx;
+ struct net_cfg *ncfg = &(hs->net_cfg);
+ struct netif *nif = ncfg->netif;
+ uint8_t parmsToChange=0;
+ const uint8_t MAX_IP_CONFIG_PARAMS = 3;
+
+ wl_err_t err = WL_SUCCESS;
+ tParam* params = (tParam*) buf;
+
+ if (params->paramLen == 1)
+ {
+ GET_PARAM_NEXT(BYTE, params, _parmsToChange);
+ parmsToChange = _parmsToChange;
+ }
+ else
+ RETURN_ERR(WL_FAILURE)
+
+ INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange);
+
+ if (parmsToChange <= MAX_IP_CONFIG_PARAMS)
+ {
+ int i=0;
+ for (; i<parmsToChange; ++i)
+ {
+ if (params->paramLen == 4)
+ {
+ GET_PARAM_NEXT(LONG, params, _ip_addr);
+ lwip_addr.addr = _ip_addr;
+ INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr);
+ switch (i)
+ {
+ case 0: // local_ip
+ {
+ netif_set_ipaddr(nif, &lwip_addr);
+ break;
+ }
+ case 1: // gateway
+ {
+ netif_set_gw(nif, &lwip_addr);
+ break;
+ }
+ case 2: // subnet
+ {
+ netif_set_netmask(nif, &lwip_addr);
+ break;
+ }
+ }
+ }else{
+ RETURN_ERR(WL_FAILURE)
+ }
+
+ }
+ /* Disable DHCP */
+ ncfg->dhcp_enabled = STATIC_IP_CONFIG;
+ }else
+ RETURN_ERR(WL_FAILURE)
+
+ RETURN_ERR(err)
+}
+
+int set_dns_config_cmd_cb(int numParam, char* buf, void* ctx) {
+ struct ip_addr lwip_addr;
+ struct ctx_server *hs = ctx;
+ struct net_cfg *ncfg = &(hs->net_cfg);
+ struct netif *nif = ncfg->netif;
+ uint8_t parmsToChange=0;
+ const uint8_t MAX_DNS_CONFIG_PARAMS = 2;
+
+ wl_err_t err = WL_SUCCESS;
+ tParam* params = (tParam*) buf;
+
+ if (params->paramLen == 1)
+ {
+ GET_PARAM_NEXT(BYTE, params, _parmsToChange);
+ parmsToChange = _parmsToChange;
+ }
+ else
+ RETURN_ERR(WL_FAILURE)
+
+ INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange);
+
+ if (parmsToChange <= MAX_DNS_CONFIG_PARAMS)
+ {
+ int i=0;
+ for (; i<parmsToChange; ++i)
+ {
+ if (params->paramLen == 4)
+ {
+ GET_PARAM_NEXT(LONG, params, _ip_addr);
+ lwip_addr.addr = _ip_addr;
+ INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr);
+ dns_setserver(i, &lwip_addr);
+ }else{
+ RETURN_ERR(WL_FAILURE)
+ }
+ }
+ /* Disable DHCP */
+ ncfg->dhcp_enabled = STATIC_IP_CONFIG;
+ }else
+ RETURN_ERR(WL_FAILURE)
+
+ RETURN_ERR(err)
+}
+
+
+
void set_result(wl_status_t _status)
{
result = _status;
@@ -1402,12 +1511,12 @@ int call_reply_cb(char* recv, char* reply) {
{
tSpiMsg* spiMsg = (tSpiMsg*) recv;
_result = cmd_spi_list[i].cb(spiMsg->nParam,
- (char*) &(spiMsg->params[0]), NULL);
+ (char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx);
}else
{
tSpiMsgData* spiMsg = (tSpiMsgData*) recv;
_result = cmd_spi_list[i].cb(spiMsg->nParam,
- (char*) &(spiMsg->params[0]), NULL);
+ (char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx);
}
if (_result != WIFI_SPI_ACK)
@@ -1452,10 +1561,12 @@ int call_reply_cb(char* recv, char* reply) {
return REPLY_NO_ERR;
}
-void init_spi_cmds() {
+void init_spi_cmds(void* ctx) {
spi_add_cmd(SET_NET_CMD, set_net_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG);
spi_add_cmd(SET_PASSPHRASE_CMD, set_passphrase_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG);
spi_add_cmd(SET_KEY_CMD, set_key_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG);
+ spi_add_cmd(SET_IP_CONFIG_CMD, set_ip_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG);
+ spi_add_cmd(SET_DNS_CONFIG_CMD, set_dns_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG);
spi_add_cmd(GET_CONN_STATUS_CMD, get_result_cmd_cb, get_reply_cb, NULL, CMD_GET_FLAG);
spi_add_cmd(GET_IPADDR_CMD, ack_cmd_cb, get_reply_ipaddr_cb, NULL, CMD_GET_FLAG);
spi_add_cmd(GET_MACADDR_CMD, ack_cmd_cb, get_reply_mac_cb, NULL, CMD_GET_FLAG);
@@ -1673,7 +1784,7 @@ inline int spi_slaveReceiveInt(volatile avr32_spi_t *spi)
{
int8_t numParams = 0;
int idx = PARAM_LEN_POS+1;
- bool islen16bit = _receiveBuffer[CMD_POS] & DATA_FLAG;
+ bool islen16bit = ((_receiveBuffer[CMD_POS] & DATA_FLAG) == DATA_FLAG);
if (index >= idx)
{
numParams = _receiveBuffer[PARAM_LEN_POS];
@@ -1690,6 +1801,10 @@ inline int spi_slaveReceiveInt(volatile avr32_spi_t *spi)
}
if (!endOfFrame){
WARN("Wrong termination index:%d nParam:%d idx:%d 16bit:%d\n", index, numParams, idx, islen16bit);
+ #ifdef _DEBUG_
+ dump((char*)_receiveBuffer, receivedChars);
+ while(0);
+ #endif
}
}
} while (!endOfFrame);
@@ -1786,7 +1901,7 @@ void initExtInt()
Enable_global_interrupt();
}
-int initSpi()
+int initSpi(void* ctx)
{
volatile avr32_spi_t *spi = &AVR32_SPI0;
gpio_map_t spi_piomap = { \
@@ -1838,7 +1953,7 @@ int initSpi()
#ifdef _SPI_STATS_
initStatSpi();
#endif
- init_spi_cmds();
+ init_spi_cmds(ctx);
memset(_receiveBuffer, 0, sizeof(_receiveBuffer));
memset(buf, 0, sizeof(buf));
diff --git a/firmwares/wifishield/wifiHD/src/ard_spi.h b/firmwares/wifishield/wifiHD/src/ard_spi.h
index 6607961..27ec33e 100644
--- a/firmwares/wifishield/wifiHD/src/ard_spi.h
+++ b/firmwares/wifishield/wifiHD/src/ard_spi.h
@@ -57,7 +57,7 @@ void set_result_cmd(int err) ;
void set_result(wl_status_t _status);
-int initSpi(void);
+int initSpi(void* ctx);
void initExtInt();
diff --git a/firmwares/wifishield/wifiHD/src/ard_tcp.c b/firmwares/wifishield/wifiHD/src/ard_tcp.c
index addbeca..0a73b20 100644
--- a/firmwares/wifishield/wifiHD/src/ard_tcp.c
+++ b/firmwares/wifishield/wifiHD/src/ard_tcp.c
@@ -27,12 +27,11 @@
#include "getopt.h"
#include "ard_utils.h"
#include "debug.h"
+#include "trace.h"
unsigned int startTime = 0;
extern bool ifStatus;
-static int isDataSentCount = 0;
-
static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len);
static void atcp_init_pend_flags(struct ttcp* _ttcp)
@@ -82,9 +81,7 @@ static void ard_tcp_destroy(struct ttcp* ttcp) {
udp_remove(ttcp->upcb);
}
- if (ttcp->payload)
- free(ttcp->payload);
-
+ FREE_PAYLOAD(ttcp);
free(ttcp);
}
@@ -108,45 +105,44 @@ static void ard_tcp_done(struct ttcp* ttcp, int result) {
* Called upon connect and when there's space available in the TCP send window
*
*/
-static err_t tcp_send_data(struct ttcp *ttcp) {
+static err_t tcp_send_data_pcb(struct ttcp *ttcp, struct tcp_pcb *pcb) {
err_t err = ERR_OK;
- uint32_t len, orig_len;
+ uint32_t len;
- len = ttcp->left;
- ttcp->buff_sent = 0;
+ GET_CLIENT_ID(ttcp, pcb);
+
+ len = ttcp->left[id];
+ ttcp->buff_sent[id] = 0;
if (len == 0) return ERR_MEM;
- INFO_TCP_VER("left=%d len:%d\n", ttcp->left, len);
+ INFO_TCP_VER("left=%d len:%d\n", ttcp->left[id], len);
/* don't send more than we have in the payload */
if (len > ttcp->buflen)
len = ttcp->buflen;
- struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP_NV(ttcp);
/* We cannot send more data than space available in the send
buffer. */
if (len > tcp_sndbuf(pcb))
len = tcp_sndbuf(pcb);
- orig_len = len;
-
IF_TCP(startTime = timer_get_ms());
- err = tcp_write(pcb, ttcp->payload, len, TCP_WRITE_FLAG_COPY);
+ err = tcp_write(pcb, ttcp->payload[id], len, TCP_WRITE_FLAG_COPY);
if (err != ERR_OK)
{
INFO_TCP("tcp_write failed %p state:%d len:%d err:%d\n",
pcb, pcb->state, len, err);
- ttcp->buff_sent = 0;
+ ttcp->buff_sent[id] = 0;
}else{
- ttcp->buff_sent = 1;
- isDataSentCount = 0;
- ttcp->left -= len;
+ ttcp->buff_sent[id] = 1;
+ ttcp->left[id] -= len;
}
return err;
}
+
/**
* Only used in TCP mode.
*/
@@ -155,10 +151,11 @@ static err_t tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) {
if (_ttcp == NULL) return ERR_ARG;
+ GET_CLIENT_ID(_ttcp, tpcb);
INFO_TCP("TTCP [%p-%p]: connect %d %d\n", _ttcp, tpcb, err, tpcb->state);
_connected = ( tpcb->state == ESTABLISHED) ? 1 : 0;
- _ttcp->tcp_poll_retries = 0;
+ _ttcp->tcp_poll_retries[id] = 0;
_ttcp->start_time = timer_get_ms();
@@ -198,13 +195,17 @@ static err_t close_conn_pcb(struct tcp_pcb* tpcb) {
static void atcp_conn_err_cb(void *arg, err_t err) {
struct ttcp* _ttcp = arg;
- WARN("TTCP [%p]: connection error: %d\n",
- _ttcp, err);
+ WARN("TTCP [%p]: connection error: %d currId:%d\n",
+ _ttcp, err, getCurrClientConnId());
if (ifStatus == false)
printk("Abort connection\n");
- atcp_init_pend_flags(_ttcp);
+ if (err == ERR_ABRT)
+ {
+ removeNewClientConn(_ttcp, GET_CURR_PCB(_ttcp));
+ FREE_PAYLOAD_ID(_ttcp, getCurrClientConnId());
+ }
}
static void atcp_conn_cli_err_cb(void *arg, err_t err) {
@@ -221,30 +222,32 @@ static void atcp_conn_cli_err_cb(void *arg, err_t err) {
if ((_ttcp)&&(err == ERR_ABRT))
{
WARN("TTCP [%p]: free memory\n", _ttcp);
- _ttcp->tcp_poll_retries = 0;
cleanSockState_cb(_ttcp);
- if (_ttcp->payload)
- free(_ttcp->payload);
- free(_ttcp);
+ // TODO
+ FREE_PAYLOAD(_ttcp);
}
- atcp_init_pend_flags(_ttcp);
+ //atcp_init_pend_flags(_ttcp);
}
static err_t close_conn(struct ttcp *_ttcp, struct tcp_pcb* tpcb) {
if (_ttcp == NULL) return ERR_MEM;
- int8_t id = getNewClientConnId(_ttcp, tpcb);
- if (id == NO_VALID_ID) return ERR_MEM;
+ GET_CLIENT_ID(_ttcp, tpcb);
+
err_t err = close_conn_pcb(_ttcp->tpcb[id]);
if (err == ERR_MEM)
+ {
+ WARN("Cannot close id:%d-%p put pending\n", id, _ttcp->tpcb[id]);
_ttcp->pending_close[id] = true;
+ }
else{
- atcp_init_pend_flags(_ttcp);
+ _ttcp->pending_close[id] = false;
removeNewClientConn(_ttcp, _ttcp->tpcb[id]);
- WARN("----------------------\n");
+ FREE_PAYLOAD_ID(_ttcp, id);
+ INFO_TCP("----------------------\n");
}
return err;
}
@@ -317,31 +320,32 @@ static err_t atcp_poll(void *arg, struct tcp_pcb *pcb) {
struct ttcp* _ttcp = arg;
if (_ttcp == NULL) return ERR_ARG;
+
+ GET_CLIENT_ID(_ttcp, pcb);
- if (_ttcp->left>0)
- ++_ttcp->tcp_poll_retries;
+ if (_ttcp->left[id]>0)
+ ++_ttcp->tcp_poll_retries[id];
- if (_ttcp->tcp_poll_retries > 4) {
- WARN("ARD TCP [%p] arg=%p retries=%d\n",
- pcb, arg, _ttcp->tcp_poll_retries);
- _ttcp->tcp_poll_retries = 0;
+ if (_ttcp->tcp_poll_retries[id] > 4) {
+ WARN("ARD TCP [%p] arg=%p retries=%d abort\n",
+ pcb, arg, _ttcp->tcp_poll_retries[id]);
+ _ttcp->tcp_poll_retries[id] = 0;
tcp_abort(pcb);
- atcp_init_pend_flags(_ttcp);
+ _ttcp->pending_close[id] = false;
return ERR_ABRT;
}
if (pcb)
INFO_TCP_POLL("keepAliveCnt:%d keep_idle:%d persist_cnt:%d\n",
pcb->keep_cnt_sent, pcb->keep_idle, pcb->persist_cnt);
-
- int8_t id = getNewClientConnId(_ttcp, pcb);
- if (_ttcp->left > 0)
+
+ if (_ttcp->left[id] > 0)
INFO_TCP("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d len:%d\n",
(_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg,
- _ttcp->tcp_poll_retries, _ttcp->pending_close[id], (_ttcp)?_ttcp->left:0);
- tcp_send_data(_ttcp);
+ _ttcp->tcp_poll_retries[id], _ttcp->pending_close[id], (_ttcp)?_ttcp->left[id]:0);
+ tcp_send_data_pcb(_ttcp, pcb);
- if ((id != NO_VALID_ID) && (_ttcp->pending_close[id]))
+ if (_ttcp->pending_close[id])
{
err_t err = ERR_OK;
if (id >=0){
@@ -352,7 +356,10 @@ static err_t atcp_poll(void *arg, struct tcp_pcb *pcb) {
}
else
{
- atcp_init_pend_flags(_ttcp);
+ _ttcp->pending_close[id] = false;
+ removeNewClientConn(_ttcp, _ttcp->tpcb[id]);
+ FREE_PAYLOAD_ID(_ttcp, id);
+ INFO_TCP("----------------------\n");
}
}
INFO_TCP("ARD TCP [%p-%p] try to close pending:%d err:%d id:%d\n", pcb,
@@ -366,26 +373,27 @@ static err_t atcp_poll_conn(void *arg, struct tcp_pcb *pcb) {
if (_ttcp == NULL) return ERR_ARG;
- int8_t id = getNewClientConnId(_ttcp, pcb);
+ GET_CLIENT_ID(_ttcp, pcb)
+
+ INFO_TCP_POLL("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d conn:%d\n",
+ (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg,
+ _ttcp->tcp_poll_retries[id], _ttcp->pending_close[id], _connected);
+
if (id != NO_VALID_ID)
{
if (_ttcp->pending_close[id])
- ++(_ttcp->tcp_poll_retries);
+ ++(_ttcp->tcp_poll_retries[id]);
}
- if (_ttcp->tcp_poll_retries > 8) {
+ if (_ttcp->tcp_poll_retries[id] > 8) {
WARN("ARD TCP [%p-%p] arg=%p retries=%d\n",
- pcb, GET_FIRST_CLIENT_TCP(_ttcp), arg, _ttcp->tcp_poll_retries);
- _ttcp->tcp_poll_retries = 0;
+ pcb, GET_FIRST_CLIENT_TCP(_ttcp), arg, _ttcp->tcp_poll_retries[id]);
+ _ttcp->tcp_poll_retries[id] = 0;
tcp_abort(pcb);
return ERR_ABRT;
}
- INFO_TCP_POLL("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d conn:%d\n",
- (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg,
- _ttcp->tcp_poll_retries, _ttcp->pending_close[id], _connected);
-
- if ((_ttcp)&&(_connected)) tcp_send_data(_ttcp);
+ if ((_ttcp)&&(_connected)) tcp_send_data_pcb(_ttcp, pcb);
if ((id != NO_VALID_ID) && (_ttcp->pending_close[id]))
{
@@ -397,11 +405,8 @@ static err_t atcp_poll_conn(void *arg, struct tcp_pcb *pcb) {
else
{
cleanSockState_cb(_ttcp);
- if (_ttcp->payload)
- free(_ttcp->payload);
- free(_ttcp);
+ FREE_PAYLOAD_ID(_ttcp, id);
_ttcp->pending_close[id] = false;
-
}
INFO_TCP("ARD TCP [%p-%p] try to close pending:%d\n", pcb, (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, _ttcp->pending_close[id]);
@@ -410,7 +415,6 @@ static err_t atcp_poll_conn(void *arg, struct tcp_pcb *pcb) {
}
int8_t currConnId = 0;
-#define GET_IDX_CONN(I) ((I+currConnId)<MAX_CLIENT_ACCEPTED ? (I+currConnId) : (I+currConnId-MAX_CLIENT_ACCEPTED))
int8_t getCurrClientConnId() { return currConnId;}
@@ -424,7 +428,7 @@ int8_t getNewClientConnId(struct ttcp* _ttcp, struct tcp_pcb *newpcb)
if (_ttcp->tpcb[idx] == newpcb)
{
- INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb);
+ INFO_TCP_VER("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb);
return idx;
}
}
@@ -523,6 +527,14 @@ static err_t atcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err) {
INFO_TCP("local:%d remote:%d state:%d\n", newpcb->local_port, newpcb->remote_port, newpcb->state);
int8_t id = insertNewClientConn(_ttcp, newpcb);
+
+ ASSERT((_ttcp->payload[id]==NULL), "payload not freed!");
+ _ttcp->payload[id] = malloc(_ttcp->buflen);
+ INFO_TCP("Alloc payload %d-%p\n", id, _ttcp->payload[id]);
+ if (_ttcp->payload[id] == NULL) {
+ WARN("TTCP [%p]: could not allocate payload\n", _ttcp);
+ return -1;
+ }
tcp_arg(_ttcp->tpcb[id], _ttcp);
tcp_recv(_ttcp->tpcb[id], atcp_recv_cb);
tcp_err(_ttcp->tpcb[id], atcp_conn_err_cb);
@@ -548,24 +560,26 @@ static int atcp_start(struct ttcp* ttcp) {
return -1;
}
- ttcp->payload = malloc(ttcp->buflen);
- if (ttcp->payload == NULL) {
- WARN("TTCP [%p]: could not allocate payload\n", ttcp);
- return -1;
- }
-
+ currConnId = 0;
tcp_arg(p, ttcp);
atcp_init_pend_flags(ttcp);
if (ttcp->mode == TTCP_MODE_TRANSMIT) {
- setNewClientConn(ttcp, p, 0);
- struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP(ttcp);
+ int8_t id = insertNewClientConn(ttcp, p);
+ ttcp->payload[id] = malloc(ttcp->buflen);
+ INFO_TCP("Alloc payload %d-%p\n", id, ttcp->payload[id]);
+ if (ttcp->payload[id] == NULL) {
+ WARN("TTCP [%p]: could not allocate payload\n", ttcp);
+ return -1;
+ }
+
+ struct tcp_pcb * pcb = p;
tcp_err(pcb, atcp_conn_cli_err_cb);
tcp_recv(pcb, atcp_recv_cb);
tcp_sent(pcb, tcp_data_sent);
tcp_poll(pcb, atcp_poll_conn, 4);
_connected = false;
- INFO_TCP("[tpcb]-%p payload:%p\n", pcb, ttcp->payload);
+ INFO_TCP("[tpcb]-%p payload:%p\n", pcb, ttcp->payload[id]);
DUMP_TCP_STATE(ttcp);
if (tcp_connect(pcb, &ttcp->addr, ttcp->port, tcp_connect_cb)
!= ERR_OK) {
@@ -595,72 +609,6 @@ static int atcp_start(struct ttcp* ttcp) {
return 0;
}
-static void
-udp_send_data(struct ttcp* ttcp);
-
-/**
- * Only used in UDP mode. Scheduled after data has been sent in udp_send_data()
- * if we have more data to send.
- */
-static void udp_timeout_cb(void *ctx) {
- struct ttcp* ttcp = ctx;
- udp_send_data(ttcp);
-}
-
-static int udp_send_bytes(struct ttcp* ttcp, uint32_t len) {
- struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
- if (p == NULL) {
- WARN("TTCP [%p]: could not allocate pbuf\n", ttcp);
- return -1;
- }
-
- if (udp_send(ttcp->upcb, p) != ERR_OK) {
- WARN("TTCP [%p]: udp_send() failed\n", ttcp);
- pbuf_free(p);
- return -1;
- }
-
- pbuf_free(p);
- return 0;
-}
-
-/**
- * Only used in UDP mode. First call will send the start marker. When all
- * ttcp data has been sent, a number of end markers will be sent. After
- * end marker transmission, this function will complete the ttcp process.
- */
-static void udp_send_data(struct ttcp* ttcp) {
- /* send start marker first time */
- if (!ttcp->udp_started) {
- if (udp_send_bytes(ttcp, 4) == 0) {
- ttcp->udp_started = 1;
- ttcp->start_time = timer_get_ms();
- }
- }
-
- /* normal case */
- else if (ttcp->left) {
- /* send data */
- if (udp_send_bytes(ttcp, ttcp->buflen) == 0)
- ttcp->left -= ttcp->buflen;
- }
-
- /* end marker? */
- else if (ttcp->left == 0 && ttcp->udp_end_marker_left) {
- if (udp_send_bytes(ttcp, 4) == 0)
- ttcp->udp_end_marker_left--;
- }
-
- /* all end markers sent */
- else if (ttcp->left == 0) {
- ard_tcp_done(ttcp, 0);
- return;
- }
-
- ttcp->tid
- = timer_sched_timeout_cb(0, TIMEOUT_ONESHOT, udp_timeout_cb, ttcp);
-}
-
/**
* Only used in UDP mode. Will finalize the ttcp process when an end marker
* is seen.
@@ -759,7 +707,6 @@ int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque,
ttcp->port = port;
ttcp->nbuf = nbuf;
ttcp->mode = mode;
- ttcp->left = 0;
ttcp->done_cb = done_cb;
ttcp->opaque = opaque;
ttcp->udp = udp;
@@ -782,7 +729,6 @@ int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque,
*_ttcp = (void*) ttcp;
ttcp->sock = sock;
- ttcp->buff_sent = 1;
return 0;
@@ -798,9 +744,10 @@ void ard_tcp_stop(void* ttcp) {
return;
}
if (_ttcp->mode == TTCP_MODE_TRANSMIT) {
+ int i = getCurrClientConnId();
ard_tcp_destroy(_ttcp);
clearMapSockTcp(getSock(_ttcp), GET_TCP_MODE(_ttcp));
- _ttcp->tcp_poll_retries = 0;
+ _ttcp->tcp_poll_retries[i] = 0;
}else{
DUMP_TCP_STATE(_ttcp);
@@ -825,9 +772,15 @@ uint8_t getStateTcp(void* p, bool client) {
if ((_ttcp != NULL) && ((pcb != NULL) || (client==0))) {
IF_SPI_POLL(DUMP_TCP_STATE(_ttcp));
if (client)
+ {
+ if ((pcb->state != ESTABLISHED)&&(pcb->state != CLOSED))
+ DUMP_TCP_STATE(_ttcp);
return pcb->state;
+ }
else
+ {
return _ttcp->lpcb->state;
+ }
} else {
WARN_POLL("TCP not initialized ttcp:%p tpcb:%p lpcb:%p\n",
_ttcp, ((_ttcp)?pcb:0), ((_ttcp)?_ttcp->lpcb:0));
@@ -846,9 +799,9 @@ uint8_t getModeTcp(void* p) {
uint8_t isDataSent(void* p) {
struct ttcp *_ttcp = (struct ttcp *)p;
- if ((_ttcp)&&(!_ttcp->buff_sent))
+ int8_t id = getCurrClientConnId();
+ if ((_ttcp)&&(!_ttcp->buff_sent[id]))
{
- INFO_TCP_VER("%d) Wait to send data\n", ++isDataSentCount);
return 0;
}
@@ -864,17 +817,15 @@ static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len) {
if (_ttcp == NULL) return ERR_ARG;
- _ttcp->tcp_poll_retries = 0;
- if (_ttcp) _ttcp->buff_sent = 1;
-
+ GET_CLIENT_ID(_ttcp, pcb);
+ _ttcp->tcp_poll_retries[id] = 0;
+ _ttcp->buff_sent[id] = 1;
- INFO_TCP("Packet sent pcb:%p len:%d dur:%d left:%d count:%d\n", pcb, len, timer_get_ms() - startTime,
- (_ttcp)?(_ttcp->left):0, isDataSentCount);
+ INFO_TCP("Packet sent pcb:%p len:%d dur:%d left:%d\n", pcb, len, timer_get_ms() - startTime,
+ (_ttcp)?(_ttcp->left[id]):0);
- isDataSentCount = 0;
-
- if ((_ttcp)&&(_ttcp->left > 0)) {
- tcp_send_data(_ttcp);
+ if ((_ttcp)&&(_ttcp->left[id] > 0)) {
+ tcp_send_data_pcb(_ttcp, pcb);
}
return ERR_OK;
@@ -891,21 +842,23 @@ int sendTcpData(void* p, uint8_t* buf, uint16_t len)
}
struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP_NV(_ttcp);
+ GET_CLIENT_ID(_ttcp, pcb);
+
INFO_TCP_VER("ttcp:%p pcb:%p buf:%p len:%d\n", _ttcp, pcb, buf, len);
DUMP_TCP(buf,len);
IF_TCP_VER(DUMP_TCP_STATE(_ttcp));
if ((_ttcp != NULL) && (pcb != NULL) &&
- (buf != NULL) && (len != 0) && (_ttcp->payload != NULL)) {
+ (buf != NULL) && (len != 0) && (_ttcp->payload[id] != NULL)) {
if (pcb->state == ESTABLISHED || pcb->state == CLOSE_WAIT ||
pcb->state == SYN_SENT || pcb->state == SYN_RCVD) {
- memcpy(_ttcp->payload, buf, len);
- _ttcp->payload[len]='\0';
- INFO_TCP_VER("'%s'\n", _ttcp->payload);
- _ttcp->left = len;
+ memcpy(_ttcp->payload[id], buf, len);
+ _ttcp->payload[id][len]='\0';
+ INFO_TCP_VER("'%s'\n", _ttcp->payload[id]);
+ _ttcp->left[id] = len;
tcp_sent(pcb, tcp_data_sent);
- tcp_send_data(_ttcp);
+ tcp_send_data_pcb(_ttcp, pcb);
return WL_SUCCESS;
}
diff --git a/firmwares/wifishield/wifiHD/src/ard_tcp.h b/firmwares/wifishield/wifiHD/src/ard_tcp.h
index 2bd3731..078e0b0 100644
--- a/firmwares/wifishield/wifiHD/src/ard_tcp.h
+++ b/firmwares/wifishield/wifiHD/src/ard_tcp.h
@@ -23,11 +23,32 @@ typedef void (ard_tcp_done_cb_t)(void *opaque, int result);
// Maximum number of client connection accepted by server
#define MAX_CLIENT_ACCEPTED 4
-#define NO_VALID_ID -1
+#define NO_VALID_ID 0xff
#define GET_FIRST_CLIENT_TCP(TTCP) getFirstClient(TTCP, 1)
#define GET_FIRST_CLIENT_TCP_NV(TTCP) getFirstClient(TTCP, 0)
#define GET_CLIENT_TCP(TTCP,ID) (((TTCP!=NULL)&&(ID>=0)&&(ID<MAX_CLIENT_ACCEPTED))?TTCP->tpcb[ID] : NULL)
+#define GET_CLIENT_ID(TTCP, PCB) uint8_t id = NO_VALID_ID; do { \
+ id = getNewClientConnId(TTCP, PCB); \
+ if (id == NO_VALID_ID) return ERR_MEM; \
+ }while(0);
+#define GET_IDX_CONN(I) ((I+currConnId)<MAX_CLIENT_ACCEPTED ? (I+currConnId) : (I+currConnId-MAX_CLIENT_ACCEPTED))
+#define GET_CURR_PCB(TTCP) GET_CLIENT_TCP(TTCP,getCurrClientConnId())
+
+#define FREE_PAYLOAD(TTCP) do { \
+ int id = getCurrClientConnId(); \
+ INFO_TCP("Freeing payload %d-%p\n", id, TTCP->payload[id]); \
+ if (TTCP->payload[id]) { \
+ free(TTCP->payload[id]); \
+ TTCP->payload[id] = NULL; } \
+}while(0);
+
+#define FREE_PAYLOAD_ID(TTCP,ID) do { \
+ INFO_TCP("Freeing payload %d-%p\n", ID, TTCP->payload[ID]); \
+ if (TTCP->payload[ID]) { \
+ free(TTCP->payload[ID]); \
+ TTCP->payload[ID] = NULL; } \
+}while(0);
typedef struct ttcp {
@@ -40,12 +61,12 @@ typedef struct ttcp {
int verbose; /* -v */
int udp; /* -u */
uint8_t sock;
- uint8_t buff_sent;
+ uint8_t buff_sent[MAX_CLIENT_ACCEPTED];
/* common */
uint16_t print_cnt;
uint32_t start_time;
- uint32_t left;
+ uint32_t left[MAX_CLIENT_ACCEPTED];
uint32_t recved;
ard_tcp_done_cb_t* done_cb;
void* opaque;
@@ -55,8 +76,8 @@ typedef struct ttcp {
/* TCP specific */
struct tcp_pcb* tpcb[MAX_CLIENT_ACCEPTED];
struct tcp_pcb* lpcb;
- char* payload;
- uint8_t tcp_poll_retries;
+ char* payload[MAX_CLIENT_ACCEPTED];
+ uint8_t tcp_poll_retries[MAX_CLIENT_ACCEPTED];
bool pending_close[MAX_CLIENT_ACCEPTED];
/* UDP specific */
diff --git a/firmwares/wifishield/wifiHD/src/ard_utils.h b/firmwares/wifishield/wifiHD/src/ard_utils.h
index 5dee3c0..323b328 100644
--- a/firmwares/wifishield/wifiHD/src/ard_utils.h
+++ b/firmwares/wifishield/wifiHD/src/ard_utils.h
@@ -242,10 +242,11 @@
#endif
#define DUMP_TCP_STATE(TTCP) do {\
- INFO_TCP("ttcp:%p tpcb:%p state:%d lpcb:%p state:%d left:%d sent:%d\n", \
- TTCP, TTCP->tpcb[0], (TTCP->tpcb[0])?TTCP->tpcb[0]->state:0, \
+ int i = getCurrClientConnId(); \
+ INFO_TCP("%d] ttcp:%p tpcb:%p state:%d lpcb:%p state:%d left:%d sent:%d\n", \
+ i, TTCP, TTCP->tpcb[i], (TTCP->tpcb[i])?TTCP->tpcb[i]->state:0, \
TTCP->lpcb, (TTCP->lpcb)?TTCP->lpcb->state:0, \
- (TTCP)?TTCP->left:0, (TTCP)?TTCP->buff_sent:0); \
+ (TTCP->tpcb[i])?TTCP->left[i]:0, (TTCP->tpcb[i])?TTCP->buff_sent[i]:0); \
} while(0);
#define Mode2Str(_Mode) ((_Mode==0)?"TRANSMIT":"RECEIVE")
diff --git a/firmwares/wifishield/wifiHD/src/cmd_wl.c b/firmwares/wifishield/wifiHD/src/cmd_wl.c
index 3356931..a210dec 100644
--- a/firmwares/wifishield/wifiHD/src/cmd_wl.c
+++ b/firmwares/wifishield/wifiHD/src/cmd_wl.c
@@ -182,23 +182,26 @@ cmd_ibss(int argc, char* argv[], void* ctx)
cmd_state_t
cmd_set_ip(int argc, char* argv[], void* ctx)
{
- struct net_cfg *ncfg = ctx;
+ struct ctx_server *hs = ctx;
+ struct net_cfg *ncfg = &(hs->net_cfg);
struct ip_addr lwip_addr;
struct netif *nif = ncfg->netif;
if (argc == 2 &&
(strncmp(argv[1], "none", 4) == 0)) {
- ncfg->dhcp_enabled = 1;
+ ncfg->dhcp_enabled = DYNAMIC_IP_CONFIG;
return CMD_DONE;
}
else if (argc != 4 ) {
- printk("usage: ip <ip> <netmask> <gateway-ip>\n");
- printk(" or : ip none (to enable DHCP)\n");
+ printk("usage: ipconfig <ip> <netmask> <gateway-ip>\n");
+ printk(" or : ipconfig none (to enable DHCP)\n");
return CMD_DONE;
}
+
/* IP address */
lwip_addr = str2ip(argv[1]);
+ INFO_SPI("nif:%p lwip_addr=0x%x\n", nif, lwip_addr.addr);
netif_set_ipaddr(nif, &lwip_addr);
/* Netmask */
lwip_addr = str2ip(argv[2]);
@@ -207,7 +210,7 @@ cmd_set_ip(int argc, char* argv[], void* ctx)
lwip_addr = str2ip(argv[3]);
netif_set_gw(nif, &lwip_addr);
/* Disable DHCP */
- ncfg->dhcp_enabled = 0;
+ ncfg->dhcp_enabled = STATIC_IP_CONFIG;
return CMD_DONE;
}
@@ -455,11 +458,15 @@ cmd_status(int argc, char* argv[], void* ctx)
/* print ip address */
if (netif_is_up(netif_default))
- printk("ip addr: %s\n", ip2str(netif_default->ip_addr));
+ {
+ printk("ip addr: %s - ", ip2str(netif_default->ip_addr));
+ printk("netmask: %s - ", ip2str(netif_default->netmask));
+ printk("gateway: %s\n", ip2str(netif_default->gw));
+ }
else
printk("ip interface is down\n");
printk("dhcp : ");
- if (ncfg->dhcp_enabled) {
+ if (ncfg->dhcp_enabled == DYNAMIC_IP_CONFIG) {
printk("enabled\n");
}
else {
@@ -468,8 +475,8 @@ cmd_status(int argc, char* argv[], void* ctx)
struct ip_addr addr1 = dns_getserver(0);
struct ip_addr addr2 = dns_getserver(1);
- printk("==> DNS1: %s\n", ip2str(addr1), addr1);
- printk("==> DNS2: %s\n", ip2str(addr2), addr2);
+ printk("DNS: %s - ", ip2str(addr1));
+ printk("%s\n", ip2str(addr2));
showTTCPstatus();
return CMD_DONE;
diff --git a/firmwares/wifishield/wifiHD/src/debug.h b/firmwares/wifishield/wifiHD/src/debug.h
index e48da64..154b799 100644
--- a/firmwares/wifishield/wifiHD/src/debug.h
+++ b/firmwares/wifishield/wifiHD/src/debug.h
@@ -140,8 +140,13 @@ Y; \
#define WARN(msg, args...) IF_DEBUG(WARN,WARN_DEBUG(msg, ##args))
#define WARN_VER(msg, args...) IF_DEBUG_VER(WARN,WARN_DEBUG(msg, ##args))
#define WARN_POLL(msg, args...) IF_DEBUG_POLL(WARN,WARN_DEBUG(msg, ##args))
+#if 0 // disable to reduce the size of binary
#define INFO_INIT(msg, args...) IF_DEBUG(INIT,PRINT_DEBUG(msg, ##args))
#define INFO_INIT_VER(msg, args...) IF_DEBUG_VER(INIT,PRINT_DEBUG(msg, ##args))
+#else
+#define INFO_INIT(msg, args...)
+#define INFO_INIT_VER(msg, args...)
+#endif
#define INFO_TCP(msg, args...) IF_DEBUG(TCP,PRINT_DEBUG(msg, ##args))
#define INFO_TCP_VER(msg, args...) IF_DEBUG_VER(TCP,PRINT_DEBUG(msg, ##args))
#define INFO_TCP_DUMP(msg, args...) IF_DEBUG_DUMP(TCP,PRINT_DEBUG(msg, ##args))
diff --git a/firmwares/wifishield/wifiHD/src/lwip_setup.h b/firmwares/wifishield/wifiHD/src/lwip_setup.h
index 7a3ec6f..7edf2b5 100644
--- a/firmwares/wifishield/wifiHD/src/lwip_setup.h
+++ b/firmwares/wifishield/wifiHD/src/lwip_setup.h
@@ -1,12 +1,21 @@
#ifndef _LWIP_SETUP_H
#define _LWIP_SETUP_H
+#define INIT_IP_CONFIG 0xff
+#define STATIC_IP_CONFIG 0
+#define DYNAMIC_IP_CONFIG 1
+
struct net_cfg {
struct netif *netif; /* lwip network interface */
uint8_t dhcp_enabled;
uint8_t dhcp_running;
};
+struct ctx_server {
+ struct net_cfg net_cfg;
+ uint8_t wl_init_complete;
+};
+
/*! Start the IP stack.
* If cfg->netif must have been allocated and lwip_init()
* must have been called before this function is called
diff --git a/firmwares/wifishield/wifiHD/src/main.c b/firmwares/wifishield/wifiHD/src/main.c
index e94e724..fffb34e 100644
--- a/firmwares/wifishield/wifiHD/src/main.c
+++ b/firmwares/wifishield/wifiHD/src/main.c
@@ -78,11 +78,6 @@ void fw_download_cb(void* ctx, uint8_t** buf, uint32_t* len)
#endif
#endif
-struct ctx_server {
- struct net_cfg net_cfg;
- uint8_t wl_init_complete;
-};
-
bool ifStatus = false;
bool scanNetCompleted = false;
@@ -114,7 +109,7 @@ wl_cm_conn_cb(struct wl_network_t* net, void* ctx)
INFO_INIT("Connection cb...\n");
printk("link up, connected to \"%s\"\n", ssid2str(&net->ssid));
- if ( hs->net_cfg.dhcp_enabled ) {
+ if ( hs->net_cfg.dhcp_enabled == DYNAMIC_IP_CONFIG ) {
INFO_INIT("Start DHCP...\n");
printk("requesting dhcp ... ");
int8_t result = dhcp_start(hs->net_cfg.netif);
@@ -122,7 +117,7 @@ wl_cm_conn_cb(struct wl_network_t* net, void* ctx)
hs->net_cfg.dhcp_running = 1;
}
else {
- netif_set_up(hs->net_cfg.netif);
+ netif_set_up(hs->net_cfg.netif);
}
INFO_INIT("Start DNS...\n");
@@ -270,7 +265,7 @@ poll(struct ctx_server* hs)
#endif
}
-void initShell()
+void initShell(void* ctx)
{
/* initialize shell */
INFO_INIT("Shell init...\n");
@@ -278,11 +273,10 @@ void initShell()
console_add_cmd("scan", cmd_scan, NULL);
console_add_cmd("connect", cmd_connect, NULL);
console_add_cmd("setkey", cmd_setkey, NULL);
- console_add_cmd("status", cmd_status, NULL);
+ console_add_cmd("status", cmd_status, ctx);
console_add_cmd("debug", cmd_debug, NULL);
console_add_cmd("dumpBuf", cmd_dumpBuf, NULL);
- console_add_cmd("ipconfig", cmd_set_ip, NULL);
-
+ console_add_cmd("ipconfig", cmd_set_ip, ctx);
#ifdef ADD_CMDS
console_add_cmd("powersave", cmd_power, NULL);
console_add_cmd("psconf", cmd_psconf, NULL);
@@ -319,12 +313,16 @@ wl_init_complete_cb(void* ctx)
struct ip_addr ipaddr, netmask, gw;
wl_err_t wl_status;
- IP4_ADDR(&gw, 0,0,0,0);
- IP4_ADDR(&ipaddr, 0,0,0,0);
- IP4_ADDR(&netmask, 0,0,0,0);
-
- /* default is dhcp enabled */
- hs->net_cfg.dhcp_enabled = 1;
+ if (hs->net_cfg.dhcp_enabled == INIT_IP_CONFIG)
+ {
+ IP4_ADDR(&gw, 0,0,0,0);
+ IP4_ADDR(&ipaddr, 0,0,0,0);
+ IP4_ADDR(&netmask, 0,0,0,0);
+
+ /* default is dhcp enabled */
+ hs->net_cfg.dhcp_enabled = DYNAMIC_IP_CONFIG;
+ }
+
start_ip_stack(&hs->net_cfg,
ipaddr,
netmask,
@@ -339,7 +337,7 @@ wl_init_complete_cb(void* ctx)
wl_scan();
- if (initSpi()){
+ if (initSpi(hs)){
WARN("Spi not initialized\n");
}else
{
@@ -362,6 +360,8 @@ void startup_init(void)
DEB_PIN_UP(2);
}
+const char timestamp[] = __TIMESTAMP__;
+
/**
*
*/
@@ -381,8 +381,6 @@ main(void)
tc_init();
- initShell();
-
delay_init(FOSC0);
#ifdef _TEST_SPI_
@@ -396,7 +394,7 @@ main(void)
}
#else
- printk("Arduino Wifi Startup... [%s]\n", __TIMESTAMP__);
+ printk("Arduino Wifi Startup... [%s]\n", timestamp);
size_t size_ctx_server = sizeof(struct ctx_server);
hs = calloc(1, size_ctx_server);
@@ -405,10 +403,11 @@ main(void)
size_t size_netif = sizeof(struct netif);
hs->net_cfg.netif = calloc(1, size_netif);
ASSERT(hs->net_cfg.netif, "out of memory");
+ hs->net_cfg.dhcp_enabled = INIT_IP_CONFIG;
INFO_INIT("hs:%p size:0x%x netif:%p size:0x%x\n", hs, size_ctx_server,
hs->net_cfg.netif, size_netif);
-
+ initShell(hs);
timer_init(NULL, NULL);
lwip_init();
diff --git a/firmwares/wifishield/wifiHD/src/wifi_spi.h b/firmwares/wifishield/wifiHD/src/wifi_spi.h
index 4094e03..e2e262c 100644
--- a/firmwares/wifishield/wifiHD/src/wifi_spi.h
+++ b/firmwares/wifishield/wifiHD/src/wifi_spi.h
@@ -32,6 +32,8 @@ enum {
SET_PASSPHRASE_CMD = 0x11,
SET_KEY_CMD = 0x12,
TEST_CMD = 0x13,
+ SET_IP_CONFIG_CMD = 0x14,
+ SET_DNS_CONFIG_CMD = 0x15,
GET_CONN_STATUS_CMD = 0x20,
GET_IPADDR_CMD = 0x21,
@@ -155,3 +157,4 @@ typedef struct __attribute__((__packed__))
}tByteParam;
#endif
+uint8_t param; \ No newline at end of file