int s2e_web_configure(char buf[], int app_state, int connection_state) { int err; int val; uart_config_data_t data; int telnet_port; chanend c_uart_config = (chanend) ((app_state_t *) app_state)->c_uart_config; chanend c_flash_data = (chanend) ((app_state_t *) app_state)->c_flash; char *err_msg; char *web_form_req; int flash_result; if (!web_server_is_post(connection_state)) return 0; web_form_req = web_server_get_param("form_action", connection_state); if (strcmp(web_form_req, "Get") == 0) { return output_msg(buf, success_msg); } else if (strcmp(web_form_req, "Set") == 0) { val = get_int_param("id", connection_state, &err); if (err) return output_msg(buf, s2e_validation_bad_channel_id); data.channel_id = val; // Received Set request from web page val = get_int_param("pc", connection_state, &err); if (err) return output_msg(buf, s2e_validation_bad_parity_msg); data.parity = val; val = get_int_param("sb", connection_state, &err); if (err) return output_msg(buf, s2e_validation_bad_stop_bits_msg); data.stop_bits = val; val = get_int_param("br", connection_state, &err); if (err) return output_msg(buf, s2e_validation_bad_baudrate_msg); data.baud = val; val = get_int_param("cl", connection_state, &err); if (err) return output_msg(buf, s2e_validation_bad_char_len_msg); data.char_len = val; val = get_int_param("tp", connection_state, &err); if (err) return output_msg(buf, s2e_validation_bad_telnet_port_msg); telnet_port = val; data.polarity = 0; err_msg = s2e_validate_uart_config(&data); if (err_msg) return output_msg(buf, err_msg); err_msg = s2e_validate_telnet_port(data.channel_id, telnet_port); if (err_msg) return output_msg(buf, err_msg); // Do the setting uart_config_data_t *config = uart_get_config(data.channel_id); *config = data; uart_set_config(c_uart_config, &data); // We have to delay the changing of the telnet port until after the // page is rendered so we can use the tcp channel pending_telnet_port_change_id = data.channel_id; pending_telnet_port_change_port = telnet_port; return output_msg(buf, success_msg); } // Set else if (strcmp(web_form_req, "Save") == 0) { // Received Save request from web page send_cmd_to_flash_thread(c_flash_data, UART_CONFIG, FLASH_CMD_SAVE); for(int i = 0; i < NUM_UART_CHANNELS; i++) { uart_config_data_t *data1 = uart_get_config(i); send_data_to_flash_thread(c_flash_data, data1); } flash_result = get_flash_access_result(c_flash_data); if (flash_result == S2E_FLASH_OK) { return output_msg(buf, success_msg); } else { return output_msg(buf, error_msg); } } // Save else if (strcmp(web_form_req, "Restore") == 0) { uart_config_data_t data1; int telnet_port1; // Received Restore request from web page send_cmd_to_flash_thread(c_flash_data, UART_CONFIG, FLASH_CMD_RESTORE); flash_result = get_flash_access_result(c_flash_data); if (flash_result == S2E_FLASH_OK) { for (int i = 0; i < NUM_UART_CHANNELS; i++) { get_data_from_flash_thread(c_flash_data, &data1, &telnet_port1); uart_config_data_t *config = uart_get_config(data1.channel_id); *config = data1; uart_set_config(c_uart_config, &data1); // We have to delay the changing of the telnet port until after the // page is rendered so we can use the tcp channel pending_telnet_port_change_id = data1.channel_id; pending_telnet_port_change_port = telnet_port1; } return output_msg(buf, success_msg); } else { return output_msg(buf, error_msg); } } // Restore else { // invalid request return output_msg(buf, error_msg); } return 0; }
static void execute_command(chanend c_xtcp, chanend c_uart_config, chanend c_flash_data, xtcp_connection_t *conn, connection_state_t *st) { int out_channel_id; int flash_result; uart_config_data_t data1; int telnet_port1; switch (st->cmd) { case TELNET_CONFIG_CMD_SET: st->err = s2e_validate_uart_config(&st->config_in); if (st->err) { xtcp_init_send(c_xtcp, conn); return; } st->err = s2e_validate_telnet_port(st->config_in.channel_id, st->telnet_port_in); if (st->err) { xtcp_init_send(c_xtcp, conn); return; } uart_config_data_t *config = uart_get_config(st->config_in.channel_id); *config = st->config_in; uart_set_config(c_uart_config, &st->config_in); telnet_to_uart_set_port(c_xtcp, st->config_in.channel_id, st->telnet_port_in); out_channel_id = st->config_in.channel_id; break; case TELNET_CONFIG_CMD_GET: st->err = s2e_validate_channel_id(st->config_in.channel_id); if (st->err) { xtcp_init_send(c_xtcp, conn); return; } out_channel_id = st->config_in.channel_id; break; case TELNET_CONFIG_CMD_SAVE: // Received Save request from web page send_cmd_to_flash_thread(c_flash_data, UART_CONFIG, FLASH_CMD_SAVE); for(int i = 0; i < NUM_UART_CHANNELS; i++) { uart_config_data_t *data1 = uart_get_config(i); send_data_to_flash_thread(c_flash_data, data1); } flash_result = get_flash_access_result(c_flash_data); if (flash_result != S2E_FLASH_OK) { st->err = flash_err_msg; xtcp_init_send(c_xtcp, conn); return; } out_channel_id = 7; break; case TELNET_CONFIG_CMD_RESTORE: // Received Restore request from web page send_cmd_to_flash_thread(c_flash_data, UART_CONFIG, FLASH_CMD_RESTORE); flash_result = get_flash_access_result(c_flash_data); if (flash_result == S2E_FLASH_OK) { for (int i = 0; i < NUM_UART_CHANNELS; i++) { get_data_from_flash_thread(c_flash_data, &data1, &telnet_port1); uart_config_data_t *config = uart_get_config(data1.channel_id); *config = data1; uart_set_config(c_uart_config, &data1); telnet_to_uart_set_port(c_xtcp, data1.channel_id, telnet_port1); } } else { st->err = flash_err_msg; xtcp_init_send(c_xtcp, conn); return; } out_channel_id = 7; break; default: st->err = invalid_cmd_msg; xtcp_init_send(c_xtcp, conn); return; break; } st->config_out = *uart_get_config(out_channel_id); st->telnet_port_out = telnet_to_uart_get_port(out_channel_id); st->cmd_out = st->cmd; st->sending_ack = 1; xtcp_init_send(c_xtcp, conn); }