mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
test: Make esp32 build actually try to instantiate tox.
It doesn't work, because esp32 has too little RAM (320KB). DHT is a 240KB struct, so even just allocating that immediately fails. We'll need to think carefully about trimming that if we ever want this to work on embedded devices.
This commit is contained in:
parent
65d09c9bfb
commit
6a895be0c7
|
@ -244,3 +244,7 @@ int main(int argc, char **argv)
|
||||||
tox_options_free(options);
|
tox_options_free(options);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef CODEWORD_LEN
|
||||||
|
#undef CODEWORD
|
||||||
|
#undef NUM_GROUP_TOXES
|
||||||
|
|
15
other/docker/esp32/BUILD.bazel
Normal file
15
other/docker/esp32/BUILD.bazel
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
load("@rules_cc//cc:defs.bzl", "cc_binary")
|
||||||
|
|
||||||
|
cc_binary(
|
||||||
|
name = "host_main",
|
||||||
|
testonly = 1,
|
||||||
|
srcs = [
|
||||||
|
"host_main.cc",
|
||||||
|
"main/tox_main.cc",
|
||||||
|
"main/tox_main.h",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//c-toxcore/toxcore:tox",
|
||||||
|
"//c-toxcore/toxcore:tox_events",
|
||||||
|
],
|
||||||
|
)
|
|
@ -1,48 +1,32 @@
|
||||||
FROM toxchat/c-toxcore:sources AS src
|
FROM mluis/qemu-esp32:latest
|
||||||
FROM ubuntu:18.04
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
ENV IDF_TARGET=esp32
|
||||||
|
|
||||||
RUN apt-get update && \
|
WORKDIR /root/toxcore
|
||||||
DEBIAN_FRONTEND="noninteractive" apt-get install -y --no-install-recommends \
|
|
||||||
bison \
|
|
||||||
ccache \
|
|
||||||
cmake \
|
|
||||||
flex \
|
|
||||||
git \
|
|
||||||
gperf \
|
|
||||||
libncurses-dev \
|
|
||||||
ninja-build \
|
|
||||||
python \
|
|
||||||
python-cryptography \
|
|
||||||
python-future \
|
|
||||||
python-pip \
|
|
||||||
python-pyparsing \
|
|
||||||
python-serial \
|
|
||||||
python-setuptools \
|
|
||||||
wget \
|
|
||||||
&& apt-get clean \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
ENV ESP32_TARBALL=xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0 \
|
# Build an initial bootstrap hello world just to compile libsodium and other
|
||||||
IDF_PATH="/root/esp/esp-idf" \
|
# system level dependencies.
|
||||||
PATH="/root/esp/esp-idf/tools:/root/esp/xtensa-esp32-elf/bin:$PATH"
|
COPY other/docker/esp32/sdkconfig \
|
||||||
WORKDIR /root/esp
|
other/docker/esp32/CMakeLists.txt \
|
||||||
RUN wget -q https://dl.espressif.com/dl/$ESP32_TARBALL.tar.gz \
|
/root/toxcore/
|
||||||
&& tar zxf $ESP32_TARBALL.tar.gz \
|
COPY other/docker/esp32/bootstrap/ \
|
||||||
&& rm -f $ESP32_TARBALL.tar.gz \
|
/root/toxcore/main/
|
||||||
&& git clone -b v3.3 --recursive --depth=1 --shallow-submodules https://github.com/espressif/esp-idf
|
RUN . /root/esp/esp-idf/export.sh && idf.py build
|
||||||
|
|
||||||
# Build a hello world first, so the OS and libsodium etc. are compiled.
|
# Copy over toxcore sources and build those.
|
||||||
WORKDIR /root/esp/toxcore
|
COPY third_party/cmp/ /root/toxcore/main/third_party/cmp/
|
||||||
COPY other/docker/esp32/CMakeLists.txt /root/esp/toxcore/
|
COPY toxencryptsave/defines.h /root/toxcore/main/toxencryptsave/
|
||||||
COPY other/docker/esp32/hello/ /root/esp/toxcore/main/
|
COPY toxcore/ /root/toxcore/main/toxcore/
|
||||||
RUN idf.py build
|
COPY other/docker/esp32/main/CMakeLists.txt \
|
||||||
|
/root/toxcore/main/
|
||||||
# Then copy over the actual toxcore sources and build those.
|
COPY other/docker/esp32/main/*.cc \
|
||||||
COPY --from=src /src/third_party/cmp/ /root/esp/toxcore/main/third_party/cmp/
|
other/docker/esp32/main/*.h \
|
||||||
COPY --from=src /src/toxencryptsave/defines.h /root/esp/toxcore/main/toxencryptsave/
|
/root/toxcore/main/other/docker/esp32/main/
|
||||||
COPY --from=src /src/toxcore/ /root/esp/toxcore/main/toxcore/
|
RUN touch /root/toxcore/main/CMakeLists.txt \
|
||||||
COPY other/docker/esp32/toxcore/CMakeLists.txt /root/esp/toxcore/main/
|
&& . /root/esp/esp-idf/export.sh && idf.py build
|
||||||
COPY other/docker/esp32/toxcore/toxcore_main.cc /root/esp/toxcore/main/other/docker/esp32/main/
|
|
||||||
RUN idf.py build
|
|
||||||
RUN ls -lh build/toxcore.bin \
|
RUN ls -lh build/toxcore.bin \
|
||||||
&& shasum build/toxcore.bin
|
&& sha512sum build/toxcore.bin
|
||||||
|
RUN /root/flash.sh build/toxcore.bin
|
||||||
|
|
||||||
|
COPY other/docker/esp32/qemu-test /root/toxcore/
|
||||||
|
RUN ["/root/toxcore/qemu-test"]
|
||||||
|
|
4
other/docker/esp32/bootstrap/CMakeLists.txt
Normal file
4
other/docker/esp32/bootstrap/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
idf_component_register(
|
||||||
|
SRCS hello_main.cc
|
||||||
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRES esp_netif lwip)
|
4
other/docker/esp32/bootstrap/hello_main.cc
Normal file
4
other/docker/esp32/bootstrap/hello_main.cc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// Bootstrap main. Only writes hello world. See ../main/ for the real thing.
|
||||||
|
extern "C" void app_main(void) { printf("Hello world!\n"); }
|
2
other/docker/esp32/bootstrap/idf_component.yml
Normal file
2
other/docker/esp32/bootstrap/idf_component.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
dependencies:
|
||||||
|
espressif/libsodium: "==1.0.20"
|
|
@ -1,4 +0,0 @@
|
||||||
set(COMPONENT_SRCS "hello_main.c")
|
|
||||||
set(COMPONENT_ADD_INCLUDEDIRS "")
|
|
||||||
|
|
||||||
register_component()
|
|
|
@ -1,6 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
void app_main(void)
|
|
||||||
{
|
|
||||||
printf("Hello world!\n");
|
|
||||||
}
|
|
3
other/docker/esp32/host_main.cc
Normal file
3
other/docker/esp32/host_main.cc
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#include "main/tox_main.h"
|
||||||
|
|
||||||
|
int main() { tox_main(); }
|
16
other/docker/esp32/main/CMakeLists.txt
Normal file
16
other/docker/esp32/main/CMakeLists.txt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-field-initializers -Wno-format -DMIN_LOGGER_LEVEL=LOGGER_LEVEL_TRACE")
|
||||||
|
|
||||||
|
file(GLOB toxcore_SRCS "toxcore/*.[ch]" "toxcore/*/*.[ch]")
|
||||||
|
set(COMPONENT_SRCS
|
||||||
|
${toxcore_SRCS}
|
||||||
|
other/docker/esp32/main/app_main.cc
|
||||||
|
other/docker/esp32/main/tox_main.cc
|
||||||
|
other/docker/esp32/main/tox_main.h
|
||||||
|
third_party/cmp/cmp.c
|
||||||
|
third_party/cmp/cmp.h
|
||||||
|
toxencryptsave/defines.h)
|
||||||
|
|
||||||
|
idf_component_register(
|
||||||
|
SRCS ${COMPONENT_SRCS}
|
||||||
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRES esp_eth esp_netif lwip)
|
73
other/docker/esp32/main/app_main.cc
Normal file
73
other/docker/esp32/main/app_main.cc
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#include <esp_eth.h>
|
||||||
|
#include <esp_event.h>
|
||||||
|
#include <esp_log.h>
|
||||||
|
#include <esp_netif.h>
|
||||||
|
#include <esp_netif_sntp.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "tox_main.h"
|
||||||
|
|
||||||
|
static const char *MAIN_TAG = "app_main";
|
||||||
|
static constexpr int NTP_TIMEOUT = 60; // 1 minute
|
||||||
|
|
||||||
|
static esp_eth_handle_t eth_handle = nullptr;
|
||||||
|
static esp_netif_t *eth_netif = nullptr;
|
||||||
|
|
||||||
|
static void event_handler(
|
||||||
|
void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
|
||||||
|
{
|
||||||
|
if (event_base == ETH_EVENT) {
|
||||||
|
if (event_id == ETHERNET_EVENT_START) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event_id == ETHERNET_EVENT_STOP) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (event_base == IP_EVENT) {
|
||||||
|
if (event_id == IP_EVENT_ETH_GOT_IP) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void register_ethernet(void)
|
||||||
|
{
|
||||||
|
ESP_ERROR_CHECK(esp_netif_init());
|
||||||
|
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||||
|
esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH();
|
||||||
|
eth_netif = esp_netif_new(&cfg);
|
||||||
|
|
||||||
|
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
||||||
|
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
||||||
|
esp_eth_mac_t *mac = esp_eth_mac_new_openeth(&mac_config);
|
||||||
|
|
||||||
|
esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config);
|
||||||
|
|
||||||
|
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
|
ESP_ERROR_CHECK(esp_eth_driver_install(&config, ð_handle));
|
||||||
|
ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle)));
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
|
||||||
|
ESP_ERROR_CHECK(
|
||||||
|
esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &event_handler, NULL));
|
||||||
|
ESP_ERROR_CHECK(esp_eth_start(eth_handle));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does all the esp32-specific init before running generic tox code.
|
||||||
|
extern "C" void app_main(void)
|
||||||
|
{
|
||||||
|
register_ethernet();
|
||||||
|
|
||||||
|
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("pool.ntp.org");
|
||||||
|
ESP_ERROR_CHECK(esp_netif_sntp_init(&config));
|
||||||
|
|
||||||
|
if (esp_netif_sntp_sync_wait(pdMS_TO_TICKS(NTP_TIMEOUT * 1000)) != ESP_OK) {
|
||||||
|
ESP_LOGE(MAIN_TAG, "failed to update system time within %ds timeout", NTP_TIMEOUT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI(MAIN_TAG, "time is updated: %lld", time(nullptr));
|
||||||
|
|
||||||
|
tox_main();
|
||||||
|
}
|
98
other/docker/esp32/main/tox_main.cc
Normal file
98
other/docker/esp32/main/tox_main.cc
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
#include "../main/tox_main.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "../../../../toxcore/ccompat.h"
|
||||||
|
#include "../../../../toxcore/tox.h"
|
||||||
|
#include "../../../../toxcore/tox_events.h"
|
||||||
|
|
||||||
|
static const char *color(int index)
|
||||||
|
{
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
return "\033"
|
||||||
|
"[35m";
|
||||||
|
case 1:
|
||||||
|
return "\033"
|
||||||
|
"[36m";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "\033"
|
||||||
|
"[0m";
|
||||||
|
}
|
||||||
|
|
||||||
|
static tox_log_cb log_handler;
|
||||||
|
static void log_handler(Tox *tox, Tox_Log_Level level, const char *file, uint32_t line,
|
||||||
|
const char *func, const char *msg, void *user_data)
|
||||||
|
{
|
||||||
|
const int *index = static_cast<const int *>(user_data);
|
||||||
|
const uint16_t udp_port = tox_self_get_udp_port(tox, nullptr);
|
||||||
|
printf("%s#%d (:%d) [%c] %s:%u(%s): %s\n", color(*index), *index, udp_port,
|
||||||
|
tox_log_level_to_string(level)[0], file, static_cast<unsigned int>(line), func, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
using Tox_Options_Ptr = std::unique_ptr<Tox_Options, void (*)(Tox_Options *)>;
|
||||||
|
using Tox_Ptr = std::unique_ptr<Tox, void (*)(Tox *)>;
|
||||||
|
|
||||||
|
void tox_main()
|
||||||
|
{
|
||||||
|
printf("Hello Tox!\n");
|
||||||
|
|
||||||
|
Tox_Options_Ptr opts(tox_options_new(nullptr), tox_options_free);
|
||||||
|
assert(opts != nullptr);
|
||||||
|
|
||||||
|
tox_options_set_ipv6_enabled(opts.get(), false);
|
||||||
|
tox_options_set_local_discovery_enabled(opts.get(), false);
|
||||||
|
|
||||||
|
tox_options_set_log_callback(opts.get(), log_handler);
|
||||||
|
|
||||||
|
Tox_Err_New err;
|
||||||
|
|
||||||
|
int index[] = {0, 1};
|
||||||
|
|
||||||
|
tox_options_set_log_user_data(opts.get(), &index[0]);
|
||||||
|
Tox_Ptr tox0(tox_new(opts.get(), &err), tox_kill);
|
||||||
|
printf("tox_new(#0): %p\n", static_cast<void *>(tox0.get()));
|
||||||
|
|
||||||
|
if (err != TOX_ERR_NEW_OK) {
|
||||||
|
printf("tox_new(#0): %s\n", tox_err_new_to_string(err));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tox_options_set_log_user_data(opts.get(), &index[1]);
|
||||||
|
Tox_Ptr tox1(tox_new(opts.get(), &err), tox_kill);
|
||||||
|
printf("tox_new(#1): %p\n", static_cast<void *>(tox0.get()));
|
||||||
|
|
||||||
|
if (err != TOX_ERR_NEW_OK) {
|
||||||
|
printf("tox_new(#1): %s\n", tox_err_new_to_string(err));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t pk[TOX_PUBLIC_KEY_SIZE];
|
||||||
|
tox_self_get_dht_id(tox0.get(), pk);
|
||||||
|
tox_bootstrap(tox1.get(), "localhost", tox_self_get_udp_port(tox0.get(), nullptr), pk, nullptr);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
tox_self_get_public_key(tox0.get(), pk);
|
||||||
|
tox_friend_add_norequest(tox1.get(), pk, nullptr);
|
||||||
|
|
||||||
|
tox_self_get_public_key(tox1.get(), pk);
|
||||||
|
tox_friend_add_norequest(tox0.get(), pk, nullptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf("bootstrapping and connecting 2 toxes\n");
|
||||||
|
|
||||||
|
while (tox_self_get_connection_status(tox1.get()) == TOX_CONNECTION_NONE
|
||||||
|
|| tox_self_get_connection_status(tox0.get()) == TOX_CONNECTION_NONE) {
|
||||||
|
tox_events_free(tox_events_iterate(tox0.get(), true, nullptr));
|
||||||
|
tox_events_free(tox_events_iterate(tox1.get(), true, nullptr));
|
||||||
|
|
||||||
|
usleep(tox_iteration_interval(tox0.get()) * 1000);
|
||||||
|
usleep(250); // a bit less noise in the log
|
||||||
|
}
|
||||||
|
}
|
6
other/docker/esp32/main/tox_main.h
Normal file
6
other/docker/esp32/main/tox_main.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef TOX_MAIN_H
|
||||||
|
#define TOX_MAIN_H
|
||||||
|
|
||||||
|
void tox_main();
|
||||||
|
|
||||||
|
#endif // TOX_MAIN_H
|
17
other/docker/esp32/qemu-test
Executable file
17
other/docker/esp32/qemu-test
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
qemu-system-xtensa \
|
||||||
|
-nographic \
|
||||||
|
-M esp32 \
|
||||||
|
-m 4 \
|
||||||
|
-drive file=flash.bin,if=mtd,format=raw \
|
||||||
|
-nic user,model=open_eth,hostfwd=tcp::80-:80 \
|
||||||
|
-s |
|
||||||
|
tee qemu.log &
|
||||||
|
|
||||||
|
echo "Waiting for program to complete"
|
||||||
|
while ! grep 'Returned from app_main' qemu.log >/dev/null; do
|
||||||
|
sleep 1
|
||||||
|
done
|
|
@ -1,4 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
docker build -t toxchat/c-toxcore:sources -f other/docker/sources/Dockerfile .
|
|
||||||
docker build -t toxchat/c-toxcore:esp32 -f other/docker/esp32/Dockerfile .
|
docker build -t toxchat/c-toxcore:esp32 -f other/docker/esp32/Dockerfile .
|
||||||
|
|
5
other/docker/esp32/run-host
Executable file
5
other/docker/esp32/run-host
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -eux
|
||||||
|
|
||||||
|
bazel run //c-toxcore/other/docker/esp32:host_main
|
1937
other/docker/esp32/sdkconfig
Normal file
1937
other/docker/esp32/sdkconfig
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -1,12 +0,0 @@
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-field-initializers")
|
|
||||||
|
|
||||||
file(GLOB toxcore_SRCS "toxcore/*.[ch]" "toxcore/*/*.[ch]")
|
|
||||||
set(COMPONENT_SRCS
|
|
||||||
${toxcore_SRCS}
|
|
||||||
other/docker/esp32/main/toxcore_main.cc
|
|
||||||
third_party/cmp/cmp.c
|
|
||||||
third_party/cmp/cmp.h
|
|
||||||
toxencryptsave/defines.h)
|
|
||||||
set(COMPONENT_ADD_INCLUDEDIRS "")
|
|
||||||
|
|
||||||
register_component()
|
|
|
@ -1,14 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "../../../../toxcore/ccompat.h"
|
|
||||||
#include "../../../../toxcore/tox.h"
|
|
||||||
#include "../../../../toxcore/tox_events.h"
|
|
||||||
|
|
||||||
extern "C" void app_main(void)
|
|
||||||
{
|
|
||||||
printf("Hello Tox!\n");
|
|
||||||
|
|
||||||
Tox *tox = tox_new(nullptr, nullptr);
|
|
||||||
tox_events_free(tox_events_iterate(tox, true, nullptr));
|
|
||||||
tox_kill(tox);
|
|
||||||
}
|
|
|
@ -1996,6 +1996,9 @@ static void do_announce(Onion_Client *onion_c)
|
||||||
// Don't send announces to the same node twice. If we don't have many nodes,
|
// Don't send announces to the same node twice. If we don't have many nodes,
|
||||||
// the random selection below may have overlaps. This ensures that we deduplicate
|
// the random selection below may have overlaps. This ensures that we deduplicate
|
||||||
// nodes before sending packets to save some bandwidth.
|
// nodes before sending packets to save some bandwidth.
|
||||||
|
//
|
||||||
|
// TODO(iphydf): Figure out why on esp32, this is necessary for the onion
|
||||||
|
// connection to succeed. This is an optimisation and shouldn't be necessary.
|
||||||
const uint8_t *targets[MAX_ONION_CLIENTS_ANNOUNCE / 2];
|
const uint8_t *targets[MAX_ONION_CLIENTS_ANNOUNCE / 2];
|
||||||
unsigned int targets_count = 0;
|
unsigned int targets_count = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user