void http_xtcp_handler(chanend tcp_svr, xtcp_connection_t *conn, chanend page_svr, chanend led_svr) { // Ignore events that are not directly relevant to http switch (conn->event) { case XTCP_IFUP: case XTCP_IFDOWN: case XTCP_ALREADY_HANDLED: return; default: break; } if (conn->local_port == 80) { switch (conn->event) { case XTCP_NEW_CONNECTION: httpd_init_state(tcp_svr, conn); break; case XTCP_RECV_DATA: httpd_recv(tcp_svr, conn, page_svr, led_svr); break; case XTCP_SENT_DATA: case XTCP_REQUEST_DATA: case XTCP_RESEND_DATA: httpd_handle_send_request(tcp_svr, conn, page_svr, led_svr); break; case XTCP_CLOSED: case XTCP_TIMED_OUT: case XTCP_ABORTED: httpd_free_state(conn); break; default: break; } conn->event = XTCP_ALREADY_HANDLED; } }
// HTTP event handler void tcp_handle_event(chanend tcp_svr, xtcp_connection_t *conn) { // We have received an event from the TCP stack, so respond // appropriately // Ignore events that are not directly relevant to http switch (conn->event) { case XTCP_IFUP: { xtcp_ipconfig_t ipconfig; xtcp_get_ipconfig(tcp_svr, &ipconfig); #if IPV6 unsigned short a; unsigned int i; int f; xtcp_ipaddr_t *addr = &ipconfig.ipaddr; printstr("IPV6 Address = ["); for(i = 0, f = 0; i < sizeof(xtcp_ipaddr_t); i += 2) { a = (addr->u8[i] << 8) + addr->u8[i + 1]; if(a == 0 && f >= 0) { if(f++ == 0) { printstr("::"); } } else { if(f > 0) { f = -1; } else if(i > 0) { printstr(":"); } printhex(a); } } printstrln("]"); #else printstr("IP Address: "); printint(ipconfig.ipaddr[0]);printstr("."); printint(ipconfig.ipaddr[1]);printstr("."); printint(ipconfig.ipaddr[2]);printstr("."); printint(ipconfig.ipaddr[3]);printstr("\n"); #endif } return; case XTCP_IFDOWN: case XTCP_ALREADY_HANDLED: return; default: break; } // Check if the connection is a http connection if (conn->local_port == 80) { switch (conn->event) { case XTCP_NEW_CONNECTION: httpd_init_state(tcp_svr, conn); break; case XTCP_RECV_DATA: httpd_recv(tcp_svr, conn); break; case XTCP_SENT_DATA: case XTCP_REQUEST_DATA: case XTCP_RESEND_DATA: httpd_send(tcp_svr, conn); break; case XTCP_TIMED_OUT: case XTCP_ABORTED: case XTCP_CLOSED: httpd_free_state(conn); break; default: // Ignore anything else break; } conn->event = XTCP_ALREADY_HANDLED; } //// return; }