123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
-
- #include "lwip/debug.h"
- #include "lwip/stats.h"
- #include "lwip/tcp.h"
- #if LWIP_TCP
- static struct tcp_pcb *tcp_server_pcb;
- enum tcp_server_states
- {
- ES_NONE = 0,
- ES_ACCEPTED,
- ES_RECEIVED,
- ES_CLOSING
- };
- struct tcp_server_struct
- {
- u8_t state;
- u8_t retries;
- struct tcp_pcb *pcb;
- struct pbuf *p;
- };
- static err_t tcp_server_accept(void *arg, struct tcp_pcb *newpcb, err_t err);
- static err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
- static void tcp_server_error(void *arg, err_t err);
- static err_t tcp_server_poll(void *arg, struct tcp_pcb *tpcb);
- static err_t tcp_server_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
- static void tcp_server_send(struct tcp_pcb *tpcb, struct tcp_server_struct *es);
- static void tcp_server_connection_close(struct tcp_pcb *tpcb, struct tcp_server_struct *es);
- void tcp_server_init(void)
- {
-
- tcp_server_pcb = tcp_new();
- if (tcp_server_pcb != NULL)
- {
- err_t err;
-
-
- err = tcp_bind(tcp_server_pcb, IP_ADDR_ANY, 7);
-
- if (err == ERR_OK)
- {
-
- tcp_server_pcb = tcp_listen(tcp_server_pcb);
-
-
- tcp_accept(tcp_server_pcb, tcp_server_accept);
- }
- else
- {
-
- memp_free(MEMP_TCP_PCB, tcp_server_pcb);
- }
- }
- }
- static err_t tcp_server_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
- {
- err_t ret_err;
- struct tcp_server_struct *es;
- LWIP_UNUSED_ARG(arg);
- LWIP_UNUSED_ARG(err);
-
- tcp_setprio(newpcb, TCP_PRIO_MIN);
-
- es = (struct tcp_server_struct *)mem_malloc(sizeof(struct tcp_server_struct));
- if (es != NULL)
- {
- es->state = ES_ACCEPTED;
- es->pcb = newpcb;
- es->retries = 0;
- es->p = NULL;
-
-
- tcp_arg(newpcb, es);
-
-
- tcp_recv(newpcb, tcp_server_recv);
-
-
- tcp_err(newpcb, tcp_server_error);
-
-
- tcp_poll(newpcb, tcp_server_poll, 0);
-
- ret_err = ERR_OK;
- }
- else
- {
-
- tcp_server_connection_close(newpcb, es);
-
- ret_err = ERR_MEM;
- }
- return ret_err;
- }
- static err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
- {
- struct tcp_server_struct *es;
- err_t ret_err;
- LWIP_ASSERT("arg != NULL",arg != NULL);
-
- es = (struct tcp_server_struct *)arg;
-
-
- if (p == NULL)
- {
-
- es->state = ES_CLOSING;
- if(es->p == NULL)
- {
-
- tcp_server_connection_close(tpcb, es);
- }
- else
- {
-
-
- tcp_sent(tpcb, tcp_server_sent);
-
-
- tcp_server_send(tpcb, es);
- }
- ret_err = ERR_OK;
- }
-
- else if(err != ERR_OK)
- {
-
- if (p != NULL)
- {
- es->p = NULL;
- pbuf_free(p);
- }
- ret_err = err;
- }
- else if(es->state == ES_ACCEPTED)
- {
-
- es->state = ES_RECEIVED;
-
-
- es->p = p;
-
-
- tcp_sent(tpcb, tcp_server_sent);
-
-
- tcp_server_send(tpcb, es);
-
- ret_err = ERR_OK;
- }
- else if (es->state == ES_RECEIVED)
- {
-
- if(es->p == NULL)
- {
- es->p = p;
-
- char aa[128];
- memcpy(aa, p->payload, p->len);
- aa[p->len] = 0x00;
- DEBUG_INFO("Payload: %s\r\n", aa);
-
-
-
-
-
- tcp_server_send(tpcb, es);
- }
- else
- {
- struct pbuf *ptr;
-
- ptr = es->p;
- pbuf_chain(ptr,p);
- }
- ret_err = ERR_OK;
- }
- else if(es->state == ES_CLOSING)
- {
-
- tcp_recved(tpcb, p->tot_len);
- es->p = NULL;
- pbuf_free(p);
- ret_err = ERR_OK;
- }
- else
- {
-
- tcp_recved(tpcb, p->tot_len);
- es->p = NULL;
- pbuf_free(p);
- ret_err = ERR_OK;
- }
- return ret_err;
- }
- static void tcp_server_error(void *arg, err_t err)
- {
- struct tcp_server_struct *es;
- LWIP_UNUSED_ARG(err);
- es = (struct tcp_server_struct *)arg;
- if (es != NULL)
- {
-
- mem_free(es);
- }
- }
- static err_t tcp_server_poll(void *arg, struct tcp_pcb *tpcb)
- {
- err_t ret_err;
- struct tcp_server_struct *es;
- es = (struct tcp_server_struct *)arg;
- if (es != NULL)
- {
- if (es->p != NULL)
- {
- tcp_sent(tpcb, tcp_server_sent);
-
- DEBUG_INFO("Poll...\r\n");
- tcp_server_send(tpcb, es);
- }
- else
- {
-
- if(es->state == ES_CLOSING)
- {
-
- tcp_server_connection_close(tpcb, es);
- }
- }
- ret_err = ERR_OK;
- }
- else
- {
-
- tcp_abort(tpcb);
- ret_err = ERR_ABRT;
- }
-
- return ret_err;
- }
- static err_t tcp_server_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
- {
- struct tcp_server_struct *es;
- LWIP_UNUSED_ARG(len);
- es = (struct tcp_server_struct *)arg;
- es->retries = 0;
-
- if(es->p != NULL)
- {
-
- tcp_sent(tpcb, tcp_server_sent);
- tcp_server_send(tpcb, es);
- }
- else
- {
-
- if(es->state == ES_CLOSING)
- tcp_server_connection_close(tpcb, es);
- }
- return ERR_OK;
- }
- static void tcp_server_send(struct tcp_pcb *tpcb, struct tcp_server_struct *es)
- {
- struct pbuf *ptr;
- err_t wr_err = ERR_OK;
-
- while ((wr_err == ERR_OK) &&
- (es->p != NULL) &&
- (es->p->len <= tcp_sndbuf(tpcb)))
- {
-
-
- ptr = es->p;
-
- wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1);
-
- if (wr_err == ERR_OK)
- {
- u16_t plen;
- u8_t freed;
- plen = ptr->len;
-
-
- es->p = ptr->next;
-
- if(es->p != NULL)
- {
-
- pbuf_ref(es->p);
- }
-
-
- do
- {
-
- freed = pbuf_free(ptr);
- }
- while(freed == 0);
-
- tcp_recved(tpcb, plen);
- }
- else if(wr_err == ERR_MEM)
- {
-
- es->p = ptr;
- }
- else
- {
-
- }
- }
- }
- static void tcp_server_connection_close(struct tcp_pcb *tpcb, struct tcp_server_struct *es)
- {
-
-
- tcp_arg(tpcb, NULL);
- tcp_sent(tpcb, NULL);
- tcp_recv(tpcb, NULL);
- tcp_err(tpcb, NULL);
- tcp_poll(tpcb, NULL, 0);
-
-
- if (es != NULL)
- {
- mem_free(es);
- }
-
-
- tcp_close(tpcb);
- }
- #endif
|