err_t TcpConnection::staticOnReceive(void *arg, tcp_pcb *tcp, pbuf *p, err_t err) { // debugf("Static OnReceive buf = %d", tcp_sndbuf(tcp)); TcpConnection* con = (TcpConnection*)arg; err_t ret_err; //Serial.println("echo_recv!"); if (con == NULL) { if (p != NULL) { /* Inform TCP that we have taken the data. */ tcp_recved(tcp, p->tot_len); pbuf_free(p); } closeTcpConnection(tcp); return ERR_OK; } else con->sleep = 0; if (err != ERR_OK /*&& err != ERR_CLSD && err != ERR_RST*/) { debugf("Received ERROR %d", err); /* exit and free resources, for unkown reason */ if (p != NULL) { /* Inform TCP that we have taken the data. */ tcp_recved(tcp, p->tot_len); pbuf_free(p); } closeTcpConnection(tcp); // ?? con->tcp = NULL; con->onError(err); //con->close(); return err == ERR_ABRT ? ERR_ABRT : ERR_OK; } //if (tcp != NULL && tcp->state == ESTABLISHED) // If active /* We have taken the data. */ if (p != NULL) tcp_recved(tcp, p->tot_len); err_t res = con->onReceive(p); if (p != NULL) pbuf_free(p); else { con->close(); closeTcpConnection(tcp); } con->checkSelfFree(); //debugf("<staticOnReceive"); return res; }
void TcpConnection::staticOnError(void *arg, err_t err) { TcpConnection* con = (TcpConnection*)arg; if (con == NULL) return; con->tcp = NULL; // IMPORTANT. No available connection after error! con->onError(err); con->checkSelfFree(); //debugf("<staticOnError"); }
err_t TcpConnection::staticOnSent(void *arg, tcp_pcb *tcp, uint16_t len) { TcpConnection* con = (TcpConnection*)arg; if (con == NULL) return ERR_OK; else con->sleep = 0; err_t res = con->onSent(len); con->checkSelfFree(); //debugf("<staticOnSent"); return res; }
err_t TcpConnection::staticOnConnected(void *arg, tcp_pcb *tcp, err_t err) { TcpConnection* con = (TcpConnection*)arg; if (con == NULL) { debugf("OnConnected ABORT"); //closeTcpConnection(tcp); tcp_abort(tcp); return ERR_ABRT; } else debugf("OnConnected"); err_t res = con->onConnected(err); con->checkSelfFree(); //debugf("<staticOnConnected"); return res; }
err_t TcpConnection::staticOnPoll(void *arg, tcp_pcb *tcp) { TcpConnection* con = (TcpConnection*)arg; if (con == NULL) { closeTcpConnection(tcp); return ERR_OK; } //if (tcp->state != ESTABLISHED) // return ERR_OK; con->sleep++; err_t res = con->onPoll(); con->checkSelfFree(); //debugf("<staticOnPoll"); return res; }