linux_connect.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "esp_err.h"
  7. #include "esp_netif.h" // esp-netif
  8. #include "tapio.h" // esp-netif's driver side
  9. #include "lwip/tapif.h" // esp-netif's network stack side
  10. #include "esp_log.h"
  11. #if CONFIG_EXAMPLE_CONNECT_WAIT_FOR_IP
  12. #include "esp_event.h"
  13. #include "freertos/FreeRTOS.h"
  14. #include "freertos/task.h"
  15. #include "freertos/event_groups.h"
  16. static const char *TAG = "linux_connect";
  17. static EventGroupHandle_t s_events;
  18. static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
  19. {
  20. xEventGroupSetBits(s_events, 1);
  21. }
  22. #endif // CONFIG_EXAMPLE_CONNECT_WAIT_FOR_IP
  23. #define TAP0_GOT_IP (0x1234)
  24. esp_err_t example_connect(void)
  25. {
  26. #if CONFIG_EXAMPLE_CONNECT_LWIP_TAPIF
  27. // configure linux tapio
  28. esp_netif_driver_ifconfig_t driver_cfg = {
  29. .handle = tapio_create(),
  30. .transmit = tapio_output,
  31. };
  32. // configure lwip netif for the tapif
  33. struct esp_netif_netstack_config stack_cfg = {
  34. .lwip = {
  35. .init_fn = lwip_tapif_init,
  36. .input_fn = lwip_tapif_input,
  37. }
  38. };
  39. // configure inherent esp-netif parameters
  40. esp_netif_ip_info_t ip_info = {};
  41. esp_netif_flags_t netif_flags = (ESP_NETIF_FLAG_EVENT_IP_MODIFIED | ESP_NETIF_FLAG_AUTOUP);
  42. #if !CONFIG_EXAMPLE_CONNECT_WAIT_FOR_IP
  43. ip_info.ip.addr = ipaddr_addr(CONFIG_EXAMPLE_CONNECT_TAPIF_IP_ADDR);
  44. ip_info.netmask.addr = ipaddr_addr(CONFIG_EXAMPLE_CONNECT_TAPIF_NETMASK);
  45. ip_info.gw.addr = ipaddr_addr(CONFIG_EXAMPLE_CONNECT_TAPIF_GW);
  46. #else
  47. netif_flags |= ESP_NETIF_DHCP_CLIENT;
  48. #endif
  49. esp_netif_inherent_config_t base_cfg = {
  50. .if_key = "TAP",
  51. .ip_info = &ip_info,
  52. .flags = netif_flags,
  53. .get_ip_event = TAP0_GOT_IP,
  54. .route_prio = 100
  55. };
  56. // put all configs together
  57. esp_netif_config_t cfg = {
  58. .base = &base_cfg,
  59. .driver = &driver_cfg,
  60. .stack = &stack_cfg
  61. };
  62. // create the interface and attach it to the tapio-handle
  63. esp_netif_t *tap_netif = esp_netif_new(&cfg);
  64. esp_netif_attach(tap_netif, driver_cfg.handle);
  65. #if CONFIG_EXAMPLE_CONNECT_WAIT_FOR_IP
  66. ESP_LOGI(TAG, "Waiting for IP addresses...");
  67. esp_netif_action_connected(tap_netif, 0, 0, 0);
  68. ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, TAP0_GOT_IP, event_handler, NULL));
  69. s_events = xEventGroupCreate();
  70. xEventGroupWaitBits(s_events, 1, pdFALSE, pdFALSE, portMAX_DELAY);
  71. esp_netif_get_ip_info(tap_netif, &ip_info);
  72. ESP_LOGI(TAG, "Assigned IP address:"IPSTR ",", IP2STR(&ip_info.ip));
  73. #endif // CONFIG_EXAMPLE_CONNECT_WAIT_FOR_IP
  74. #endif // EXAMPLE_CONNECT_LWIP_TAPIF
  75. return ESP_OK;
  76. }