static void altcp_mbedtls_recved(struct altcp_pcb *conn, u16_t len) { u16_t lower_recved; altcp_mbedtls_state_t *state; if (conn == NULL) { return; } state = (altcp_mbedtls_state_t *)conn->state; if (state == NULL) { return; } if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { return; } lower_recved = len; if (lower_recved > state->rx_passed_unrecved) { LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("bogus recved count (len > state->rx_passed_unrecved / %d / %d)", len, state->rx_passed_unrecved)); lower_recved = (u16_t)state->rx_passed_unrecved; } state->rx_passed_unrecved -= lower_recved; altcp_recved(conn->inner_conn, lower_recved); }
void altcp_default_recved(struct altcp_pcb *conn, u16_t len) { if (conn && conn->inner_conn) { altcp_recved(conn->inner_conn, len); } }
/* Call recved for possibly more than an u16_t */ static void altcp_mbedtls_lower_recved(struct altcp_pcb *inner_conn, int recvd_cnt) { while (recvd_cnt > 0) { u16_t recvd_part = (u16_t)LWIP_MIN(recvd_cnt, 0xFFFF); altcp_recved(inner_conn, recvd_part); recvd_cnt -= recvd_part; } }
/** Raw API TCP recv callback */ static err_t smtp_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err) { LWIP_UNUSED_ARG(err); if (p != NULL) { altcp_recved(pcb, p->tot_len); smtp_process(arg, pcb, p); } else { LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_tcp_recv: connection closed by remote host\n")); smtp_close((struct smtp_session*)arg, pcb, SMTP_RESULT_ERR_CLOSED, 0, err); } return ERR_OK; }
/** http client tcp recv callback */ static err_t httpc_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t r) { httpc_state_t* req = (httpc_state_t*)arg; LWIP_UNUSED_ARG(r); if (p == NULL) { httpc_result_t result; if (req->parse_state != HTTPC_PARSE_RX_DATA) { /* did not get RX data yet */ result = HTTPC_RESULT_ERR_CLOSED; } else if ((req->hdr_content_len != HTTPC_CONTENT_LEN_INVALID) && (req->hdr_content_len != req->rx_content_len)) { /* header has been received with content length but not all data received */ result = HTTPC_RESULT_ERR_CONTENT_LEN; } else { /* receiving data and either all data received or no content length header */ result = HTTPC_RESULT_OK; } return httpc_close(req, result, req->rx_status, ERR_OK); } if (req->parse_state != HTTPC_PARSE_RX_DATA) { if (req->rx_hdrs == NULL) { req->rx_hdrs = p; } else { pbuf_cat(req->rx_hdrs, p); } if (req->parse_state == HTTPC_PARSE_WAIT_FIRST_LINE) { u16_t status_str_off; err_t err = http_parse_response_status(req->rx_hdrs, &req->rx_http_version, &req->rx_status, &status_str_off); if (err == ERR_OK) { /* don't care status string */ req->parse_state = HTTPC_PARSE_WAIT_HEADERS; } } if (req->parse_state == HTTPC_PARSE_WAIT_HEADERS) { u16_t total_header_len; err_t err = http_wait_headers(req->rx_hdrs, &req->hdr_content_len, &total_header_len); if (err == ERR_OK) { struct pbuf *q; /* full header received, send window update for header bytes and call into client callback */ altcp_recved(pcb, total_header_len); if (req->conn_settings) { if (req->conn_settings->headers_done_fn) { err = req->conn_settings->headers_done_fn(req, req->callback_arg, req->rx_hdrs, total_header_len, req->hdr_content_len); if (err != ERR_OK) { return httpc_close(req, HTTPC_RESULT_LOCAL_ABORT, req->rx_status, err); } } } /* hide header bytes in pbuf */ q = pbuf_free_header(req->rx_hdrs, total_header_len); p = q; req->rx_hdrs = NULL; /* go on with data */ req->parse_state = HTTPC_PARSE_RX_DATA; } } } if ((p != NULL) && (req->parse_state == HTTPC_PARSE_RX_DATA)) { req->rx_content_len += p->tot_len; if (req->recv_fn != NULL) { /* directly return here: the connection migth already be aborted from the callback! */ return req->recv_fn(req->callback_arg, pcb, p, r); } else { altcp_recved(pcb, p->tot_len); pbuf_free(p); } } return ERR_OK; }