Ejemplo n.º 1
0
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);
}